with Ada.Text_Io; use Ada.Text_Io;
with Ada.Exceptions ; use Ada.Exceptions;
with Ada.Streams; use Ada.Streams;
with GNAT.Source_Info ; use GNAT.Source_Info;
package body logging.socket is
package GS Renames GNAT.Sockets;
function Create (port : GNAT.Sockets.Port_Type ;
host : String := "127.0.0.1" )
return SocketDestinationPtr_Type is
result : constant SocketDestinationPtr_Type := new SocketDestination_Type ;
he : constant GNAT.Sockets.Host_Entry_Type := GS.Get_Host_By_Name (host);
begin
GS.Create_Socket( result.s ,
mode => GS.Socket_Datagram ,
level => GS.IP_Protocol_For_UDP_Level);
result.dest := new GS.Sock_Addr_Type ;
if GS.Addresses_Length (he) < 1
then
raise Program_Error with "Unknown host " & host ;
end if ;
result.dest.all := GS.Network_Socket_Address( addr => GS.Addresses(he,1) ,
port => port );
return result ;
exception
when e : others =>
Put_Line(Exception_Message(e));
Put("Exception in "); Put(Enclosing_Entity); New_Line ;
raise ;
end Create ;
overriding
procedure SendMessage
( dest : in out SocketDestination_Type ;
message : String ;
level : message_level_type := INFORMATIONAL ;
source : String := Default_Source_Name ;
class : String := Default_Message_Class ) is
m : aliased Message_Type ;
payload : Ada.Streams.Stream_Element_Array( 1..m'Size/8 );
for payload'Address use m'Address;
last : Ada.Streams.Stream_Element_Offset ;
begin
m.t := Ada.Calendar.Clock ;
m.Seq := dest.Count + 1;
m.l := level ;
m.s := source ;
m.c := class ;
if message'Length > MAX_MESSAGE_SIZE
then
m.ml := MAX_MESSAGE_SIZE ;
m.mt := message(1..MAX_MESSAGE_SIZE);
else
m.ml := message'Length ;
m.mt(1..message'Length) := message ;
end if ;
GS.Send_Socket( dest.s , payload , last , to => dest.dest );
if last /= m'Size/8
then
raise Program_Error with "Truncated datagram";
end if ;
dest.Count := @ + 1 ;
end SendMessage;
overriding
procedure Close(dest : SocketDestination_Type) is
begin
GS.Close_Socket( dest.s );
end Close ;
end logging.socket ;