#!@PERL@ # This script updates the printer list of the driver XML file of # Gutenprint (db/source/driver/gutenprint.xml in foomatic-db package) # according to the file src/foomatic/foomatic-printermap of the source # tarball of Gutenprint 5.0.x or later. # # Remarks: # # - Manually added printer entries will not be removed. They drop out # to the beginning of the printer list during the update. The same # happens to printers which are removed from the new foomatic-printermap # # - All printers of foomatic-printermap are put to the end of the list, # the order of foomatic-printermap is preserved. # # - The user will be informed by screen messages if the new # foomatic-printermap contains new printers which were neither in the # previous foomatic-printermap nor under the manually added printers. # # - A printer which was added manually before and is in foomatic-printermap # now will be removed from the list of manually added printers and added # to the list of printers from foomatic-printermap. #use strict; # Read out the program name with which we were called, but discard the path $0 =~ m!/([^/]+)\s*$!; my $progname = $1; my $debug = 0; my ($opt_f, $opt_g, $opt_h); use Getopt::Std; getopts("f:g:h") or $opt_h = 1; if ($opt_h) { print " foomatic-printermap-to-gutenprint-xml [ -f ] \ [ -g ] -f : File src/foomatic/foomatic-printermap of Gutenprint source tarball (4.2.x or later). Default is foomatic-printermap in the current directory -g : File gutenprint.xml whose printer list should be updated. Default is the gutenprint.xml of the Foomatic database currently in use. This program updates the printer list of the driver XML file of Gutenprint (db/source/driver/gutenprint.xml in foomatic-db package) according to the file src/foomatic/foomatic-printermap of the source tarball of Gutenprint 5.0.x or later. "; exit 0; } # Determine gutenprint.xml file my $gutenprintxmlfile = $opt_g; if (!$gutenprintxmlfile) { use Foomatic::Defaults; $gutenprintxmlfile = "$libdir/db/source/driver/gutenprint.xml"; } # Determine foomatic-printermap file my $foomaticprintermapfile = $opt_f; if (!$foomaticprintermapfile) { $foomaticprintermapfile = "./foomatic-printermap"; } # Read list of printer IDs from Gutenprint's foomatic-printermap open PM, "< $foomaticprintermapfile" or die "Cannot read $foomaticprintermapfile!\n"; my @printermap = ; close PM; (s/^\s*\S+\s+\S+\s+(\S+)\s*$/$1/) foreach @printermap; #print $#printermap; # Read gutenprint.xml open GPX, "< $gutenprintxmlfile" or die "Cannot read $gutenprintxmlfile!\n"; my $gutenprintxml = join("", ); close GPX; # Remove printer list #$gutenprintxml =~ s!(<\s*printers\s*>).*(\n\s*<\s*/\s*printers\s*>)!$1$2!s; # Mark beginning of printer list from foomatic-printermap before deleting # these printer entries $gutenprintxml =~ s:\n :XXXXXXXXXX:s; # Remove only those printers which are in foomatic-printermap. We # re-add them in the next step, this way we have all printers of # foomatic-printermap together and in the order of # foomatic-printermap, and we have all manually added printers in the # beginning of the list, before the printers of foomatic-printermap # are listed. print STDERR "Removing old printer entries "; foreach my $printer (@printermap) { print STDERR "."; $gutenprintxml =~ s:\s*<\!\-\-[^<>]*?\-\->\s*\s*\s*$printer\s*.*?::s or $gutenprintxml =~ s:\s*\s*\s*$printer\s*.*?::s or print STDERR "\n\nNew printer: $printer\n\n"; } print STDERR "\n\n"; # Insert comment to mark the part of the list set up manually $gutenprintxml =~ s:(\n\s*<\s*printers\s*>)\n\s*:$1:s; $gutenprintxml =~ s:(\n\s*<\s*printers\s*>):$1\n :s; # Insert comment to mark the part of the list generated from # foomatic-printermap $gutenprintxml =~ s:\n ::s; $gutenprintxml =~ s:\n ::s; $gutenprintxml =~ s:XXXXXXXXXX:\n :s; $gutenprintxml =~ s:(\n\s*<\s*/\s*printers\s*>):\n $1:s; # Insert printers of foomatic-printermap to the end of the list print STDERR "Inserting printer entries of foomatic-printermap "; foreach my $printer (@printermap) { print STDERR "."; $gutenprintxml =~ s:(\n\s*<\s*/\s*printers\s*>):\n \n $printer\n $1:s; } print STDERR "\n\n"; open GPX, "> $gutenprintxmlfile" or die "Cannot write $gutenprintxmlfile!\n"; print GPX $gutenprintxml; close GPX; exit 0;