Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
brgenml1cupswrapper / opt / brother / Printers / BrGenML1 / cupswrapper / brother_lpdwrapper_BrGenML1
Size: Mime:
#! /usr/bin/perl
#
# CUPS filter for  Brother laser printers
#   
#   Copyright (C) 2014 Brother. Industries, Ltd.
# 
#                                    Ver2.00

# 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
#


#use Cwd 'realpath';


$ppdcust = "";

#   log functions

$LOGFILE="/tmp/br_cupswrapper_ml1.log";
$LOGLEVEL=7;
$DEBUG=0;
$LOG_LATESTONLY=1;
$DEVICEURILOCK=1;
$LPD_DEBUG=0;

if ( $DEBUG > 0 ){
  $LPD_DEBUG=2;
}

$width=-1;
$height=-1;

#my $basedir = Cwd::realpath ($0);
my $basedir = `readlink $0`;
if ( $basedir eq '' ){
    $basedir = `realpath $0`;
}
chomp($basedir);

$basedir =~ s/$PRINTER\/cupswrapper\/.*$/$PRINTER\//g;


%units = ( pt   => \&pt2dot, 
	   mm   => \&mm2dot, 
	   inch => \&inch2dot, 
	   in   => \&inch2dot, 
	   cm   => \&cm2dot,
	   m    => \&m2dot,
	   ft   => \&ft2dot
	   );



$LPDCONFIGEXE="brprintconflsr3";

my $INPUT_PS   = "/tmp/br_cupswrapper_ml1_input.ps";
my $OUTPUT_PRN = "/tmp/br_cupswrapper_ml1_output.prn";


#    main

logprint( 0 , "START\n");


my $cmdoptions=$ARGV[4];
my $PPD = $ENV{PPD};
my $PRINTER=$basedir;
my $CUPSINPUT='';
if ( @ARGV >= 6 ){
    $CUPSINPUT=$ARGV[7];
}


$PRINTER =~ s/^\/opt\/.*\/Printers\///g;
$PRINTER =~ s/\/cupswrapper//g;
$PRINTER =~ s/\///g;

for  (my $i = 0 ; $i < @ARGV ; $i ++){
    logprint( 0 , "ARG$i      = $ARGV[$i]\n");
}

logprint( 0 , "PRINTER   = $PRINTER \n");
logprint( 0 , "PPD       = $PPD\n");
logprint( 0 , "BASEPATH  = $basedir\n");

logprint( 0 , "export PPD=$PPD\n");  
logprint( 0 , "$0 \"$ARGV[1]\"  \"$ARGV[2]\"  \"$ARGV[3]\"  \"$ARGV[4]\"  \"$ARGV[5]\"  \"$ARGV[6]\"\n");  


my $LPDFILTER   =$basedir."/lpd/filter_".$PRINTER;

logprint( 0 , "\n");


 %vendor_commandline = (
  'Resolution=300'                   => {"opt"=>"-res" , "val"=>"300"},
  'Resolution=600'                   => {"opt"=>"-res" , "val"=>"600"},
  'Resolution=600x300'               => {"opt"=>"-res" , "val"=>"600x300"},
  'Resolution=1200'                  => {"opt"=>"-res" , "val"=>"1200"},
  'Resolution=HQ1200'                => {"opt"=>"-res" , "val"=>"HQ1200"},
  'Resolution=HQ1200A'               => {"opt"=>"-res" , "val"=>"HQ1200A"},
  'Resolution=HQ1200B'               => {"opt"=>"-res" , "val"=>"HQ1200B"},
  'PaperSource=Manual'               => {"opt"=>"-ps" , "val"=>"MANUAL"},
  'PaperSource=MPTray'               => {"opt"=>"-ps" , "val"=>"MP"},
  'PaperSource=Tray1'                => {"opt"=>"-ps" , "val"=>"T1"},
  'PaperSource=Tray2'                => {"opt"=>"-ps" , "val"=>"T2"},
  'PaperSource=Tray3'                => {"opt"=>"-ps" , "val"=>"T3"},
  'PaperSource=Tray4'                => {"opt"=>"-ps" , "val"=>"T4"},
  'PaperSource=Tray5'                => {"opt"=>"-ps" , "val"=>"T5"},
  'PaperSource=AutoSelect'           => {"opt"=>"-ps" , "val"=>"AUTO"},
  'Duplex=Simplex'                   => {"opt"=>"-dx" , "val"=>"OFF"},
  'Duplex=Duplex'                    => {"opt"=>"-dx" , "val"=>"ON"},
  'DuplexType=Long'                  => {"opt"=>"-dx" , "val"=>"ON" , "opt2"=>"-dxt" , "val2"=>"LONG"},
  'DuplexType=Short'                 => {"opt"=>"-dx" , "val"=>"ON" , "opt2"=>"-dxt" , "val2"=>"SHORT"},
  'PaperType=A4'                     => {"opt"=>"-pt" , "val"=>"A4"},
  'PaperType=FanFoldGermanLegal'     => {"opt"=>"-pt" , "val"=>"FOLIO"},
  'PaperType=210x270mm'              => {"opt"=>"-pt" , "val"=>"A4L"},
  'PaperType=Letter'                 => {"opt"=>"-pt" , "val"=>"LT"},
  'PaperType=Legal'                  => {"opt"=>"-pt" , "val"=>"LGL"},
  'PaperType=Exective'               => {"opt"=>"-pt" , "val"=>"EXE"},
  'PaperType=Executive'              => {"opt"=>"-pt" , "val"=>"EXE"},
  'PaperType=A5'                     => {"opt"=>"-pt" , "val"=>"A5"},
  'PaperType=A6'                     => {"opt"=>"-pt" , "val"=>"A6"},
  'PaperType=B5'                     => {"opt"=>"-pt" , "val"=>"JISB5"},
  'PaperType=ISOB5'                  => {"opt"=>"-pt" , "val"=>"B5"},
  'PaperType=JISB5'                  => {"opt"=>"-pt" , "val"=>"JISB5"},
  'PaperType=B6'                     => {"opt"=>"-pt" , "val"=>"JISB6"},
  'PaperType=ISOB6'                  => {"opt"=>"-pt" , "val"=>"B6"},
  'PaperType=JISB6'                  => {"opt"=>"-pt" , "val"=>"JISB6"},
  'PaperType=C5'                     => {"opt"=>"-pt" , "val"=>"C5"},
  'PaperType=EnvC5'                  => {"opt"=>"-pt" , "val"=>"C5"},
  'PaperType=DL'                     => {"opt"=>"-pt" , "val"=>"DL"},
  'PaperType=EnvDL'                  => {"opt"=>"-pt" , "val"=>"DL"},
  'PaperType=Com10'                  => {"opt"=>"-pt" , "val"=>"COM-10"},
  'PaperType=COM10'                  => {"opt"=>"-pt" , "val"=>"COM-10"},
  'PaperType=Com-10'                 => {"opt"=>"-pt" , "val"=>"COM-10"},
  'PaperType=COM-10'                 => {"opt"=>"-pt" , "val"=>"COM-10"},
  'PaperType=EnvCOM10'               => {"opt"=>"-pt" , "val"=>"COM-10"},
  'PaperType=Env10'                  => {"opt"=>"-pt" , "val"=>"COM-10"},
  'PaperType=Monarch'                => {"opt"=>"-pt" , "val"=>"MONARCH"},
  'PaperType=EnvMonarch'             => {"opt"=>"-pt" , "val"=>"MONARCH"},
  'PaperType=4x6'                    => {"opt"=>"-pt" , "val"=>"PC4X6"},
  'PaperType=Postcard'               => {"opt"=>"-pt" , "val"=>"POSTCARD"},
  'PaperType=DoublePostcardRotated'  => {"opt"=>"-pt" , "val"=>"DHAGAKI"},
  'PaperType=DHagaki'                => {"opt"=>"-pt" , "val"=>"DHAGAKI"},
  'PaperType=EnvYou4'                => {"opt"=>"-pt" , "val"=>"ENVYOU4"},
  'PaperType=EnvChou3'               => {"opt"=>"-pt" , "val"=>"ENVCHOU3"},
  'PaperType=EnvChou4'               => {"opt"=>"-pt" , "val"=>"ENVCHOU4"},
  'PaperType=3x5'                    => {"opt"=>"-pt" , "val"=>"3X5"},
  'PaperType=195x270mm'               => {"opt"=>"-pt" , "val"=>"195x270mm"},
  'PaperType=184x260mm'               => {"opt"=>"-pt" , "val"=>"184x260mm"},
  'PaperType=197x273mm'               => {"opt"=>"-pt" , "val"=>"197x273mm"},
  'PaperType=Custom\..*'             => {"opt"=>"-pt" , "val"=>"CUSTOM0"},
  'PaperType=CUSTOM1'                => {"opt"=>"-pt" , "val"=>"CUSTOM1"},
  'PaperType=CUSTOM2'                => {"opt"=>"-pt" , "val"=>"CUSTOM2"},
  'PaperType=CUSTOM3'                => {"opt"=>"-pt" , "val"=>"CUSTOM3"},
  'PaperType=CUSTOM4'                => {"opt"=>"-pt" , "val"=>"CUSTOM4"},
  'PaperType=CUSTOM5'                => {"opt"=>"-pt" , "val"=>"CUSTOM5"},
  'PaperType=CUSTOM6'                => {"opt"=>"-pt" , "val"=>"CUSTOM6"},
  'PaperType=CUSTOM7'                => {"opt"=>"-pt" , "val"=>"CUSTOM7"},
  'PaperType=CUSTOM8'                => {"opt"=>"-pt" , "val"=>"CUSTOM8"},
  'PaperType=CUSTOM9'                => {"opt"=>"-pt" , "val"=>"CUSTOM9"},
  'Media=PlainPaper'                 => {"opt"=>"-md" , "val"=>"PLAIN"},
  'Media=ThinPaper'                  => {"opt"=>"-md" , "val"=>"THIN"},
  'Media=ThickPaper'                 => {"opt"=>"-md" , "val"=>"THICK"},
  'Media=ThickerPaper'               => {"opt"=>"-md" , "val"=>"THICKER"},
  'Media=BondPaper'                  => {"opt"=>"-md" , "val"=>"BOND"},
  'Media=Transparencies'             => {"opt"=>"-md" , "val"=>"TRANS"},
  'Media=Envelopes'                  => {"opt"=>"-md" , "val"=>"ENV"},
  'Media=Env.Thick'                  => {"opt"=>"-md" , "val"=>"ENV-THICK"},
  'Media=Env.Thin'                   => {"opt"=>"-md" , "val"=>"ENV-THIN"},
  'Media=Recycled'                   => {"opt"=>"-md" , "val"=>"RECYCLED"},
  'Sleep=PrinterDefault'             => {"opt"=>"-sp" , "val"=>"PRINTER"},
);




  %DefaultResolution = (
  "optionname" => 'DefaultResolution'   , 
  "optionlist" => {
     '300dpi'                        => {"opt"=>"-res" , "val"=>"300"},
     '600dpi'                        => {"opt"=>"-res" , "val"=>"600"},
     '600x300dpi'                    => {"opt"=>"-res" , "val"=>"600x300"},
     '1200dpi'                       => {"opt"=>"-res" , "val"=>"1200"},
     'HQ1200dpi'                     => {"opt"=>"-res" , "val"=>"HQ1200"},
     '1200x600dpi'                   => {"opt"=>"-res" , "val"=>"HQ1200A"},
     '2400x600dpi'                   => {"opt"=>"-res" , "val"=>"HQ1200B"},
  }
 ) ;
  %DefaultPageSize = (
  "optionname" => 'DefaultPageSize'   , 
  "optionlist" => {
     'A4'                            => {"opt"=>"-pt" , "val"=>"A4"},
     'FanFoldGermanLegal'            => {"opt"=>"-pt" , "val"=>"FOLIO"},
     '210x270mm'                     => {"opt"=>"-pt" , "val"=>"A4L"},
     'Letter'                        => {"opt"=>"-pt" , "val"=>"LT"},
     'Legal'                         => {"opt"=>"-pt" , "val"=>"LGL"},
     'Executive'                     => {"opt"=>"-pt" , "val"=>"EXE"},
     'A5'                            => {"opt"=>"-pt" , "val"=>"A5"},
     'A6'                            => {"opt"=>"-pt" , "val"=>"A6"},
     'B5'                            => {"opt"=>"-pt" , "val"=>"JISB5"},
     'ISOB5'                         => {"opt"=>"-pt" , "val"=>"B5"},
     'JISB5'                         => {"opt"=>"-pt" , "val"=>"JISB5"},
     'B6'                            => {"opt"=>"-pt" , "val"=>"JISB6"},
     'ISOB6'                         => {"opt"=>"-pt" , "val"=>"B6"},
     'JISB6'                         => {"opt"=>"-pt" , "val"=>"JISB6"},
     'C5'                            => {"opt"=>"-pt" , "val"=>"C5"},
     'EnvC5'                         => {"opt"=>"-pt" , "val"=>"C5"},
     'DL'                            => {"opt"=>"-pt" , "val"=>"DL"},
     'EnvDL'                         => {"opt"=>"-pt" , "val"=>"DL"},
     'Env10'                         => {"opt"=>"-pt" , "val"=>"COM-10"},
     'EnvMonarch'                    => {"opt"=>"-pt" , "val"=>"MONARCH"},
     'Monarch'                       => {"opt"=>"-pt" , "val"=>"MONARCH"},
     '4x6'                           => {"opt"=>"-pt" , "val"=>"PC4X6"},
     'Postcard'                      => {"opt"=>"-pt" , "val"=>"POSTCARD"},
     'DoublePostcardRotated'         => {"opt"=>"-pt" , "val"=>"DHAGAKI"},
     'DHagaki'                       => {"opt"=>"-pt" , "val"=>"DHAGAKI"},
     'EnvYou4'                       => {"opt"=>"-pt" , "val"=>"ENVYOU4"},
     'EnvChou3'                      => {"opt"=>"-pt" , "val"=>"ENVCHOU3"},
     'EnvChou4'                      => {"opt"=>"-pt" , "val"=>"ENVCHOU4"},
     '3x5'                           => {"opt"=>"-pt" , "val"=>"3X5"},
     '195x270mm'                     => {"opt"=>"-pt" , "val"=>"195x270mm"},
     '184x260mm'                     => {"opt"=>"-pt" , "val"=>"184x260mm"},
     '197x273mm'                     => {"opt"=>"-pt" , "val"=>"197x273mm"},
     'Custom\..*'                    => {"opt"=>"-pt" , "val"=>"CUSTOM0"},
     'CUSTOM1'                       => {"opt"=>"-pt" , "val"=>"CUSTOM1"},
     'CUSTOM2'                       => {"opt"=>"-pt" , "val"=>"CUSTOM2"},
     'CUSTOM3'                       => {"opt"=>"-pt" , "val"=>"CUSTOM3"},
     'CUSTOM4'                       => {"opt"=>"-pt" , "val"=>"CUSTOM4"},
     'CUSTOM5'                       => {"opt"=>"-pt" , "val"=>"CUSTOM5"},
     'CUSTOM6'                       => {"opt"=>"-pt" , "val"=>"CUSTOM6"},
     'CUSTOM7'                       => {"opt"=>"-pt" , "val"=>"CUSTOM7"},
     'CUSTOM8'                       => {"opt"=>"-pt" , "val"=>"CUSTOM8"},
     'CUSTOM9'                       => {"opt"=>"-pt" , "val"=>"CUSTOM9"},
     'Envelopes'                     => {"opt"=>"-md" , "val"=>"ENV"},
  }
 ) ;
  %DefaultBrMediaType = (
  "optionname" => 'DefaultBrMediaType'   , 
  "optionlist" => {
     'PLAIN'                         => {"opt"=>"-md" , "val"=>"PLAIN"},
     'THIN'                          => {"opt"=>"-md" , "val"=>"THIN"},
     'THICK'                         => {"opt"=>"-md" , "val"=>"THICK"},
     'THICKERPAPER2'                 => {"opt"=>"-md" , "val"=>"THICKER"},
     'BOND'                          => {"opt"=>"-md" , "val"=>"BOND"},
     'TRANSPARENCIES'                => {"opt"=>"-md" , "val"=>"TRANS"},
     'ENV'                           => {"opt"=>"-md" , "val"=>"ENV"},
     'ENVTHICK'                      => {"opt"=>"-md" , "val"=>"ENV-THICK"},
     'ENVTHIN'                       => {"opt"=>"-md" , "val"=>"ENV-THIN"},
     'RECYCLED'                      => {"opt"=>"-md" , "val"=>"RECYCLED"},
  }
 ) ;
  %DefaultInputSlot = (
  "optionname" => 'DefaultInputSlot'   , 
  "optionlist" => {
     'MANUAL'                        => {"opt"=>"-ps" , "val"=>"MANUAL"},
     'MPTRAY'                        => {"opt"=>"-ps" , "val"=>"MP"},
     'TRAY1'                         => {"opt"=>"-ps" , "val"=>"T1"},
     'TRAY2'                         => {"opt"=>"-ps" , "val"=>"T2"},
     'TRAY3'                         => {"opt"=>"-ps" , "val"=>"T3"},
     'TRAY4'                         => {"opt"=>"-ps" , "val"=>"T4"},
     'TRAY5'                         => {"opt"=>"-ps" , "val"=>"T5"},
     'AUTO'                          => {"opt"=>"-ps" , "val"=>"AUTO"},
  }
 ) ;
  %DefaultDuplex = (
  "optionname" => 'DefaultDuplex'   , 
  "optionlist" => {
     'DuplexTumble'                  => {"opt"=>"-dx" , "val"=>"ON" , "opt2"=>"-dxt" , "val2"=>"SHORT"},
     'DuplexNoTumble'                => {"opt"=>"-dx" , "val"=>"ON" , "opt2"=>"-dxt" , "val2"=>"LONG"},
     'None'                          => {"opt"=>"-dx" , "val"=>"OFF"},
  }
 ) ;
  %DefaultTonerSaveMode = (
  "optionname" => 'DefaultTonerSaveMode'   , 
  "optionlist" => {
     'OFF'                           => {"opt"=>"-ts" , "val"=>"OFF"},
     'ON'                            => {"opt"=>"-ts" , "val"=>"ON"},
  }
 ) ;
  %DefaultSleep = (
  "optionname" => 'DefaultSleep'   , 
  "optionlist" => {
     'PrinterDefault'                => {"opt"=>"-sp" , "val"=>"PRINTER"},
     '2minutes'                      => {"opt"=>"-sp" , "val"=>"2"},
     '10minutes'                     => {"opt"=>"-sp" , "val"=>"10"},
     '30minutes'                     => {"opt"=>"-sp" , "val"=>"30"},
  }
 ) ;
 %numeric_option = (
  "Sleep"     => {"opt"=>"-sp" , "val"=>"*"},
);
 %initial_configuration = (
   "-res" =>  "600"    ,
   "-ps"  =>  "AUTO"   ,
   "-dx"  =>  "OFF"    ,
   "-dxt" =>  "LONG"   ,
   "-pt"  =>  "A4"     ,
   "-md"  =>  "PLAIN"  ,
   "-cp"  =>  "1"      ,
   "-sp"  =>  "PRINTER",
   "-ts"  =>  "OFF"    ,
 );
 %ppddefaultslist = (
    "DefaultResolution"    => \%DefaultResolution,
    "DefaultPageSize"      => \%DefaultPageSize,
    "DefaultBrMediaType"   => \%DefaultBrMediaType,
    "DefaultInputSlot"     => \%DefaultInputSlot,
    "DefaultDuplex"        => \%DefaultDuplex,
    "DefaultTonerSaveMode" => \%DefaultTonerSaveMode,
    "DefaultSleep"         => \%DefaultSleep
  );
 %mediaoptlist = (
    "DefaultPageSize"      => \%DefaultPageSize,
    "DefaultBrMediaType"   => \%DefaultBrMediaType,
    "DefaultInputSlot"     => \%DefaultInputSlot,
    "DefaultDuplex"        => \%DefaultDuplex,
  );



my $LATESTINFO="/tmp/".$PRINTER."_latest_print_info";
unlink $LATESTINFO;
`touch $LATESTINFO`;



my $TEMPRC = "/tmp/br".$PRINTER."rc_".$$;


`cp  $basedir/inf/br${PRINTER}rc  $TEMPRC`;
$ENV{BRPRINTERRCFILE} = $TEMPRC;

logprint( 0 , "TEMPRC    = $TEMPRC\n");

$LOCKFILE="/tmp/$PRINTER"."_lf_".$ENV{DEVICE_URI};

if ( $DEVICEURILOCK == 1){
   open (FILE , "+> $LOCKFILE");
   flock(FILE , 2);
}


$ENV{LPD_DEBUG} = $LPD_DEBUG;
$ENV{PS}=1;

$ENV{BRPAPERWIDTH}  = $width;
$ENV{BRPAPERHEIGHT} = $height;



my  %lpr_options = &set_options ($PPD , $cmdoptions );

&exec_lpdconfig ( $basedir ,$PRINTER , \%lpr_options );

    logprint( 2, "\n");
if ( $DEBUG == 0 ){
    $command = "cat $CUPSINPUT |  $LPDFILTER";
    logprint( 2 , "$command\n");
    system("$command");
}
elsif ($DEBUG == 1 ){
    $command = "cat $CUPSINPUT > $INPUT_PS && cat $INPUT_PS |".
	       "$LPDFILTER > $OUTPUT_PRN";

    logprint( 2,  "export BRPAPERWIDTH=$ENV{BRPAPERWIDTH}\n");
    logprint( 2,  "export BRPAPERHEIGHT=$ENV{BRPAPERHEIGHT}\n");
    logprint( 2,  "export PPD=$ENV{PPD}\n");
    logprint( 2,  "export BRPRINTERRCFILE=$LATESTINFO\n");
    logprint( 2,  "export LPD_DEBUG=$ENV{LPD_DEBUG}\n");
    logprint( 2,  "export PS=$ENV{PS}\n");

    logprint( 2, "cat $INPUT_PS | $LPDFILTER > $OUTPUT_PRN \n");
    system("$command 2> /tmp/br_cupswrapper_ml1_lpderr");
    system("cat $OUTPUT_PRN");

    logprint( 2, "$command\n");

}
elsif ($DEBUG > 1 ){
    $command = "cat $CUPSINPUT > $INPUT_PS && cat $INPUT_PS |".
	       "$LPDFILTER > $OUTPUT_PRN";

    logprint( 2,  "export BRPAPERWIDTH=$ENV{BRPAPERWIDTH}\n");
    logprint( 2,  "export BRPAPERHEIGHT=$ENV{BRPAPERHEIGHT}\n");
    logprint( 2,  "export PPD=$ENV{PPD}\n");
    logprint( 2,  "export BRPRINTERRCFILE=$LATESTINFO\n");
    logprint( 2,  "export LPD_DEBUG=$ENV{LPD_DEBUG}\n");
    logprint( 2,  "export PS=$ENV{PS}\n");

    logprint( 2, "cat $INPUT_PS | $LPDFILTER > $OUTPUT_PRN \n");
    system("$command 2> /tmp/br_cupswrapper_ml1_lpderr");
    print "\0";

}


`mv  "$TEMPRC"   "$LATESTINFO"`;
`echo "\n\nCUSTOM PAGE SIZE ${width}x${height}" >> $LATESTINFO`;
#unlink  $TEMPRC;


if ( $DEVICEURILOCK == 1 ){
    close (FILE);
}


exit 0;

#-----------------------------------------------------------

sub logprint  {
    ($level , $data) =  @_;
    if ($DEBUG != 0 ){
	if ($LOG_LATESTONLY == 1){
	    open (LOG , '>'.$LOGFILE) or return 0;
	    $LOG_LATESTONLY = 0;
	}
	else{
	    open (LOG , '>>'.$LOGFILE) or return 0;
	}
	if ( $level < $LOGLEVEL){
	    print LOG $data;
	}
	close (LOG);
    }
}


#
#   set options to @cmdopt table
#


sub set_option_table {
    ($table_ref ,$key, $value, $lpr_options_ref) = @_;
    my %table = %$table_ref;
    my %lpr_opt = %$lpr_options_ref;

    if ( exists ($table{$key})){
	my $cmdref = $table{$key};
	my $opt = $cmdref->{opt};
	my $val = $cmdref->{val};
	if (exists($lpr_opt{$opt})){
	    $lpr_options_ref->{$opt} = $val;
	    logprint( 2 ,   "$opt  <=  $lpr_options_ref->{$opt}  : ($value)\n");

            if ( $opt eq "-pt" && $val eq "CUSTOM0" ){
		$ppdcust = $value;
	    }

	}
        if ( exists ($cmdref->{opt2})){
	  my $opt = $cmdref->{opt2};
	  my $val = $cmdref->{val2};
	  if (exists($lpr_opt{$opt})){
	      $lpr_options_ref->{$opt} = $val;
	      logprint( 2 ,   "$opt  <=  $lpr_options_ref->{$opt}  : ($value)\n");

              if ( $opt eq "-pt" && $val eq "CUSTOM0" ){
		  $ppdcust = $value;
	      }

	  }
        }





    }
}
sub set_option_table_n {
    ($table_ref ,$key, $value , $lpr_options) = @_;
    my %table = %$table_ref;
    if ( exists ($table{$key})){
	($table{$key})->{val} = $value;
	&set_option_table (\%table , $key , ""  ,$lpr_options);
    }
}


#
#   Custom paper
#

sub pt2dot{
    (my $xi, my $yi) = @_;
    my $xo = $xi * 600 / 72;
    my $yo = $yi * 600 / 72;
    return (int ($xo) , int ($yo) );
}
sub mm2dot{
    (my $xi, my $yi) = @_;
    my $xo = $xi * 6000 / 254;
    my $yo = $yi * 6000 / 254;
    return (int ($xo) , int ($yo) );
}
sub inch2dot{
    (my $xi, my $yi) = @_;
    my $xo = $xi * 600;
    my $yo = $yi * 600;
    return (int ($xo) , int ($yo) );
}
sub cm2dot{
    (my $xi, my $yi) = @_;
    my $xo = $xi * 60000 / 254;
    my $yo = $yi * 60000 / 254;
    return (int ($xo) , int ($yo) );
}
sub m2dot{
    (my $xi, my $yi) = @_;
    my $xo = $xi * 6000000 / 254;
    my $yo = $yi * 6000000 / 254;
    return (int ($xo) , int ($yo) );
}
sub ft2dot{
    (my $xi, my $yi) = @_;
    my $xo = $xi * 600 * 12;
    my $yo = $yi * 600 * 12;
    return (int ($xo) , int ($yo) );
}



sub check_custom_paper {
    my $x = 0;
    my $y = 0;
    my $unitfunc;
    my $unit = '';
    my $ssize = '';

    (my $PPD , my $lpr_options_ref) = @_;

    if ( $lpr_options_ref->{'-pt'} eq "CUSTOM0" ){

	foreach (keys %units){

	    if ( $ppdcust =~ /[0-9]$_$/) {
		logprint( 2 ,   "HIT $_\n");
		$unit = $_;
		$unitfunc = $units{$_};
	    }
	}
	$ssize = $ppdcust;
	$ssize =~ s/^Custom\.//g;
	$ssize =~ s/$unit$//g;


	my @psiz = split (/x/,$ssize);
	($x , $y) = &$unitfunc ( $psiz[0] ,$psiz[1]);

	return ($x , $y);
    }
    elsif ( $lpr_options_ref->{'-pt'} =~  /CUSTOM[1-9]/ ){

	my $tmp = '*PaperDimension '."$lpr_options_ref->{'-pt'}";
	my $ssize = `grep \"$tmp\" $PPD`;
	chomp($ssize);
	$ssize =~ s/\"$//;
	$ssize =~ s/^.*\"//;
	my @psiz = split (/ /,$ssize);
	($x , $y) = &pt2dot ( $psiz[0] ,$psiz[1]);
	return ($x , $y);
    }
    return ("{Undefined}" , "{Undefined}");
}



#
#   get options from PPD and command-line arguments
#
sub set_options {
    ($PPD , $cmdoptions) =  @_;
    
    my %cmdopt = ();
    
    
    #   get command line options 

    foreach(split (/ /,$cmdoptions)) {
	my @eachcmdopt = split (/=/,$_);
	$cmdopt{$eachcmdopt[0]} = $eachcmdopt[1] ;
    }
    
    
    #get PPD options

    my @ppddefaults = `grep '^*Default' $PPD`;
    my %ppdopt = ();

    foreach(@ppddefaults){
	chomp();
	my $label = $_;
	$label =~ s/^\*//g;
	$label =~ s/: .*$//g;
	my $value = $_;
	$value =~ s/^.*: //g;
	$ppdopt{$label} = $value;
    }
    

    my  %lpr_options = %initial_configuration;
    
    
    #set ppd options

    logprint( 2 ,   "\nSET PPD OPTIONS\n");
    foreach(keys %ppdopt){
	my $option_name  =  $_ ;
	my $option_value =  $ppdopt{$_};
	my $ppdoptdb_ref =  $ppddefaultslist{$option_name};
	
	$list = $ppdoptdb_ref->{optionlist}; 
	my @key = (keys %$list);

	foreach(@key){
	    my $tmp = '^'.$_.'$';
	    if ( $option_value  =~  /$tmp/){
		&set_option_table( $list , $_ , $option_value, \%lpr_options);
	    }

	}
    }
    
    #set Vendor options (string)
    
    logprint( 2 ,   "\nSET VENDOR COMMAND OPTIONS\n");
    foreach(keys %cmdopt){
	my $option_name_value  =  $_  . "=" .$cmdopt{$_};
	my $option_value = $cmdopt{$_};

        foreach(keys %vendor_commandline){
            my $tmp=  '^'.$_.'$';
	    if ( $option_name_value =~ /$tmp/){
		&set_option_table( \%vendor_commandline,
			   $_, 
			   $option_value ,
			   \%lpr_options);
	    }
        }
    }
    
    logprint( 2 ,   "\nSET PPD CMD OPTIONS\n");
    
    foreach(keys %cmdopt){
	my $option_name  =  "Default" . $_;
	my $option_value =  $cmdopt{$_ };
	my $ppdoptdb_ref =  $ppddefaultslist{$option_name};
	
	$list = $ppdoptdb_ref->{optionlist}; 


	foreach(keys %$list){
	    my $tmp=  '^'.$_.'$';
            if ( $option_value =~ /$tmp/ ){
	       &set_option_table( $list,
			   $_, 
                           $option_value,
			   \%lpr_options);
            }
        }
    }
    
    #set Vendor options (numeric)
    
    logprint( 2 ,   "\nSET VENDOR NUMERIC COMMAND OPTIONS\n");

    foreach(keys %cmdopt){
	my $option_name  =  $_ ;
	my $n_value      =  $cmdopt{$_} ;
	
	&set_option_table_n( \%numeric_option , 
			     $option_name  ,
			     $n_value,
			     \%lpr_options);

    }
    #set MEDIA extension options    

    logprint( 2 ,   "\nSET MEDIA (STANDARD) COMMAND OPTIONS\n");

    foreach my $option (split( /,/ , $cmdopt{media})){

	foreach my $cur_optlist (keys %mediaoptlist){
	    $cur_opttbl = $cur_optlist ->{optionlist};
            foreach (keys %$cur_opttbl ){

              my $tmp =  '^'.$_.'$';
	      if ( $option =~ /$tmp/ ){
		  &set_option_table( $cur_opttbl ,
				     $_,
                                     $option,
				     \%lpr_options);
	      }
	    }
        }
     }

    
    ($width , $height) = check_custom_paper ($PPD,
					     \%lpr_options);
    if ( $width ne "{Undefined}" &&  $height ne "{Undefined}" ){
	$ENV{BRPAPERWIDTH} = ${width};
        $ENV{BRPAPERHEIGHT} = ${height};
	logprint( 0 , "\nCUSTOM PAPER x=$width y=$height\n\n");
    }

    return     %lpr_options;
}


#exec lpd config

sub exec_lpdconfig {
    (my $basedir , my $PRINTER , my $lpr_options_ref) =  @_;

    my $lpddir = $basedir;
    my %lpr_options = %$lpr_options_ref;

    $lpddir = $basedir."/lpd/";
    my $lpdconf = $lpddir.'/'.$LPDCONFIGEXE;

    
    while(($op , $val) = each(%lpr_options)){
        my $lpdconf_command = "$lpdconf -P $PRINTER $op $val";
	logprint( 0 ,   "$lpdconf_command\n");
	`$lpdconf_command`;
    }

}