Universität Ulm,
Fakultät für Mathematik und Wirtschaftswissenschaften,
SAI
SS 99 || Ferienprojekt zu Allgemeine Informatik II || Puzzle Library
MODULE PuzzleClient
MODULE PuzzleClient;
IMPORT Conclusions, Errors, InetTCP, Iterators, Networks,
Players := PuzzlePlayers, RelatedEvents, RemoteChessClocks,
RemoteObjects, RemotePuzzlePlayers, Resources, RobustObjects, Strings,
UnixNames;
CONST
dir = "/etc/puzzle/players";
VAR
portsOpened: BOOLEAN;
TYPE
ListOfPlayers = POINTER TO ListOfPlayersRec;
ListOfPlayersRec =
RECORD
player: Players.Player;
next: ListOfPlayers;
END;
VAR
exported: ListOfPlayers;
PROCEDURE OpenAllKindsOfPorts;
VAR
network: Networks.Network;
it: Iterators.Iterator;
port: Networks.Socket;
address: Networks.Address;
errors: RelatedEvents.Object;
BEGIN
NEW(errors); RelatedEvents.QueueEvents(errors);
Networks.GetNetworks(it);
WHILE Iterators.Get(it, network) DO
IF ~Networks.CreateSomeSocket(port, network, address, errors) OR
~RemoteObjects.AddPort(port, address, errors) THEN
Conclusions.Conclude(errors, Errors.error, "open ports");
END;
END;
portsOpened := TRUE;
END OpenAllKindsOfPorts;
PROCEDURE Export(player: Players.Player; name: ARRAY OF CHAR);
VAR
path: ARRAY 512 OF CHAR;
errors: RelatedEvents.Object;
element: ListOfPlayers;
BEGIN
IF ~portsOpened THEN OpenAllKindsOfPorts END;
IF name[0] = "/" THEN
COPY(name, path);
ELSE
path := dir; Strings.Concatenate(path, "/");
Strings.Concatenate(path, name);
END;
NEW(errors); RelatedEvents.QueueEvents(errors);
IF ~RobustObjects.Export(player, NIL, path, NIL, errors) THEN
Conclusions.Conclude(errors, Errors.fatal, name);
END;
NEW(element); element.player := player;
element.next := exported; exported := element;
END Export;
BEGIN
portsOpened := FALSE; exported := NIL;
END PuzzleClient.
SS 99 || Ferienprojekt zu Allgemeine Informatik II || Puzzle Library
Andreas Borchert, 26. Juli 1999