#!/usr/bin/perl -wT
#
# filter fuer den morgenstern-kopierer Sharp AR-NC5J
# fuegt die sonderinformationen in den druckdatenstrom ein
#
# pcl mit umhuellendem pjl (HP Printer Job Language)
# filter fuer CUPS /usr/lib/cups/filter/
#
# Autor: Dr. Rohlfs, Universitaetsbibliothek Tuebingen, 2008
# rz (at) ub.uni-tuebingen.de
#
# Modifikationen zum CUPS-Filter: Rezes, 2011, dire (at) fa.uni-tuebingen.de

use strict;

# hier kann die uebergebene PIN fuer den druckertreiber veraendert werden:
# es muessen genau 5 ziffern vergeben werden
my $pin = '22222';

# Angeben falls der User nicht der Systemuser sein soll.
my $fixeduser = '';

#############################################################################
# Begin des Programmes
#############################################################################
use Sys::Hostname;
use Getopt::Std;
use POSIX;    # strftime
use Fcntl;    # sysopen

my $tmpdir = '/tmp';

# tainted, daher alle Umgebungsvariablen loeschen:
%ENV = ();
$ENV{PATH} = "/usr/bin:/usr/local/bin:/bin:/sbin:/usr/sbin";

# argumente prozessieren.
# Auf BSD werden folgende Argumente vom lpr-system uebergeben:
# -w132 -l66 -i0 -n USERNAME -h HOSTNAME
our ($VERSION) = '$Revision: 1.2 $' =~ /([\d\.]+)/;


#my $printer = $ARGV[0];
my $job = $ARGV[0];
my $userarg = $ARGV[1];
my $title = $ARGV[2];
my $copies = $ARGV[3];
my $optionsraw = $ARGV[4];
my $filename = $ARGV[5];

my %options;
my @optionlines = split(" ",$optionsraw);
my ($key,$val);
foreach my $line (@optionlines) {
        ($key,$val) = split("=",$line);
        $options{$key} = $val;
}

if (length($options{'job-billing'}) == 5 && $options{'job-billing'} eq $options{'job-billing'}+1-1 ) { $pin = $options{'job-billing'}; }


# jobname = dateiname in der ersten spalte im druckerdisplay
# username = benutzername in der zweiten spalte im druckerdisplay
#@PJL SET SPOOLTIME="Wed, 19 Mar 2008 17:40:59 +0100"
my $kopf = <<'EOF';
@PJL JOB NAME="UNIX"
@PJL SET DRIVERNAME="Ammerbau  Ebene 3"
@PJL SET JOBNAME=
@PJL SET SPOOLTIME=
@PJL SET USERNAME=
@PJL SET NOTIFYJOBEND=OFF
@PJL SET SUSPEND=CONFIDENTIAL
@PJL SET SUSPENDKEY=
@PJL SET OUTTRAY=TRAY1
@PJL SET MEDIASOURCE=AUTOMATIC
@PJL SET DUPLEX=OFF
@PJL SET JOBBOOKLET=OFF
@PJL SET BINDING=SHORTEDGE
@PJL SET ORIENTATION=PORTRAIT
@PJL SET MARGINSHIFT=0
@PJL SET PAPERTYPE=NONE
@PJL SET INTERLEAVE=OFF
@PJL SET RET=ON
@PJL SET JOBSTAPLE=STAPLENON
@PJL SET PUNCH=OFF
@PJL SET ECONOMODE=OFF
@PJL SET RESOLUTION=600
@PJL SET REVERSEIMAGE=OFF
EOF

# meine parameter festlegen:
#my $jobname = strftime( "%H:%M:%S", localtime );
my $user = $fixeduser || $userarg || hostname();
my $zeit = strftime( "%a, %d %b %Y %H:%M:%S %z", localtime );
my $jobname = $job || hostname();
$jobname =~ /^(\w+)/;
$jobname = $1;

# werte in den Kopf einfuegen:
$kopf =~ s/USERNAME=/$&"$user"/;
$kopf =~ s/SPOOLTIME=/$&"$zeit"/;
$kopf =~ s/JOBNAME=/$&"$jobname"/;
$kopf =~ s/SUSPENDKEY=/$&"$pin"/;

# zwischendatei fuer ghostscript anlegen:
my $psinN = "$tmpdir/lp.if.$$.ps";

# stdin in datei umkopieren
{
    my $psinF;    # dateihandler fuer postscript-input
    sysopen( $psinF, $psinN, O_WRONLY | O_CREAT )
        or die "E Schreiben ps-input-datei $psinN $!";
    my $buf;      # zwischenpuffer
    my $n;        # gelesene Zeichen pro lesevorgang
    my $N;        # Summe der gelesenen Zeichen

    # eingabestrom wird in der datei eingefroren:
    while ( $n = sysread( STDIN, $buf, 1024 * 1024 ) ) {
        $N += $n;
        syswrite( $psinF, $buf, $n ) or die "cannot write $psinN $!";
    }

    # sollte nicht vorkommen:
    if ( not defined $n ) { warn "fehler beim einlesen von stdin $!" }
    close $psinF;

    # eine leere datei kann nicht gewuenscht sein:
    if ( not $N ) {    # leere datei!
        unlink $psinN;
        warn "datei ist leer";
        exit 0;
    }
}

# mit ghostscript in pcl-code umwandeln!
my $ghostP;
{
    my $ghost_cmd
        = "gs -q -sDEVICE=ljet4pjl -r600x600 -sPrintQuality=presentation "
        . " -sOutputFile=- -sPAPERSIZE=a4 -dNOPAUSE -dBATCH "
        . "-sPJLJob=$jobname $psinN";
    open $ghostP, " $ghost_cmd |" or die "cannot open gs $ghost_cmd $!";
}


# erste zeile = pjl-kopfzeile. Unverarbeitet ausgeben:
print scalar <$ghostP>;

# danach den kopf einfuegen
print $kopf;

# den rest einfach ausgeben!
while (<$ghostP>) {print}

unlink $psinN;

