-- Remote I/O Server Services using a datagram character device
-- Copyright (C)2020-2023, Philip Munts dba Munts Technologies.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- * Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
WITH Ada.Exceptions;
WITH Ada.Strings.Fixed;
WITH Logging.libsimpleio;
WITH Messaging;
USE TYPE Messaging.Byte;
PACKAGE BODY RemoteIO.Server.Message64 IS
TASK BODY MessageHandlerTask IS
myname : String(1 .. 80);
messenger : Standard.Message64.Messenger;
executor : RemoteIO.Executive.Executor;
cmd : Standard.Message64.Message;
resp : Standard.Message64.Message;
BEGIN
-- Get objects from the constructor
ACCEPT SetName(name : String) DO
Ada.Strings.Fixed.Move(name, myname, Ada.Strings.Right);
END SetName;
ACCEPT SetMessenger(msg : Standard.Message64.Messenger) DO
messenger := msg;
END SetMessenger;
ACCEPT SetExecutor(exec : RemoteIO.Executive.Executor) DO
executor := exec;
END SetExecutor;
-- Message loop follows
Logging.libsimpleio.Note(Ada.Strings.Fixed.Trim(myname, Ada.Strings.Right) &
" Server ready");
LOOP
BEGIN
messenger.Receive(cmd);
executor.Execute(cmd, resp);
messenger.Send(resp);
EXCEPTION
WHEN Messaging.Timeout_Error =>
NULL;
WHEN Error : OTHERS =>
Logging.libsimpleio.Error("Caught exception " &
Ada.Exceptions.Exception_Name(Error) & ": " &
Ada.Exceptions.Exception_Message(error));
END;
END LOOP;
END MessageHandlerTask;
FUNCTION Create
(exec : NOT NULL RemoteIO.Executive.Executor;
name : String;
msg : NOT NULL Standard.Message64.Messenger) RETURN Instance IS
srv : InstanceSubclass;
BEGIN
-- Create the message handler task
srv.MessageHandler := NEW MessageHandlerTask;
-- Pass some information to the message handler task
srv.MessageHandler.SetName(name);
srv.MessageHandler.SetMessenger(msg);
srv.MessageHandler.SetExecutor(exec);
RETURN NEW InstanceSubclass'(srv);
END Create;
END RemoteIO.Server.Message64;