Patch title: Release 85 bulk changes
Abstract:
File: /pliant/graphic/filter/ijs.pli
Key:
    Removed line
    Added line
abstract
  []
  [An interface enabling to use any IJS compatible driver.]

# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# 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
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/pipe.pli"
module "/pliant/admin/execute.pli"
module "prototype.pli"
module "/pliant/graphic/color/gamut.pli"

constant verbose false


constant ijs_cmd_ack 0
constant ijs_cmd_nak 1
constant ijs_cmd_ping 2
constant ijs_cmd_pong 3
constant ijs_cmd_open 4
constant ijs_cmd_close 5
constant ijs_cmd_begin_job 6
constant ijs_cmd_end_job 7
constant ijs_cmd_cancel_job 8
constant ijs_cmd_query_status 9
constant ijs_cmd_list_params 10
constant ijs_cmd_enum_param 11
constant ijs_cmd_set_param 12
constant ijs_cmd_get_param 13
constant ijs_cmd_begin_page 14
constant ijs_cmd_send_data_block 15
constant ijs_cmd_end_page 16
constant ijs_cmd_exit 17

function ijs_int i -> s
  arg Int i ; arg Str s
  s := "...."
  s:characters map uInt32_hi := i

function ijs_send cmd num parameters
   arg_rw Stream cmd ; arg Int num ; arg Str parameters
  var uInt32_hi i32 := num ; cmd raw_write addressof:i32 4
  var uInt32_hi i32 := 8+parameters:len ; cmd raw_write addressof:i32 4
  cmd writechars parameters
  cmd flush anytime

function ijs_receive ack num parameters
  arg_rw Stream ack ; arg_w Int num ; arg_w Str parameters
  ack raw_read addressof:(var uInt32_hi cmd) 4
  ack raw_read addressof:(var uInt32_hi len) 4
  num := cmd
  parameters := repeat (min (max (cast len Int)-8 0) 2^16) " "
  ack raw_read parameters:characters parameters:len

function ijs_command cmd ack num parameters -> err
  arg_rw Stream cmd ack ; arg Int num ; arg Str parameters ; arg Int err
  ijs_send cmd num parameters
  ijs_receive ack (var Int n) (var Str p)
  err := n
  if verbose
    console "  ijs command " num " -> " n " " p
    if err<>0 and p:len=4
      console " (" (cast (p:characters map uInt32_hi) Int) ")"
    console eol

function ijs_set cmd ack param value -> err
  arg_rw Stream cmd ack ; arg Str param value ; arg Int err
  if verbose
    console "  " param " = " string:value
  err := ijs_command cmd ack ijs_cmd_set_param ijs_int:0+(ijs_int param:len+1+value:len)+param+"[0]"+value


type ImageWriteFilterIjs
  field Pointer:Stream stream
  field Stream cmd ack
  field Int line_size
  field FastSem eot

ImageWriteFilter maybe ImageWriteFilterIjs


method f open stream options h -> status
  arg_rw ImageWriteFilterIjs f ; arg_rw Stream stream ; arg Str options ; arg ImagePrototype h ; arg ExtendedStatus status
  var Str model := options option "model" Str
  if model=""
    return failure:"You must specify the printer model"
  f stream :> stream
  f line_size := h line_size
  stream_pipe (var Str pipe1_in) (var Str pipe1_out)
  stream_pipe (var Str pipe2_in) (var Str pipe2_out)
  stream_pipe (var Str data_in) (var Str data_out)
  thread
    execute (options option "ijs_server" Str "hpijs") root "embedded:/" path "embedded:/" input pipe1_in output pipe2_out error data_out
  f:eot request
  thread
    share f
    (var Stream output) open data_in in+safe
    while not output:atend
      output read_available (var Address adr) (var Int size)
      f:stream raw_write adr size
    f:eot release
  f:cmd open pipe1_out out+safe
  f:ack open pipe2_in in+safe
  f:cmd writechars "IJS[lf]"+character:170+"v1[lf]" ; f:cmd flush anytime
  var Str l := f:ack readline
  if l<>"IJS"
    return (failure "No IJS server ack (line 1 is '"+l+"')")
  var Str l := f:ack readline
  if l<>character:171+"v1"
    return failure:"No IJS server ack (line 2)"
  ijs_command f:cmd f:ack ijs_cmd_open ""
  ijs_command f:cmd f:ack ijs_cmd_begin_job ijs_int:0
  # ijs_command f:cmd f:ack ijs_cmd_list_params ijs_int:0
  ijs_set f:cmd f:ack "OutputFD" "2"
  ijs_set f:cmd f:ack "DeviceManufacturer" (options option "manufacturer" Str "HP")
  if (ijs_set f:cmd f:ack "DeviceModel" model)<>0 # "hp color LaserJet"
    return failure:"unknown model"
  ijs_set f:cmd f:ack "Dpi" string:(cast h:size_x/(h:x1-h:x0)*25.4 Int)+"x"+string:(cast h:size_y/(h:y1-h:y0)*25.4 Int)
  ijs_set f:cmd f:ack "Width" (string h:size_x)
  ijs_set f:cmd f:ack "Height" (string h:size_y)
  ijs_set f:cmd f:ack "BitsPerSample" "8"
  ijs_set f:cmd f:ack "NumChan" (string h:gamut:pixel_size)
  ijs_set f:cmd f:ack "ColorSpace" (shunt h:gamut:model=color_gamut_substractive "DeviceGray" h:gamut:pixel_size=3 "DeviceRGB" h:gamut:pixel_size=1 "DeviceGray" "")
  ijs_set f:cmd f:ack "Quality:Quality" string:(options option "ijs_quality" Int 2)
  ijs_set f:cmd f:ack "Quality:ColorMode" string:(options option "ijs_colormode" Int 2)
  ijs_set f:cmd f:ack "Quality:PenSet" string:(options option "ijs_penset" Int 2)
  ijs_command f:cmd f:ack ijs_cmd_begin_page ijs_int:0
  status := success

method f writeline adr -> status
  arg_rw ImageWriteFilterIjs f ; arg Address adr ; arg Status status
  ijs_send f:cmd ijs_cmd_send_data_block ijs_int:0+(ijs_int f:line_size)
  f:cmd raw_write adr f:line_size
  f:cmd flush anytime
  ijs_receive f:ack (var Int n) (var Str p)
  status := shunt f:cmd=success and f:ack=success and n=ijs_cmd_ack success failure

method f close -> status
  arg_rw ImageWriteFilterIjs f ; arg ExtendedStatus status
  ijs_command f:cmd f:ack ijs_cmd_end_page ijs_int:0
  ijs_command f:cmd f:ack ijs_cmd_end_job ijs_int:0
  ijs_command f:cmd f:ack ijs_cmd_close ""
  ijs_command f:cmd f:ack ijs_cmd_exit ""
  f:cmd close ; f:ack close
  f:eot request ; f:eot release
  status := success

image_record_filters ".ijs" Void ImageWriteFilterIjs