/* $VER: PSpool v1.0 (17/09/99)
   Print Spooler v1.0 by Robert Wilson
   http://www.dynamix.f9.co.uk
*/

/*---------------------------------------------------------------------------------------------------*/

/* START DEFAULT SETTINGS
*/

exclude. = 0
extension. = ''
pattern. = '~(#?.info)'
purge. = 0
service. = 'printer'
subdir. = ''

/* END DEFAULT SETTINGS
*/

/* START GLOBAL SETTINGS
*/

printers = 1                                  /* the number of printers defined below */
cmdpath = 'sys:utilities/cmd'                 /* the path to CMD */
runcmd = 1                                    /* should PSpool run CMD for you */
setcmd = 0                                    /* set CMD's tooltypes */
pubscreen = 'Workbench'                       /* what screen should requesters open on */

username. = 'username'                        /* your default username */
password. = 'password'                        /* your default password */

/* END GLOBAL SETTINGS
*/

/* START PRINTER SETTINGS
*/

spooldir.1 = 'Data:spool/dj670/'              /* make sure this folder exists and end it in '/' or ':' */
printer.1 = '\\dynamix\DESKJET'

/* if you are only configuring one networked printer and
   you've reached this point then you have finished ;-)
   save changes now...
*/

/* if you are configuring multiple printers then take a look at
   some examples below. Edit and delete what you need or don't...
*/


spooldir.2 = 'Data:spool/ps/'
printer.2 = '\\dynamix\GHOSTSCRIPT'           /* create and share a "fake" PS printer using RedMon and Ghostscript on the Win PC */
purge.2 = 1                                   /* delete files from the spooldir on startup */

address 'COMMAND'; 'c:assign PS:' spooldir.2  /* you don't have to do this but it's very useful ;-)
                                                 with this set up I can simply print a postscript file to "ps:filename.ps". with or
                                                 without it when the postscript printer is selected by PSwitch I can simply print
                                                 to the parallel postscript printer. Works great with ADPro, Final Writer etc...
                                              */

username.3 = 'robert'                         /* this server needs a different username */
password.3 = 'wilson'                         /* and password - this isn't the real password :-/ */
spooldir.3 = 'Data:spool/pdf/'
printer.3= '\\otherpc\DISTILLER'              /* this shared folder is watched by Acrobat Distiller */
service.3 = 'file'                            /* copy postscript file to a folder, instead of printing */
subdir.3 = 'in'                               /* when connected to \\dynamix\\DISILLER cd to 'in' */
extension.3 = 'ps'                            /* if the has the 'ps' then don't rename it. */
purge.3 = 1                                   /* delete files from the spooldir on startup */

address 'COMMAND'; 'c:assign PDF:' spooldir.3 /* found this assign useful also */

spooldir.4 = 'Data:spool/bj200/'
printer.4 = '?'                               /* this printer is at work - open a requester to save the print data */ 

/* END PRINTER SETTINGS
*/

/*---------------------------------------------------------------------------------------------------*/

signal on BREAK_C
signal on FAILURE
signal on IOERR

if ~show(l,'rexxsupport.library') then do
   if ~addlib('rexxsupport.library',0,-30,0) then do
      say 'rexxsupport.library not available'
      exit
   end
end

if ~show(l,'rexxtricks.library') then do
   if ~addlib('rexxtricks.library',0,-30,0) then do
      say 'rexxtricks.library not available'
      exit
   end
end

if ~show(l,'rexxreqtools.library') then do
   if ~addlib('rexxreqtools.library',0,-30,0) then do
      say 'rexxreqtools.library not available'
      exit
   end
end

scriptname = 'PSpool v1.0 by Robert Wilson'

address 'COMMAND'
if printers > 1 then do
  if open(file,'env:pswitchpath','R') then do
    pswitchpath = readln(file)
    call close(file)
    if right(pswitchpath,1) ~= '/' & right(pswitchpath,1) ~= ':' then pswitchpath = 'rexx:'
  end
  else pswitchpath = 'rexx:'
  'sys:rexxc/rx' pswitchpath'pscontrol.rexx SETPRINTER' cmdpath
end

do i = 1 to printers
  if right(spooldir.i,1) ~= '/' & right(spooldir.i,1) ~= ':' then do
    call rtezrequest('The spooldir must end in ":" or "/"' || '0A'x || '0A'x || '"'spooldir.i'" is an invalid path','_Sorry!',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen)
    exit
  end
  else do
    if purge.i = 1 then do
      'c:delete' spooldir.i'#? FORCE >nil:'
    end
  end
end

if printers ~> 1 then do
  if setcmd = 1 then do
    tooltypes.0 = 5
    tooltypes.1 = 'DEVICE=parallel'

    if printers = 1 then tooltypes.2 = 'FILE='spooldir.1'PrintJob'
    else tooltypes.2 = 'FILE=spooldir:PrintJob'

    tooltypes.3 = 'SKIP=FALSE'
    tooltypes.4 = 'MULTIPLE=TRUE'
    tooltypes.5 = 'NOTIFY=FALSE'
    if ~settooltypes(cmdpath,tooltypes) then call rtezrequest('Error unable to set CMD''s tooltypes)','_Hmmm',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen)
  end

  if runcmd = 1 then do
    if printers = 1 then 'run <>nil:' cmdpath 'parallel' spooldir.1'PrintJob opt m'
    else 'run <>nil:' cmdpath 'parallel spooldir:PrintJob opt m'
  end
end

do forever
  dodelay = 1
  do i = 1 to printers
    if exclude.i = 0 then do
      if getdir(spooldir.i,pattern.i,'stemvar','FILES','PATH') then do
        do x = 1 to stemvar.0
          call sendfile(stemvar.x)
        end
      end
    end
  end
  if dodelay = 1 then call delay (10*50)
end

exit

/* */

sendfile:
parse arg filename
if open(file,filename,'R') then do /* check to see if file is not still being spooled */
  call close(file)
  if right(printer.i,1) ~= ':' & right(printer.i,1) ~= '/' & right(printer.i,1) ~= '?' then do
    if upper(service.i) = 'FILE' then do
      fn = filepart(filename)
      if suffixpart(upper(fn)) ~= upper(extension.i) then fn = date(d)'_'time(s)'.'extension.i /* to prevent duplicate files */
      'amitcp:samba/bin/smbclient 'printer.i '-U' username.i'%'password.i '"-c cd' subdir.i'; put' filename fn'" >nil:'
      if RC = 0 then 'c:delete' filename 'FORCE QUIET'
      else call servererror()
    end
    else do
      'amitcp:samba/bin/smbclient 'printer.i '-P -U' username.i'%'password.i '"-c printmode graphics; print' filename'" >nil:'
      if RC = 0 then 'c:delete' filename 'FORCE QUIET'
      else call servererror()
    end
  end
  else do
    fn = filepart(filename)
    if suffixpart(upper(fn)) ~= upper(extension.i) then do
      if extension.i = '' then fn = date(d)'_'time(s)'.prn'
      else fn = date(d)'_'time(s)'.'extension.i
    end
    if printer.i = '?' then do
      okay = 0
      do until okay = 1
        reqpath = rtfilerequest(,fn,'Select filename for output','Okay','rt_reqpos = reqpos_centerscr  rt_pubscrname = 'pubscreen' rtfi_buffer = TRUE') 
        if rtresult ~= 0 then do
          if exists(pathpart(reqpath)) & length(filepart(reqpath)) > 0 then do
            okay = 1
            printer.i = pathpart(reqpath)
            'c:copy' filename reqpath 'QUIET'
            if RC = 0 then 'c:delete' filename 'FORCE QUIET'
            else call servererror()

            printer.i = '?'

          end
        end
        else do
          if rtezrequest('Delete print job?','_Yes|_No',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen) = 1 then do
            okay = 1
            'c:delete' filename 'FORCE QUIET'
          end
        end
      end
    end
    else do
      'c:copy' filename printer.i''fn 'QUIET'
      if RC = 0 then 'c:delete' filename 'FORCE QUIET'
      else call servererror()
    end
  end
end
return

/* */

BREAK_C:
call rtezrequest('User break (CTRL-C)','_Okay',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen)
exit

/* */

FAILURE:
IOERR:
call rtezrequest('An error has occured!' || '0A'x || errortext(RC),'_Damn!',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen)
exit

/* */

servererror:
dodelay = 0
errorreq = 0
if exists('rexx:autoclose.rexx') then errorreq = autoclose(start,10,pubscreen,'PSpool')
answer = rtezrequest('Unable to spool file "'filename'"' || '0A'x || 'to "'printer.i'"','_Retry|_Delete print job|_Quit',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen) 
if errorreq ~= 0 then call autoclose(stop,errorreq)
if answer = 0 then do
  if rtezrequest('Are you sure that you want'|| '0A'x ||'to close PSpool?','_Yes|_No',scriptname,'rtez_flags = ezreqf_centertext rt_reqpos = reqpos_centerscr rt_pubscrname = 'pubscreen) then exit
end

if answer = 2 then do
  address 'COMMAND'
  'c:delete' filename 'FORCE QUIET'
end
return

