--------------------------------------------------------------------------------
--                                                                            --
-- 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    --
--                                                                            --
--------------------------------------------------------------------------------

-- @brief Printer types and methods.
-- $Author$
-- $Date$
-- $Revision$

with RASCAL.OS;             use RASCAL.OS;

with Interfaces.C;          use Interfaces.C;
with System.Unsigned_Types;

package RASCAL.Printer is

   --
   -- Returns true if the printermanager is running.
   --
   function Is_PrinterManager return boolean;

   --
   -- Returns the name of the currently selected printer.
   --
   function Get_PrinterName return String;

   --
   -- Returns various driver information.
   --
   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);

   --
   -- This message is sent by !Printers when it receives a DataSave or PrintSave message. The task can do the following :
   --#tab
   --\tIgnore. !Printers will send DataSaveAck, to save the file for later printing.
   --\tRespond with WillPrint, to send data to Printer:
   --\tPut data in {fcode}Printer$Temp{f} and send DataLoad.
   --#tab
   --
   type Message_PrintFile is
   record
   Header         : Message_Event_Header;
   Window         : Wimp_Handle_Type;
   Icon           : Icon_Handle_Type;
   Screen_X       : Integer;
   Screen_Y       : Integer;
   Size           : Integer;
   File_Type      : Integer;
   Leafname       : Char_Array(1..200);
   end record;
   pragma Convention (C, Message_PrintFile);

   type Message_PrintFile_Pointer is access Message_PrintFile;

   type AMEL_Message_PrintFile is abstract new
        Message_EventListener(Message_Event_PrintFile) with
   record
   Event : Message_PrintFile_Pointer;
   end record;

   --
   -- This message is sent to !Printers on receipt of a PrintFile message to indicate that printing will occur directly to Printer:
   --Use of this message is depreciated, and PrintTypeOdd protocol should be used in preference.
   --
   type Message_WillPrint is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_WillPrint);

   type Message_WillPrint_Pointer is access Message_WillPrint;

   type AMEL_Message_WillPrint is abstract new
        Message_EventListener(Message_Event_WillPrint) with
   record
   Event : Message_WillPrint_Pointer;
   end record;

   --
   -- This message is sent to !Printers to initiate a print session.
   --This should be sent recorded delivery (code 18), and if it bounces then you should complain that no printer driver is present.
   --
   --Printers will respond with one of :
   --\tPrintError if the printer is busy.
   --\tPrintFile (for compatability with RISC OS 2 applications).
   --\tPrintTypeOdd if it doesn't know how to print the file.
   --\tDataSaveAck if the file should be saved for queueing (later, a PrintTypeOdd message will be broadcast).
   --
   type Message_PrintSave is
   record
   Header         : Message_Event_Header;
   Unused         : Integer;
   Unused2        : Integer;
   Unused3        : Integer;
   Unused4        : Integer;
   Size           : Integer;
   File_Type      : Integer;
   Leafname       : Char_Array(1..200);
   end record;
   pragma Convention (C, Message_PrintSave);

   type Message_PrintSave_Pointer is access Message_PrintSave;

   type AMEL_Message_PrintSave is abstract new
        Message_EventListener(Message_Event_PrintSave) with
   record
   Event : Message_PrintSave_Pointer;
   end record;

   --
   -- This message is sent by !Printers when it has loaded. All other printer drivers should quit quietly on receiving this message.
   --The PRM's do not specify what should happen if the active printer driver is 'actively' printing.
   --I would recommend that such drivers should complain and send PreQuit followed by Quit to the originator of such messages.
   --
   type Message_PrintInit is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PrintInit);

   type Message_PrintInit_Pointer is access Message_PrintInit;

   type AMEL_Message_PrintInit is abstract new
        Message_EventListener(Message_Event_PrintInit) with
   record
   Event : Message_PrintInit_Pointer;
   end record;

   --
   -- This message is sent by !Printers if an error occurs during printing.
   --
   type Message_PrintError is
   record
   Header         : Message_Event_Header;
   Error_Number   : Integer;
   Error_Message  : Char_Array(1..208);
   end record;
   pragma Convention (C, Message_PrintError);

   type Message_PrintError_Pointer is access Message_PrintError;

   type AMEL_Message_PrintError is abstract new
        Message_EventListener(Message_Event_PrintError) with
   record
   Event : Message_PrintError_Pointer;
   end record;

   --
   -- This message is sent by !Printers when it doesn't know how to print the file.
   --The filetype and filename cannot be relied on if we have just come from a PrintSave message.
   --If an application knows how to print that filetype then it should respond with PrintTypeKnown and either:
   --\tPrint the file to Printer:
   --\tOutput the file to Printer$Temp {/}before{/} responding with PrintTypeKnown.
   --If it does not know the type, then it should ignore the message and await a DataSaveAck,
   --(which may never arrive if another application knows how to print the file), to queue the file for later printing.
   --
   type Message_PrintTypeOdd is
   record
   Header         : Message_Event_Header;
   File_Type      : Integer;
   Leafname       : Char_Array(1..200);
   end record;
   pragma Convention (C, Message_PrintTypeOdd);

   type Message_PrintTypeOdd_Pointer is access Message_PrintTypeOdd;

   type AMEL_Message_PrintTypeOdd is abstract new
        Message_EventListener(Message_Event_PrintTypeOdd) with
   record
   Event : Message_PrintTypeOdd_Pointer;
   end record;

   --
   -- This message is sent to !Printers to indicate that an application has printed, or is printing a file.
   --
   type Message_PrintTypeKnown is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PrintTypeKnown);

   type Message_PrintTypeKnown_Pointer is access Message_PrintTypeKnown;

   type AMEL_Message_PrintTypeKnown is abstract new
        Message_EventListener(Message_Event_PrintTypeKnown) with
   record
   Event : Message_PrintTypeKnown_Pointer;
   end record;

   --
   -- This message is sent by !Printers to indicate that the printer settings or selection has changed.
   --
   type Message_SetPrinter is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_SetPrinter);

   type Message_SetPrinter_Pointer is access Message_SetPrinter;

   type AMEL_Message_SetPrinter is abstract new
        Message_EventListener(Message_Event_SetPrinter) with
   record
   Event : Message_SetPrinter_Pointer;
   end record;

   --
   --This message is sent by !FontPrint to !Printers to ask for information.
   --If the buffer size is not zero then the data placed in the buffer should be :
   --\tCurrent printer name
   --\tCurrent printer type
   --\tPathname to printer font file
   --!Printers should always respond by placing the size of the buffer in the block and sending PSPrinterAck.
   --
   type Message_PSPrinterQuery is
   record
   Header         : Message_Event_Header;
   Buffer_Address : System.Unsigned_Types.Unsigned;
   Buffer_Size    : Integer;
   end record;
   pragma Convention (C, Message_PSPrinterQuery);

   type Message_PSPrinterQuery_Pointer is access Message_PSPrinterQuery;

   type AMEL_Message_PSPrinterQuery is abstract new
        Message_EventListener(Message_Event_PSPrinterQuery) with
   record
   Event : Message_PSPrinterQuery_Pointer;
   end record;

   --
   --This message is sent by !Printers to !FontPrint to notify that it has either filled in the block required by PSPrinterQuery,
   --or to tell it the size of the block required.
   --If !FontPrint does not receive this message then it should report an error as no printer is installed.
   --
   type Message_PSPrinterAck is
   record
   Header         : Message_Event_Header;
   Buffer_Size    : Integer;
   end record;
   pragma Convention (C, Message_PSPrinterAck);

   type Message_PSPrinterAck_Pointer is access Message_PSPrinterAck;

   type AMEL_Message_PSPrinterAck is abstract new
        Message_EventListener(Message_Event_PSPrinterAck) with
   record
   Event : Message_PSPrinterAck_Pointer;
   end record;

   --
   -- This message is sent by !FontPrint when the font list file has changed.
   --The printer driver should re-read the file on receipt.
   --
   type Message_PSPrinterModified is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PSPrinterModified);

   type Message_PSPrinterModified_Pointer is access Message_PSPrinterModified;

   type AMEL_Message_PSPrinterModified is abstract new
        Message_EventListener(Message_Event_PSPrinterModified) with
   record
   Event : Message_PSPrinterModified_Pointer;
   end record;

   --
   -- This message is sent by !FontPrint when the font list file should be reset to its default state.
   --The printer driver should respond with PSPrinterDefaulted.
   --
   type Message_PSPrinterDefaults is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PSPrinterDefaults);

   type Message_PSPrinterDefaults_Pointer is access Message_PSPrinterDefaults;

   type AMEL_Message_PSPrinterDefaults is abstract new
        Message_EventListener(Message_Event_PSPrinterDefaults) with
   record
   Event : Message_PSPrinterDefaults_Pointer;
   end record;

   --
   -- This message is sent by !Printers when the font list has been reset.
   --This is usually in response to PSPrinterDefault.
   --
   type Message_PSPrinterDefaulted is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PSPrinterDefaulted);

   type Message_PSPrinterDefaulted_Pointer is access Message_PSPrinterDefaulted;

   type AMEL_Message_PSPrinterDefaulted is abstract new
        Message_EventListener(Message_Event_PSPrinterDefaulted) with
   record
   Event : Message_PSPrinterDefaulted_Pointer;
   end record;

   --
   -- This message is sent by !Printers if it receives PSPrinterQuery and the currently selected printer is not postscript.
   --
   type Message_PSPrinterNotPS is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PSPrinterNotPS);

   type Message_PSPrinterNotPS_Pointer is access Message_PSPrinterNotPS;

   type AMEL_Message_PSPrinterNotPS is abstract new
        Message_EventListener(Message_Event_PSPrinterNotPS) with
   record
   Event : Message_PSPrinterNotPS_Pointer;
   end record;

   --
   -- This message is sent to !Printers to ensure that the printer settings are correct for the currently selected printer.
   --
   type Message_ResetPrinter is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_ResetPrinter);

   type Message_ResetPrinter_Pointer is access Message_ResetPrinter;

   type AMEL_Message_ResetPrinter is abstract new
        Message_EventListener(Message_Event_ResetPrinter) with
   record
   Event : Message_ResetPrinter_Pointer;
   end record;

   --
   -- If !FontPrint is running it will acknowledge this message.
   --
   type Message_PSIsFontPrintRunning is
   record
   Header         : Message_Event_Header;
   end record;
   pragma Convention (C, Message_PSIsFontPrintRunning);

   type Message_PSIsFontPrintRunning_Pointer is access Message_PSIsFontPrintRunning;

   type AMEL_Message_PSIsFontPrintRunning is abstract new
        Message_EventListener(Message_Event_PSIsFontPrintRunning) with
   record
   Event : Message_PSIsFontPrintRunning_Pointer;
   end record;
 
end RASCAL.Printer;
