summaryrefslogtreecommitdiffstats
path: root/perl-install/printer/gimp.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/printer/gimp.pm')
-rw-r--r--perl-install/printer/gimp.pm412
1 files changed, 412 insertions, 0 deletions
diff --git a/perl-install/printer/gimp.pm b/perl-install/printer/gimp.pm
new file mode 100644
index 000000000..6d92d5fe3
--- /dev/null
+++ b/perl-install/printer/gimp.pm
@@ -0,0 +1,412 @@
+package printer::gimp;
+
+use strict;
+use run_program;
+use common;
+use printer::common;
+use printer::data;
+use printer::cups;
+
+# ------------------------------------------------------------------
+# GIMP-print related stuff
+# ------------------------------------------------------------------
+
+sub configure {
+ my ($printer, $queue) = @_;
+ # Do we have files to treat?
+ my @configfilenames = findconfigfiles();
+ return 1 if $#configfilenames < 0;
+ # There is no system-wide config file, treat every user's config file
+ foreach my $configfilename (@configfilenames) {
+ # Load GIMP's printer config file
+ my $configfilecontent = readconfigfile($configfilename);
+ # Update local printer queues
+ foreach my $queue (keys(%{$printer->{configured}})) {
+ # Check if we have a PPD file
+ if (! -r "$::prefix/etc/foomatic/$queue.ppd") {
+ if (-r "$::prefix/etc/cups/ppd/$queue.ppd") {
+ # If we have a PPD file in the CUPS config dir, link to it
+ run_program::rooted($::prefix,
+ "ln", "-sf",
+ "/etc/cups/ppd/$queue.ppd",
+ "/etc/foomatic/$queue.ppd");
+ } elsif (-r "$::prefix/usr/share/postscript/ppd/$queue.ppd") {
+ # Check PPD directory of GPR, too
+ run_program::rooted
+ ($::prefix,
+ "ln", "-sf",
+ "/usr/share/postscript/ppd/$queue.ppd",
+ "/etc/foomatic/$queue.ppd");
+ } else {
+ # No PPD file at all? We cannot set up this printer
+ next;
+ }
+ }
+ # Add the printer entry
+ if (!isprinterconfigured ($queue, $configfilecontent)) {
+ # Remove the old printer entry
+ $configfilecontent =
+ removeprinter($queue, $configfilecontent);
+ # Add the new printer entry
+ $configfilecontent =
+ makeprinterentry($printer, $queue,
+ $configfilecontent);
+ }
+ }
+ # Default printer
+ if ($printer->{DEFAULT}) {
+ if ($configfilecontent !~ /^\s*Current\-Printer\s*:/m) {
+ $configfilecontent =~
+ s/\n/\nCurrent-Printer: $printer->{DEFAULT}\n/s;
+ } else {
+ $configfilecontent =~ /^\s*Current\-Printer\s*:\s*(\S+)\s*$/m;
+ if (!isprinterconfigured ($1, $configfilecontent)) {
+ $configfilecontent =~
+ s/(Current\-Printer\s*:\s*)\S+/$1$printer->{DEFAULT}/;
+ }
+ }
+ }
+ # Write back GIMP's printer configuration file
+ writeconfigfile($configfilename, $configfilecontent);
+ }
+ return 1;
+}
+
+sub addcupsremoteto {
+ my ($printer, $queue) = @_;
+ # Do we have files to treat?
+ my @configfilenames = findconfigfiles();
+ return 1 if $#configfilenames < 0;
+ my @printerlist = printer::cups::get_remote_queues();
+ my $ppdfile = "";
+ if (($printer->{SPOOLER} eq "cups") &&
+ ((-x "$::prefix/usr/bin/curl") || (-x "$::prefix/usr/bin/wget"))) {
+ foreach my $listentry (@printerlist) {
+ next if !($listentry =~ /^([^\|]+)\|([^\|]+)$/);
+ my $q = $1;
+ next if $q ne $queue;
+ my $server = $2;
+ # Remove server name from queue name
+ $q =~ s/^([^@]*)@.*$/$1/;
+ if (-x "$::prefix/usr/bin/wget") {
+ eval(run_program::rooted
+ ($::prefix, "/usr/bin/wget", "-O",
+ "/etc/foomatic/$queue.ppd",
+ "http://$server:631/printers/$q.ppd"));
+ } else {
+ eval(run_program::rooted
+ ($::prefix, "/usr/bin/curl", "-o",
+ "/etc/foomatic/$queue.ppd",
+ "http://$server:631/printers/$q.ppd"));
+ }
+ # Does the file exist and is it not an error message?
+ if ((-r "$::prefix/etc/foomatic/$queue.ppd") &&
+ (cat_("$::prefix/etc/foomatic/$queue.ppd") =~
+ /^\*PPD-Adobe/)) {
+ $ppdfile = "/etc/foomatic/$queue.ppd";
+ } else {
+ unlink ("$::prefix/etc/foomatic/$queue.ppd");
+ return 0;
+ }
+ }
+ } else {
+ return 1;
+ }
+ # There is no system-wide config file, treat every user's config file
+ foreach my $configfilename (@configfilenames) {
+ # Load GIMP's printer config file
+ my $configfilecontent = readconfigfile($configfilename);
+ # Add the printer entry
+ if (!isprinterconfigured ($queue, $configfilecontent)) {
+ # Remove the old printer entry
+ $configfilecontent =
+ removeprinter($queue, $configfilecontent);
+ # Add the new printer entry
+ $configfilecontent =
+ makeprinterentry($printer, $queue,
+ $configfilecontent);
+ }
+ # Write back GIMP's printer configuration file
+ writeconfigfile($configfilename, $configfilecontent);
+ }
+ return 1;
+}
+
+sub removeprinterfrom {
+ my ($printer, $queue) = @_;
+ # Do we have files to treat?
+ my @configfilenames = findconfigfiles();
+ return 1 if $#configfilenames < 0;
+ # There is no system-wide config file, treat every user's config file
+ foreach my $configfilename (@configfilenames) {
+ # Load GIMP's printer config file
+ my $configfilecontent = readconfigfile($configfilename);
+ # Remove the printer entry
+ $configfilecontent =
+ removeprinter($queue, $configfilecontent);
+ # Write back GIMP's printer configuration file
+ writeconfigfile($configfilename, $configfilecontent);
+ }
+ return 1;
+}
+
+sub removelocalprintersfrom {
+ my ($printer) = @_;
+ # Do we have files to treat?
+ my @configfilenames = findconfigfiles();
+ return 1 if $#configfilenames < 0;
+ # There is no system-wide config file, treat every user's config file
+ foreach my $configfilename (@configfilenames) {
+ # Load GIMP's printer config file
+ my $configfilecontent = readconfigfile($configfilename);
+ # Remove the printer entries
+ foreach my $queue (keys(%{$printer->{configured}})) {
+ $configfilecontent =
+ removeprinter($queue, $configfilecontent);
+ }
+ # Write back GIMP's printer configuration file
+ writeconfigfile($configfilename, $configfilecontent);
+ }
+ return 1;
+}
+
+sub makeprinterentry {
+ my ($printer, $queue, $configfile) = @_;
+ # Make printer's section
+ $configfile = addprinter($queue, $configfile);
+ # Load PPD file
+ my $ppd = cat_("$::prefix/etc/foomatic/$queue.ppd");
+ # Is the printer configured with GIMP-Print?
+ my $gimpprintqueue = 0;
+ my $gimpprintdriver = "ps2";
+ if ($ppd =~ /CUPS\s*\+\s*GIMP\s*\-\s*Print/im) {
+ # Native CUPS driver
+ $gimpprintqueue = 1;
+ $ppd =~ /\s*\*ModelName:\s*\"(\S+)\"\s*$/im;
+ $gimpprintdriver = $1;
+ } elsif ($ppd =~ /Foomatic\s*\+\s*gimp\s*\-\s*print/im) {
+ # GhostScript + Foomatic driver
+ $gimpprintqueue = 1;
+ $ppd =~
+ /'idx'\s*=>\s*'ev\/gimp-print-((escp2|pcl|bjc|lexmark)\-\S*)'/im;
+ $gimpprintdriver = $1;
+ }
+ if ($gimpprintqueue) {
+ # Get the paper size from the PPD file
+ if ($ppd =~ /^\s*\*DefaultPageSize:\s*(\S+)\s*$/m) {
+ my $papersize = $1;
+ $configfile = removeentry($queue,
+ "Media-Size", $configfile);
+ $configfile = addentry($queue,
+ "Media-Size: $papersize", $configfile);
+ }
+ $configfile = removeentry($queue,
+ "PPD-File:", $configfile);
+ $configfile = addentry($queue,
+ "PPD-File:", $configfile);
+ $configfile = removeentry($queue,
+ "Driver:", $configfile);
+ $configfile = addentry($queue,
+ "Driver: $gimpprintdriver", $configfile);
+ $configfile = removeentry($queue,
+ "Destination:", $configfile);
+ $configfile = addentry($queue,
+ "Destination: /usr/bin/$printer::data::lprcommand{$printer->{SPOOLER}{print_command}} -P $queue -o raw", $configfile);
+ } else {
+ $configfile = removeentry($queue,
+ "PPD-File:", $configfile);
+ $configfile = addentry($queue,
+ "PPD-File: /etc/foomatic/$queue.ppd", $configfile);
+ $configfile = removeentry($queue,
+ "Driver:", $configfile);
+ $configfile = addentry($queue,
+ "Driver: ps2", $configfile);
+ $configfile = removeentry($queue,
+ "Destination:", $configfile);
+ $configfile = addentry($queue,
+ "Destination: /usr/bin/$printer::data::lprcommand{$printer->{SPOOLER}{print_command}} -P $queue", $configfile);
+ }
+ return $configfile;
+}
+
+sub findconfigfiles {
+ my @configfilenames;
+ push (@configfilenames, ".gimp-1.2/printrc") if -d "$::prefix/usr/lib/gimp/1.2";
+ push (@configfilenames, ".gimp-1.3/printrc") if -d "$::prefix/usr/lib/gimp/1.3";
+ my @filestotreat;
+ local *PASSWD;
+ open PASSWD, "< $::prefix/etc/passwd" or die "Cannot read /etc/passwd!\n";
+ local $_;
+ while (<PASSWD>) {
+ chomp;
+ if (/^([^:]+):[^:]*:([^:]+):([^:]+):[^:]*:([^:]+):[^:]*$/) {
+ my ($username, $uid, $gid, $homedir) = ($1, $2, $3, $4);
+ if ((($uid == 0) || ($uid >= 500)) && ($username ne "nobody")) {
+ foreach my $file (@configfilenames) {
+ my $dir = "$homedir/$file";
+ $dir =~ s,/[^/]*$,,;
+ next if (-f $dir) && (! -d $dir);
+ if (! -d "$::prefix$dir") {
+ run_program::rooted($::prefix,
+ "/bin/mkdir", $dir)
+ or next;
+ run_program::rooted($::prefix,
+ "/bin/chown", "$uid.$gid", $dir)
+ or next;
+ }
+ if (! -f "$::prefix$homedir/$file") {
+ local *F;
+ open F, "> $::prefix$homedir/$file" or next;
+ print F "#PRINTRCv1 written by GIMP-PRINT 4.2.2 - 13 Sep 2002\n";
+ close F;
+ run_program::rooted($::prefix,
+ "/bin/chown", "$uid.$gid",
+ "$homedir/$file")
+ or next;
+ }
+ push (@filestotreat, "$homedir/$file");
+ }
+ }
+ }
+ }
+ @filestotreat;
+}
+
+sub readconfigfile {
+ my ($file) = @_;
+ local *F;
+ open F, "< $::prefix$file" or return "";
+ my $filecontent = join("", <F>);
+ close F;
+ return $filecontent;
+}
+
+sub writeconfigfile {
+ my ($file, $filecontent) = @_;
+ local *F;
+ open F, "> $::prefix$file" or return 0;
+ print F $filecontent;
+ close F;
+ return 1;
+}
+
+sub addentry {
+ my ($section, $entry, $filecontent) = @_;
+ my $sectionfound = 0;
+ my $entryinserted = 0;
+ my @lines = split("\n", $filecontent);
+ foreach (@lines) {
+ if (!$sectionfound) {
+ if (/^\s*Printer\s*:\s*($section)\s*$/) {
+ $sectionfound = 1;
+ }
+ } else {
+ if (!/^\s*$/ && !/^\s*;/) { #-#
+ $_ = "$entry\n$_";
+ $entryinserted = 1;
+ last;
+ }
+ }
+ }
+ if ($sectionfound && !$entryinserted) {
+ push(@lines, $entry);
+ }
+ return join ("\n", @lines);
+}
+
+sub addprinter {
+ my ($section, $filecontent) = @_;
+ my $entryinserted = 0;
+ my @lines = split("\n", $filecontent);
+ foreach (@lines) {
+ if (/^\s*Printer\s*:\s*($section)\s*$/) {
+ # section already there, nothing to be done
+ return $filecontent;
+ }
+ }
+ return $filecontent . "\nPrinter: $section";
+}
+
+sub removeentry {
+ my ($section, $entry, $filecontent) = @_;
+ my $sectionfound = 0;
+ my $done = 0;
+ my @lines = split("\n", $filecontent);
+ foreach (@lines) {
+ $_ = "$_\n";
+ next if $done;
+ if (!$sectionfound) {
+ if (/^\s*Printer\s*:\s*($section)\s*$/) {
+ $sectionfound = 1;
+ }
+ } else {
+ if (/^\s*Printer\s*:\s*.*\s*$/) { # Next section
+ $done = 1;
+ } elsif (/^\s*$entry/) {
+ $_ = "";
+ $done = 1;
+ }
+ }
+ }
+ return join ("", @lines);
+}
+
+sub removeprinter {
+ my ($section, $filecontent) = @_;
+ my $sectionfound = 0;
+ my $done = 0;
+ my @lines = split("\n", $filecontent);
+ foreach (@lines) {
+ $_ = "$_\n";
+ next if $done;
+ if (!$sectionfound) {
+ if (/^\s*Printer\s*:\s*($section)\s*$/) {
+ $_ = "";
+ $sectionfound = 1;
+ }
+ } else {
+ if (/^\s*Printer\s*:\s*.*\s*$/) { # Next section
+ $done = 1;
+ } else {
+ $_ = "";
+ }
+ }
+ }
+ return join ("", @lines);
+}
+
+sub isprinterconfigured {
+ my ($queue, $filecontent) = @_;
+ my $sectionfound = 0;
+ my $done = 0;
+ my $drivernotps2 = 0;
+ my $ppdfileset = 0;
+ my $nonrawprinting = 0;
+ my @lines = split("\n", $filecontent);
+ foreach (@lines) {
+ last if $done;
+ if (!$sectionfound) {
+ if (/^\s*Printer\s*:\s*($queue)\s*$/) {
+ $sectionfound = 1;
+ }
+ } else {
+ if (/^\s*Printer\s*:\s*.*\s*$/) { # Next section
+ $done = 1;
+ } elsif (/^\s*Driver:\s*(\S+)\s*$/) {
+ $drivernotps2 = ($1 ne "ps2");
+ } elsif (/^\s*PPD\-File:\s*(\S+)\s*$/) {
+ $ppdfileset = 1;
+ } elsif (/^\s*Destination:\s*(\S+.*)$/) {
+ $nonrawprinting = ($1 !~ /\-o\s*raw/);
+ }
+ }
+ }
+ return 0 if $done && !$sectionfound;
+ return 1 if $ppdfileset || $drivernotps2 || $nonrawprinting;
+ return 0;
+}
+
+
+# ------------------------------------------------------------------
+
+1;