#! /usr/bin/perl
#
# CUPS filter for  Brother ink printers
#   
#   Copyright (C) 2020 Brother. Industries, Ltd.  All Rights Reserved
# 
#                                    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_ink.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";
$LPDCONFIGEXE="brprintconf_";

my $INPUT_PS   = "/tmp/br_cupswrapper_ink_input.ps";
my $OUTPUT_PRN = "/tmp/br_cupswrapper_ink_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\/brother\///g;
$PRINTER =~ s/\/bin\/.*$//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;
#my $LPDFILTER   =$basedir."/lpd/filter_".$PRINTER;
my $LPDFILTER   =$basedir."lpd/filter_".$PRINTER;

logprint( 0 , "\n");


 %vendor_commandline = (
  'PageSize=A3'                     => {"opt"=>"-pt" , "val"=>"A3"},
  'PageSize=BrA3_B_S'               => {"opt"=>"-pt" , "val"=>"BrA3_B_S"},
  'PageSize=B4_S'                   => {"opt"=>"-pt" , "val"=>"B4_S"},
  'PageSize=Tabloid_S'              => {"opt"=>"-pt" , "val"=>"Tabloid_S"},
  'PageSize=BrLedger_B_B'           => {"opt"=>"-pt" , "val"=>"BrLedger_B_B"},
  'PageSize=A4'                     => {"opt"=>"-pt" , "val"=>"A4"},
  'PageSize=BrA4_B'                 => {"opt"=>"-pt" , "val"=>"BrA4_B"},
  'PageSize=Letter'                 => {"opt"=>"-pt" , "val"=>"Letter"},
  'PageSize=BrLetter_B'             => {"opt"=>"-pt" , "val"=>"BrLetter_B"},
  'PageSize=Legal'                  => {"opt"=>"-pt" , "val"=>"Legal"},
  'PageSize=Folio'                  => {"opt"=>"-pt" , "val"=>"Folio"},
  'PageSize=Executive'              => {"opt"=>"-pt" , "val"=>"Executive"},
  'PageSize=B5'                     => {"opt"=>"-pt" , "val"=>"B5"},
  'PageSize=B6'                     => {"opt"=>"-pt" , "val"=>"B6"},
  'PageSize=A5'                     => {"opt"=>"-pt" , "val"=>"A5"},
  'PageSize=A6'                     => {"opt"=>"-pt" , "val"=>"A6"},
  'PageSize=BrA6_B'                 => {"opt"=>"-pt" , "val"=>"BrA6_B"},
  'PageSize=BrPostC4x6_S'           => {"opt"=>"-pt" , "val"=>"BrPostC4x6_S"},
  'PageSize=BrPostC4x6_B'           => {"opt"=>"-pt" , "val"=>"BrPostC4x6_B"},
  'PageSize=BrIndexC5x8_S'          => {"opt"=>"-pt" , "val"=>"BrIndexC5x8_S"},
  'PageSize=BrIndexC5x8_B'          => {"opt"=>"-pt" , "val"=>"BrIndexC5x8_B"},
  'PageSize=BrPhotoL_S'             => {"opt"=>"-pt" , "val"=>"BrPhotoL_S"},
  'PageSize=BrPhotoL_B'             => {"opt"=>"-pt" , "val"=>"BrPhotoL_B"},
  'PageSize=BrPhoto2L_S'            => {"opt"=>"-pt" , "val"=>"BrPhoto2L_S"},
  'PageSize=BrPhoto2L_B'            => {"opt"=>"-pt" , "val"=>"BrPhoto2L_B"},
  'PageSize=Postcard'               => {"opt"=>"-pt" , "val"=>"Postcard"},
  'PageSize=BrHagaki_B'             => {"opt"=>"-pt" , "val"=>"BrHagaki_B"},
  'PageSize=DoublePostcardRotated'  => {"opt"=>"-pt" , "val"=>"DoublePostcardRotated"},
  'PageSize=EnvC5'                  => {"opt"=>"-pt" , "val"=>"EnvC5"},
  'PageSize=EnvDL'                  => {"opt"=>"-pt" , "val"=>"EnvDL"},
  'PageSize=Env10'                  => {"opt"=>"-pt" , "val"=>"Env10"},
  'PageSize=EnvMonarch'             => {"opt"=>"-pt" , "val"=>"EnvMonarch"},
  'PageSize=EnvYou4'                => {"opt"=>"-pt" , "val"=>"EnvYou4"},
  'PageSize=EnvChou3'               => {"opt"=>"-pt" , "val"=>"EnvChou3"},
  'PageSize=EnvChou4'               => {"opt"=>"-pt" , "val"=>"EnvChou4"},
  'PageSize=EnvKaku2'               => {"opt"=>"-pt" , "val"=>"EnvKaku2"},
  'PageSize=195x270mm'              => {"opt"=>"-pt" , "val"=>"195x270mm"},
  'PageSize=MexicanLegal'           => {"opt"=>"-pt" , "val"=>"MexicanLegal"},
  'PageSize=IndiaLegal'            => {"opt"=>"-pt" , "val"=>"IndiaLegal"},

  'Duplex=DuplexTumble'             => {"opt"=>"-duplex" , "val"=>"DuplexTumble"},
  'Duplex=DuplexNoTumble'           => {"opt"=>"-duplex" , "val"=>"DuplexNoTumble"},
  'Duplex=None'                     => {"opt"=>"-duplex" , "val"=>"None"},

  'BRInputSlot=AutoSelect'           => {"opt"=>"-feed" , "val"=>"AutoSelect"},
  'BRInputSlot=Tray1'                => {"opt"=>"-feed" , "val"=>"Tray1"},
  'BRInputSlot=MPTray'               => {"opt"=>"-feed" , "val"=>"MPTray"},

  'BRResolution=PlainFast'               => {"opt"=>"-reso" , "val"=>"PlainFast"},
  'BRResolution=PlainNormal'             => {"opt"=>"-reso" , "val"=>"PlainNormal"},
  'BRResolution=Fast'                    => {"opt"=>"-reso" , "val"=>"Fast"},
  'BRResolution=Normal'                  => {"opt"=>"-reso" , "val"=>"Normal"},
  'BRResolution=Fine'                    => {"opt"=>"-reso" , "val"=>"Fine"},
  'BRResolution=Best'                    => {"opt"=>"-reso" , "val"=>"Best"},

  'BRMonoColor=Color'                     => {"opt"=>"-corm" , "val"=>"Color"},
  'BRMonoColor=Mono'                      => {"opt"=>"-corm" , "val"=>"Mono"},

  'BRSlowDrying=OFF'                     => {"opt"=>"-sd" , "val"=>"OFF"},
  'BRSlowDrying=ON'                      => {"opt"=>"-sd" , "val"=>"ON"},

  'BRMediaType=PlainDuplex'               => {"opt"=>"-md" , "val"=>"PlainDuplex"},
  'BRMediaType=Plain'                     => {"opt"=>"-md" , "val"=>"Plain"},
  'BRMediaType=Inkjet'                    => {"opt"=>"-md" , "val"=>"Inkjet"},
  'BRMediaType=BrotherGlossyR'            => {"opt"=>"-md" , "val"=>"BrotherGlossyR"},
  'BRMediaType=BrotherBP60Matte'          => {"opt"=>"-md" , "val"=>"BrotherBP60Matte"},
  'BRMediaType=Glossy'                    => {"opt"=>"-md" , "val"=>"Glossy"},
  'BRMediaType=InkjetHagakiAtena'         => {"opt"=>"-md" , "val"=>"InkjetHagakiAtena"},
  'BRMediaType=InkjetHagakiUra'           => {"opt"=>"-md" , "val"=>"InkjetHagakiUra"},

  'BRColorPaperThick=Regular'                    => {"opt"=>"-thick" , "val"=>"Regular"},
  'BRColorPaperThick=Thick'                      => {"opt"=>"-thick" , "val"=>"Thick"},
  'BRColorPaperThick=Env'                        => {"opt"=>"-thick" , "val"=>"Env"},

  'BRBiDir=OFF'                     => {"opt"=>"-bidir" , "val"=>"OFF"},
  'BRBiDir=ON'                      => {"opt"=>"-bidir" , "val"=>"ON"},

  'BRVertLineAlignA3B4Ledger=OFF'                     => {"opt"=>"-vla3b4ledger" , "val"=>"OFF"},
  'BRVertLineAlignA3B4Ledger=ON'                      => {"opt"=>"-vla3b4ledger" , "val"=>"ON"},

  'BRVertLineAlignA4Letter=OFF'                     => {"opt"=>"-vla4letter" , "val"=>"OFF"},
  'BRVertLineAlignA4Letter=ON'                      => {"opt"=>"-vla4letter" , "val"=>"ON"},

  'BRVertLineAlignOther=OFF'                     => {"opt"=>"-vlother" , "val"=>"OFF"},
  'BRVertLineAlignOther=ON'                      => {"opt"=>"-vlother" , "val"=>"ON"},

  'BRColorMatching=Natural'                     => {"opt"=>"-cm" , "val"=>"Natural"},
  'BRColorMatching=Vivid'                       => {"opt"=>"-cm" , "val"=>"Vivid"},
  'BRColorMatching=None'                        => {"opt"=>"-cm" , "val"=>"None"},

  'BRJpeg=Recommended'                     => {"opt"=>"-jpeg" , "val"=>"Recommended"},
  'BRJpeg=QualityPrior'                    => {"opt"=>"-jpeg" , "val"=>"QualityPrior"},
  'BRJpeg=SpeedPrior'                      => {"opt"=>"-jpeg" , "val"=>"SpeedPrior"},

  'BRHalfTonePattern=Diffusion'                  => {"opt"=>"-ht" , "val"=>"Diffusion"},
  'BRHalfTonePattern=Dither'                     => {"opt"=>"-ht" , "val"=>"Dither"},

  'BRColorEnhancement=OFF'                    => {"opt"=>"-ce" , "val"=>"OFF"},
  'BRColorEnhancement=ON'                     => {"opt"=>"-ce" , "val"=>"ON"},

  'BRReduceSmudgeDx=OFF'                     => {"opt"=>"-gdx" , "val"=>"OFF"},
  'BRReduceSmudgeDx=LOW'                     => {"opt"=>"-gdx" , "val"=>"LOW"},
  'BRReduceSmudgeDx=HIGH'                    => {"opt"=>"-gdx" , "val"=>"HIGH"},

  'BRReduceSmudgeSx=OFF'                     => {"opt"=>"-gsx" , "val"=>"OFF"},
  'BRReduceSmudgeSx=LOW'                     => {"opt"=>"-gsx" , "val"=>"LOW"},
  'BRReduceSmudgeSx=HIGH'                    => {"opt"=>"-gsx" , "val"=>"HIGH"},

  'BRReduceSmudgeGP=OFF'                     => {"opt"=>"-ggp" , "val"=>"OFF"},
  'BRReduceSmudgeGP=ON'                      => {"opt"=>"-ggp" , "val"=>"ON"},
);


  %DefaultPageSize = (
  "optionname" => 'DefaultPageSize'   , 
  "optionlist" => {
          'A3'                     => {"opt"=>"-pt" , "val"=>"A3"},
          'BrA3_B_S'               => {"opt"=>"-pt" , "val"=>"BrA3_B_S"},
          'B4_S'                   => {"opt"=>"-pt" , "val"=>"B4_S"},
          'Tabloid_S'              => {"opt"=>"-pt" , "val"=>"Tabloid_S"},
          'BrLedger_B_B'           => {"opt"=>"-pt" , "val"=>"BrLedger_B_B"},
          'A4'                     => {"opt"=>"-pt" , "val"=>"A4"},
          'BrA4_B'                     => {"opt"=>"-pt" , "val"=>"BrA4_B"},
          'Letter'                     => {"opt"=>"-pt" , "val"=>"Letter"},
          'BrLetter_B'                     => {"opt"=>"-pt" , "val"=>"BrLetter_B"},
          'Legal'                     => {"opt"=>"-pt" , "val"=>"Legal"},
          'Folio'                     => {"opt"=>"-pt" , "val"=>"Folio"},
          'Executive'                     => {"opt"=>"-pt" , "val"=>"Executive"},
          'B5'                     => {"opt"=>"-pt" , "val"=>"B5"},
          'B6'                     => {"opt"=>"-pt" , "val"=>"B6"},
          'A5'                     => {"opt"=>"-pt" , "val"=>"A5"},
          'A6'                     => {"opt"=>"-pt" , "val"=>"A6"},
          'BrA6_B'                     => {"opt"=>"-pt" , "val"=>"BrA6_B"},
          'BrPostC4x6_S'                     => {"opt"=>"-pt" , "val"=>"BrPostC4x6_S"},
          'BrPostC4x6_B'                     => {"opt"=>"-pt" , "val"=>"BrPostC4x6_B"},
          'BrIndexC5x8_S'                     => {"opt"=>"-pt" , "val"=>"BrIndexC5x8_S"},
          'BrIndexC5x8_B'                     => {"opt"=>"-pt" , "val"=>"BrIndexC5x8_B"},
          'BrPhotoL_S'                     => {"opt"=>"-pt" , "val"=>"BrPhotoL_S"},
          'BrPhotoL_B'                     => {"opt"=>"-pt" , "val"=>"BrPhotoL_B"},
          'BrPhoto2L_S'                     => {"opt"=>"-pt" , "val"=>"BrPhoto2L_S"},
          'BrPhoto2L_B'                     => {"opt"=>"-pt" , "val"=>"BrPhoto2L_B"},
          'Postcard'                     => {"opt"=>"-pt" , "val"=>"Postcard"},
          'BrHagaki_B'                     => {"opt"=>"-pt" , "val"=>"BrHagaki_B"},
          'DoublePostcardRotated'                     => {"opt"=>"-pt" , "val"=>"DoublePostcardRotated"},
          'EnvC5'                     => {"opt"=>"-pt" , "val"=>"EnvC5"},
          'EnvDL'                     => {"opt"=>"-pt" , "val"=>"EnvDL"},
          'Env10'                     => {"opt"=>"-pt" , "val"=>"Env10"},
          'EnvMonarch'                     => {"opt"=>"-pt" , "val"=>"EnvMonarch"},
          'EnvYou4'                     => {"opt"=>"-pt" , "val"=>"EnvYou4"},
          'EnvChou3'                    => {"opt"=>"-pt" , "val"=>"EnvChou3"},
          'EnvChou4'                    => {"opt"=>"-pt" , "val"=>"EnvChou4"},
          'EnvKaku2'                    => {"opt"=>"-pt" , "val"=>"EnvKaku2"},
          '195x270mm'                     => {"opt"=>"-pt" , "val"=>"195x270mm"},
          'MexicanLegal'                     => {"opt"=>"-pt" , "val"=>"MexicanLegal"},
          'IndiaLegal'                     => {"opt"=>"-pt" , "val"=>"IndiaLegal"},
  }
 ) ;
  %DefaultDuplex = (
  "optionname" => 'DefaultDuplex'   , 
  "optionlist" => {
          'DuplexTumble'                     => {"opt"=>"-duplex" , "val"=>"DuplexTumble"},
          'DuplexNoTumble'                     => {"opt"=>"-duplex" , "val"=>"DuplexNoTumble"},
          'None'                     => {"opt"=>"-duplex" , "val"=>"None"},
  }
 ) ;
  %DefaultBRInputSlot = (
  "optionname" => 'DefaultBRInputSlot'   , 
  "optionlist" => {
          'AutoSelect'                     => {"opt"=>"-feed" , "val"=>"AutoSelect"},
          'Tray1'                     => {"opt"=>"-feed" , "val"=>"Tray1"},
          'MPTray'                     => {"opt"=>"-feed" , "val"=>"MPTray"},
  }
 ) ;
  %DefaultBRResolution = (
  "optionname" => 'DefaultBRResolution'   , 
  "optionlist" => {
          'PlainFast'                     => {"opt"=>"-reso" , "val"=>"PlainFast"},
          'PlainNormal'                     => {"opt"=>"-reso" , "val"=>"PlainNormal"},
          'Fast'                     => {"opt"=>"-reso" , "val"=>"Fast"},
          'Normal'                     => {"opt"=>"-reso" , "val"=>"Normal"},
          'Fine'                     => {"opt"=>"-reso" , "val"=>"Fine"},
          'Best'                     => {"opt"=>"-reso" , "val"=>"Best"},

  }
 ) ; 
  %DefaultBRMonoColor = (
  "optionname" => 'DefaultBRMonoColor'   , 
  "optionlist" => {
          'Color'                    => {"opt"=>"-corm" , "val"=>"Color"},
          'Mono'                     => {"opt"=>"-corm" , "val"=>"Mono"},
  }
 ) ;
  %DefaultBRSlowDrying = (
  "optionname" => 'DefaultBRSlowDrying'   , 
  "optionlist" => {

	  'OFF'       => {"opt"=>"-sd" , "val"=>"OFF"},
	  'ON'        => {"opt"=>"-sd" , "val"=>"ON"},
  }
 ) ;
  %DefaultBRMediaType = (
  "optionname" => 'DefaultBRMediaType'   , 
  "optionlist" => {
          'PlainDuplex'                   => {"opt"=>"-md" , "val"=>"PlainDuplex"},
          'Plain'                         => {"opt"=>"-md" , "val"=>"Plain"},
          'Inkjet'                        => {"opt"=>"-md" , "val"=>"Inkjet"},
          'BrotherGlossyR'                => {"opt"=>"-md" , "val"=>"BrotherGlossyR"},
          'BrotherBP60Matte'              => {"opt"=>"-md" , "val"=>"BrotherBP60Matte"},
          'Glossy'                        => {"opt"=>"-md" , "val"=>"Glossy"},
          'InkjetHagakiAtena'             => {"opt"=>"-md" , "val"=>"InkjetHagakiAtena"},
          'InkjetHagakiUra'               => {"opt"=>"-md" , "val"=>"InkjetHagakiUra"},
  }
 ) ;
  %DefaultBRColorPaperThick = (
  "optionname" => 'DefaultBRColorPaperThick'   , 
  "optionlist" => {
	  'Regular'            => {"opt"=>"-thick" , "val"=>"Regular"},
	  'Thick'              => {"opt"=>"-thick" , "val"=>"Thick"},
	  'Env'                => {"opt"=>"-thick" , "val"=>"Env"},
  }
 ) ;
  %DefaultBRBiDir = (
  "optionname" => 'DefaultBRBiDir'   , 
  "optionlist" => {
	  'ON'                       => {"opt"=>"-bidir" , "val"=>"ON"},
	  'OFF'                      => {"opt"=>"-bidir" , "val"=>"OFF"},
  }
 ) ;
  %DefaultBRVertLineAlignA3B4Ledger = (
  "optionname" => 'DefaultBRVertLineAlignA3B4Ledger'   , 
  "optionlist" => {
          'OFF'                     => {"opt"=>"-vla3b4ledger" , "val"=>"OFF"},
          'ON'                      => {"opt"=>"-vla3b4ledger" , "val"=>"ON"},
  }
 ) ;
  %DefaultBRVertLineAlignA4Letter = (
  "optionname" => 'DefaultBRVertLineAlignA4Letter'   , 
  "optionlist" => {
          'OFF'                     => {"opt"=>"-vla4letter" , "val"=>"OFF"},
          'ON'                      => {"opt"=>"-vla4letter" , "val"=>"ON"},
  }
 ) ;
  %DefaultBRVertLineAlignOther = (
  "optionname" => 'DefaultBRVertLineAlignOther'   , 
  "optionlist" => {
          'OFF'                     => {"opt"=>"-vlother" , "val"=>"OFF"},
          'ON'                      => {"opt"=>"-vlother" , "val"=>"ON"},
  }
 ) ;
  %DefaultBRColorMatching = (
  "optionname" => 'DefaultBRColorMatching'   , 
  "optionlist" => {
     'Natural'         => {"opt"=>"-cm" , "val"=>"Natural"},
     'Vivid'           => {"opt"=>"-cm" , "val"=>"Vivid"},
     'None'            => {"opt"=>"-cm" , "val"=>"None"},
  }
 ) ;
  %DefaultBRJpeg = (
  "optionname" => 'DefaultBRJpeg'   , 
  "optionlist" => {
	  'Recommended'             => {"opt"=>"-jpeg" , "val"=>"Recommended"},
	  'QualityPrior'            => {"opt"=>"-jpeg" , "val"=>"QualityPrior"},
	  'SpeedPrior'              => {"opt"=>"-jpeg" , "val"=>"SpeedPrior"},
  }
 ) ;
  %DefaultBRHalfTonePattern = (
  "optionname" => 'DefaultBRHalfTonePattern'   , 
  "optionlist" => {
	  'Diffusion'            => {"opt"=>"-ht" , "val"=>"Diffusion"},
	  'Dither'               => {"opt"=>"-ht" , "val"=>"Dither"},
  }
 ) ;
  %DefaultBRColorEnhancement = (
  "optionname" => 'DefaultBRColorEnhancement'   , 
  "optionlist" => {
	  'ON'                  => {"opt"=>"-ce" , "val"=>"ON"},
	  'OFF'                 => {"opt"=>"-ce" , "val"=>"OFF"},
  }
 ) ;
  %DefaultBRBrightness = (
  "optionname" => 'DefaultBRBrightness'   , 
  "optionlist" => {
     '*'               => {"opt"=>"-brit" , "val"=>"*"},
  }
 ) ;
  %DefaultBRContrast = (
  "optionname" => 'DefaultBRContrast'   , 
  "optionlist" => {
     '*'               => {"opt"=>"-cont" , "val"=>"*"},
  }
 ) ;
  %DefaultBRRed = (
  "optionname" => 'DefaultBRRed'   , 
  "optionlist" => {
     '*'               => {"opt"=>"-red" , "val"=>"*"},
  }
 ) ;
  %DefaultBRGreen = (
  "optionname" => 'DefaultBRGreen'   , 
  "optionlist" => {
     '*'               => {"opt"=>"-green" , "val"=>"*"},
  }
 ) ;
  %DefaultBRBlue = (
  "optionname" => 'DefaultBRBlue'   , 
  "optionlist" => {
     '*'               => {"opt"=>"-blue" , "val"=>"*"},
  }
 ) ;
  %DefaultBRReduceSmudgeDx = (
  "optionname" => 'DefaultBRReduceSmudgeDx'   , 
  "optionlist" => {
	  'OFF'               => {"opt"=>"-gdx" , "val"=>"OFF"},
	  'LOW'               => {"opt"=>"-gdx" , "val"=>"LOW"},
	  'HIGH'              => {"opt"=>"-gdx" , "val"=>"HIGH"},
  }
 ) ;
  %DefaultBRReduceSmudgeSx = (
  "optionname" => 'DefaultBRReduceSmudgeSx'   , 
  "optionlist" => {
	  'OFF'               => {"opt"=>"-gsx" , "val"=>"OFF"},
	  'LOW'               => {"opt"=>"-gsx" , "val"=>"LOW"},
	  'HIGH'              => {"opt"=>"-gsx" , "val"=>"HIGH"},
  }
 ) ;
  %DefaultBRReduceSmudgeGP = (
  "optionname" => 'DefaultBRReduceSmudgeGP'   , 
  "optionlist" => {
          'OFF'                     => {"opt"=>"-ggp" , "val"=>"OFF"},
          'ON'                      => {"opt"=>"-ggp" , "val"=>"ON"},
  }
 ) ;
 %numeric_option = (
  "BRBrightness"                => {"opt"=>"-brit"  , "val"=>"*"},
  "BRContrast"                  => {"opt"=>"-cont"  , "val"=>"*"},
  "BRRed"                       => {"opt"=>"-red"   , "val"=>"*"},
  "BRGreen"                     => {"opt"=>"-green" , "val"=>"*"},
  "BRBlue"                      => {"opt"=>"-blue"  , "val"=>"*"},
  "BRSaturation"                => {"opt"=>"-satu"  , "val"=>"*"},
);
 %initial_configuration = (
   "-pt"       =>  "Letter"     ,
   "-reso"     =>  "PlainNormal"    ,
   "-duplex"   =>  "None"   ,
   "-feed"     =>  "AutoSelect"   ,
   "-corm"     =>  "Color"  ,
   "-sd"       =>  "OFF"  ,
   "-md"       =>  "Plain"  ,
   "-thick"    =>  "Regular"  ,
   "-bidir"    =>  "ON"  ,
   "-cm"       =>  "Natural"  ,
   "-jpeg"     =>  "Recommended"  ,
   "-ht"       =>  "Diffusion"  ,
   "-ce"       =>  "OFF"  ,
   "-brit"     =>  "0"      ,
   "-cont"     =>  "0"      ,
   "-red"      =>  "0"      ,
   "-green"    =>  "0"      ,
   "-blue"     =>  "0"      ,
   "-gdx"      =>  "OFF"      ,
   "-gsx"      =>  "OFF"      ,
   "-ggp"      =>  "OFF"      ,
   "-vla3b4ledger"      =>  "ON"      ,
   "-vla4letter"        =>  "OFF"      ,
   "-vlother"           =>  "OFF"      ,
 );


 %ppddefaultslist = (
    "DefaultPageSize"                          => \%DefaultPageSize,
    "DefaultDuplex"                            => \%DefaultDuplex,
    "DefaultBRInputSlot"                       => \%DefaultBRInputSlot,
    "DefaultBRResolution"                      => \%DefaultBRResolution,
    "DefaultBRMonoColor"                       => \%DefaultBRMonoColor,
    "DefaultBRSlowDrying"                      => \%DefaultBRSlowDrying,
    "DefaultBRMediaType"                       => \%DefaultBRMediaType,
    "DefaultBRColorPaperThick"                 => \%DefaultBRColorPaperThick,
    "DefaultBRBiDir"                           => \%DefaultBRBiDir,
    "DefaultBRVertLineAlignA3B4Ledger"         => \%DefaultBRVertLineAlignA3B4Ledger,
    "DefaultBRVertLineAlignA4Letter"           => \%DefaultBRVertLineAlignA4Letter,
    "DefaultBRVertLineAlignOther"              => \%DefaultBRVertLineAlignOther,
    "DefaultBRColorMatching"                   => \%DefaultBRColorMatching,
    "DefaultBRJpeg"                            => \%DefaultBRJpeg,
    "DefaultBRHalfTonePattern"                 => \%DefaultBRHalfTonePattern,
    "DefaultBRColorEnhancement"                => \%DefaultBRColorEnhancement,
    "DefaultBRBrightness"                      => \%DefaultBRBrightness,
    "DefaultBRContrast"                        => \%DefaultBRContrast,
    "DefaultBRRed"                             => \%DefaultBRRed,
    "DefaultBRGreen"                           => \%DefaultBRGreen,
    "DefaultBRBlue"                            => \%DefaultBRBlue,
    "DefaultBRReduceSmudgeDx"                  => \%DefaultBRReduceSmudgeDx,
    "DefaultBRReduceSmudgeSx"                  => \%DefaultBRReduceSmudgeSx,
    "DefaultBRReduceSmudgeGP"                  => \%DefaultBRReduceSmudgeGP,
  );
 %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_ink_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_ink_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 ( $opt eq "-brit" || $opt eq "-cont" || $opt eq "-red" || $opt eq "-green" || $opt eq "-blue" || $opt eq "-satu" ){
		$lpr_options_ref->{$opt} = $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;
	my $lpdconf = $LPDCONFIGEXE.$PRINTER;
    
    while(($op , $val) = each(%lpr_options)){
#        my $lpdconf_command = "$lpdconf -P $PRINTER $op $val -rcfile $TEMPRC";
        my $lpdconf_command = "$lpdconf $op $val -rcfile $TEMPRC";
	logprint( 0 ,   "$lpdconf_command\n");
	`$lpdconf_command`;
    }

}

