with RASCAL.Utility;             use RASCAL.Utility;
with RASCAL.TaskManager;
with RASCAL.Memory;

with Kernel;                     use Kernel;
with Ada.Strings.Unbounded;      use Ada.Strings.Unbounded;


package body RASCAL.Printer is

   package TM  renames RASCAL.TaskManager;
   package Mem renames RASCAL.Memory;

   --
   
   PDriver_Info : constant := 16#80140#;

   --

   function Is_PrinterManager return boolean is
   begin
      return TM.Is_Task ("Printer Manager") or TM.is_Task ("Druckermanager"); 
   end Is_PrinterManager;

   --

   function Get_PrinterName return String is
   
      Register     : aliased Kernel.swi_regs;
      Error        : oserror_access;
   begin
      Error := Kernel.SWI (PDriver_Info,register'Access,register'Access);
      if error /= null then
         return "";
      end if;
      return Mem.MemoryToString(Int_To_Adr(Register.R(4)));   
   end Get_PrinterName;

   --

   procedure Get_DriverInfo (Version    : out Integer;
                             Printer    : out Integer;
                             X_Res      : out Integer;
                             Y_Res      : out Integer;
                             Features   : out Integer;
                             Name       : out String;
                             X_Halftone : out Integer;
                             Y_Halftone : out Integer;
                             Number     : out Integer) is

      Register     : aliased Kernel.swi_regs;
      Error        : oserror_access;
      PDriver_Info : constant := 16#80140#;
      Dummy        : Unbounded_String;
   begin
      Error := Kernel.SWI (PDriver_Info,register'Access,register'Access);
      if error /= null then
         pragma Debug(Report("Printer.Get_DriverInfo: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;

      Version := (Integer(Register.R(0)) * 2**16) / 2**16;
      Printer := Integer(Register.R(0)) / 2**16;
      X_Res := Integer(Register.R(1));
      Y_Res := Integer(Register.R(2));
      Features := Integer(Register.R(3));
      dummy := U(Mem.MemoryToString(Int_To_Adr(Register.R(4))));
      Name (Name'First..Length(dummy)) := S(dummy);
      X_Halftone := Integer(Register.R(5));
      Y_Halftone := Integer(Register.R(6));
      Number := Integer(Register.R(7));
   end Get_DriverInfo;

   --

end RASCAL.Printer;

