/**
*
* Copyright 2021 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see .
*/
class Avarice extends Feature
config(AcediaAvarice);
struct AvariceLink
{
var string name;
var string host;
};
var private config array link;
var private LoggerAPI.Definition errorBadAddress;
protected function OnEnabled()
{
local int i;
local string host;
local int port;
local AvariceTCPLink nextTCPLink;
for (i = 0; i < link.length; i += 1)
{
if (!ParseAddress(link[i].host, host, port)) {
_.logger.Auto(errorBadAddress).Arg(_.text.FromString(link[i].name));
}
nextTCPLink = AvariceTCPLink(_.memory.Allocate(class'AvariceTCPLink'));
nextTCPLink.Connect(link[i].name, host, port);
}
}
protected function OnDisabled()
{
local LevelInfo level;
local AvariceTCPLink nextTCPLink;
level = _.unreal.GetLevel();
foreach level.DynamicActors(class'AvariceTCPLink', nextTCPLink) {
nextTCPLink.Destroy();
}
}
private final function bool ParseAddress(
string address,
out string host,
out int port)
{
local bool success;
local Parser parser;
parser = _.text.ParseString(address);
parser.Skip()
.MUntilS(host, _.text.GetCharacter(":"))
.MatchS(":")
.MUnsignedInteger(port)
.Skip();
success = parser.Ok() && parser.GetRemainingLength() == 0;
parser.FreeSelf();
return success;
}
defaultproperties
{
errorBadAddress = (l=LOG_Error,m="Cannot parse address \"%1\"")
}