--------------------------------------------------------------------------------
--                                                                            --
-- Copyright (C) 2004, RISC OS Ada Library (RASCAL) developers.               --
--                                                                            --
-- This library is free software; you can redistribute it and/or              --
-- modify it under the terms of the GNU Lesser General Public                 --
-- License as published by the Free Software Foundation; either               --
-- version 2.1 of the License, or (at your option) any later version.         --
--                                                                            --
-- This library 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           --
-- Lesser General Public License for more details.                            --
--                                                                            --
-- You should have received a copy of the GNU Lesser General Public           --
-- License along with this library; if not, write to the Free Software        --
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    --
--                                                                            --
--------------------------------------------------------------------------------

-- $Author$
-- $Date$
-- $Revision$

with RASCAL.Memory;     use RASCAL.Memory;
with RASCAL.OS;         use RASCAL.OS;

with Kernel;            use Kernel;
package body RASCAL.ToolboxProgInfo is

   -- SWIs
   Toolbox_ObjectMiscOp : constant := 16#44EC6#;

   ProgInfo_ClassSWI       : constant := 16#82B40#;
   ProgInfo_PostFilter     : constant := 16#82B41#;
   XProgInfo_PostFilter    : constant := 16#A2B41#;
   ProgInfo_PreFilter      : constant := 16#82B42#;
   XProgInfo_PreFilter     : constant := 16#A2B42#;

   -- Reason codes
   ProgInfo_GetWindowID    : constant := 16#0#;
   ProgInfo_SetVersion     : constant := 16#1#;
   ProgInfo_GetVersion     : constant := 16#2#;
   ProgInfo_SetLicenceType : constant := 16#3#;
   ProgInfo_GetLicenceType : constant := 16#4#;
   ProgInfo_SetTitle       : constant := 16#5#;
   ProgInfo_GetTitle       : constant := 16#6#;
   ProgInfo_SetURI         : constant := 16#7#;
   ProgInfo_GetURI         : constant := 16#8#;
   ProgInfo_GetWebEvent    : constant := 16#9#;
   ProgInfo_SetWebEvent    : constant := 16#A#;
   
   --

   function Get_Window_ID (ProgInfo : Object_ID;
                           Flags    : in System.Unsigned_Types.Unsigned := 0) return Object_ID is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_GetWindowID;
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Get_Window_ID: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
      return Object_ID(Register.R(0));
   end Get_Window_ID;

   --

   function Get_URI (ProgInfo : Object_ID;
                     Flags    : in System.Unsigned_Types.Unsigned := 0) return string is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
      Buffer_Size          : integer;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_GetURI;
      Register.R(3) := 0;
      Register.R(4) := 0;
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Get_URI(I): " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;

      Buffer_Size := integer(Register.R(4));

      declare
         Buffer : string(1..Buffer_Size);
      begin
         Register.R(0) := int(Unsigned_to_Int(Flags));
         Register.R(1) := int(ProgInfo);
         Register.R(2) := ProgInfo_GetURI;
         Register.R(3) := Adr_To_Int(Buffer'Address);
         Register.R(4) := int(Buffer_Size);
         Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

         if Error /= null then
            pragma Debug(Report("ToolboxProgInfo.Get_URI(II): " & To_Ada(Error.ErrMess)));
            OS.Raise_Error(Error);
         end if;
         return MemoryToString(Buffer'Address);
      end;
   end Get_URI;

   --

   function Get_Title (ProgInfo : Object_ID;
                       Flags    : in System.Unsigned_Types.Unsigned := 0) return string is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
      Buffer_Size          : integer;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_GetTitle;
      Register.R(3) := 0;
      Register.R(4) := 0;
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Get_Title(I): " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;

      Buffer_Size := integer(Register.R(4));

      declare
         Buffer : string(1..Buffer_Size);
      begin
         Register.R(0) := 0;
         Register.R(1) := int(ProgInfo);
         Register.R(2) := ProgInfo_GetTitle;
         Register.R(3) := Adr_To_Int(Buffer'Address);
         Register.R(4) := int(Buffer_Size);
         Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

         if Error /= null then
            pragma Debug(Report("ToolboxProgInfo.Get_Title(II): " & To_Ada(Error.ErrMess)));
            OS.Raise_Error(Error);
         end if;
         return MemoryToString(Buffer'Address);
      end;
   end Get_Title;

   --

   procedure Set_URI (ProgInfo : in Object_ID;
                      URI      : in string;
                      Flags    : in System.Unsigned_Types.Unsigned := 0) is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
      URI_0                : string := URI & ASCII.NUL;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_SetURI;
      Register.R(3) := Adr_To_Int(URI_0'Address);
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Set_URI: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
   end Set_URI;

   --

   procedure Set_Title (ProgInfo      : in Object_ID;
                        Title     : in string;
                        Flags     : in System.Unsigned_Types.Unsigned := 0) is

      Register     : aliased Kernel.swi_regs;
      Error        : oserror_access;
      Title_0      : string := Title & ASCII.NUL;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_SetTitle;
      Register.R(3) := Adr_To_Int(Title_0'Address);
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Set_Title: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
   end Set_Title;

   --

   function Get_License_Type (ProgInfo : Object_ID;
                              Flags    : in System.Unsigned_Types.Unsigned := 0) return License_Type is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_GetLicenceType;
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Get_License_Type: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
      return License_Type'Val(integer(Register.R(0)));
   end Get_License_Type;

   --

   procedure Set_License_Type (ProgInfo : in Object_ID;
                               License  : in License_Type;
                               Flags    : in System.Unsigned_Types.Unsigned := 0) is

      Register     : aliased Kernel.swi_regs;
      Error        : oserror_access;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_SetLicenceType;
      Register.R(3) := int(License_Type'Pos(License));
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Set_License_Type: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
   end Set_License_Type;

   --

   function Get_Version (ProgInfo : Object_ID;
                         Flags    : in System.Unsigned_Types.Unsigned := 0) return string is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
      Buffer_Size          : integer;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_GetVersion;
      Register.R(3) := 0;
      Register.R(4) := 0;
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Get_Version(I): " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;

      Buffer_Size := integer(Register.R(4));
      
      declare
         Buffer : string(1..Buffer_Size);
      begin
         Register.R(0) := 0;
         Register.R(1) := int(ProgInfo);
         Register.R(2) := ProgInfo_GetVersion;
         Register.R(3) := Adr_To_Int(Buffer'Address);
         Register.R(4) := int(Buffer_Size);
         Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

         if Error /= null then
            pragma Debug(Report("ToolboxProgInfo.Get_Version(II): " & To_Ada(Error.ErrMess)));
            OS.Raise_Error(Error);
         end if;
         return MemoryToString(Buffer'Address);
      end;
   end Get_Version;

   --

   procedure Set_Version (ProgInfo  : in Object_ID;
                          Version   : in string;
                          Flags     : in System.Unsigned_Types.Unsigned := 0) is

      Register     : aliased Kernel.swi_regs;
      Error        : oserror_access;
      Version_0    : string := Version & ASCII.NUL;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_SetVersion;
      Register.R(3) := Adr_To_Int(Version_0'Address);
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Set_Version: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
   end Set_Version;

   --

   function Get_Web_Event (ProgInfo : Object_ID;
                           Flags    : in System.Unsigned_Types.Unsigned := 0) return Toolbox_Event_Code_Type is

      Register             : aliased Kernel.swi_regs;
      Error                : oserror_access;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_GetWebEvent;
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Get_Web_Event: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
      return Toolbox_Event_Code_Type(integer(Register.R(0)));
   end Get_Web_Event;

   --

   procedure Set_Web_Event (ProgInfo : in Object_ID;
                            Event    : in Toolbox_Event_Code_Type;
                            Flags    : in System.Unsigned_Types.Unsigned := 0) is

      Register     : aliased Kernel.swi_regs;
      Error        : oserror_access;
   begin
      Register.R(0) := int(Unsigned_to_Int(Flags));
      Register.R(1) := int(ProgInfo);
      Register.R(2) := ProgInfo_SetWebEvent;
      Register.R(3) := int(integer(Event));
      Error := Kernel.swi(Toolbox_ObjectMiscOp,Register'Access,Register'Access);

      if Error /= null then
         pragma Debug(Report("ToolboxProgInfo.Set_Web_Event: " & To_Ada(Error.ErrMess)));
         OS.Raise_Error(Error);
      end if;
   end Set_Web_Event;

   --
   
end RASCAL.ToolboxProgInfo;
