parent $network_root
object $network
var $root dbref 'network
var $root child_index 4
var $root fertile 0
var $root manager $network
var $root owned [$network]
var $root owners [$network]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $network buffer `[]
var $network ip ""
var $network hostname ""
var $network socket 0
var $network port 0
var $network active 0
var $network line_buffer []
method init_network
(> .perms(caller(), $root) <);
(> .reset_connection() <);
.
method uninit_network
(> .perms(caller(), $root) <);
(> .reset_connection() <);
.
method reset_connection
// reset parameters to their default values
(> .perms(caller(), $network) <);
close_connection();
buffer = `[];
line_buffer = [];
ip = "";
hostname = "";
port = 0;
socket = 0;
active = 0;
.
method failed
arg socket;
// called by the server when unable to make a connection.
if ((sender() != 0) || (sender() != this()))
throw(~perm, "Sender is not the server");
.receive("CONNECTION FAILED; socket: " + tostr(socket), 'connection_failed);
// we weren't ever connected, but this will reset us.
(| .close() |);
.
method open
arg addr, port;
// open a connection to <addr> on <port>
(> .perms(sender()) <);
if (active)
throw(~engaged, (.namef('ref)) + " is currently engaged.");
// reset for good measure
(> .reset_connection() <);
// set the active bit.
.set_active(1);
// set the ip or addr, if children want they can redefine .set_*
// to check for hostname() or whatever.
if (toint(addr))
.set_ip(addr);
else
.set_hostname(addr);
.set_port(port);
// try to open it
(> $sys.open_connection(addr, port, this()) <);
.
method close
// close the connection
(> .perms(sender()) <);
(> .reset_connection() <);
.receive("Connection Closed.", 'connection_closed);
.
method connect
arg [args];
// called by the server when a successful connection is made
if (sender() != 0)
throw(~perm, "Sender is not the server");
.receive("CONNECTION ESTABLISHED; " + ($data.unparse(args)), 'connection_established);
// This is ugly, will be fixed when networking is fixed in the driver
if (type(args[1]) == 'integer) {
socket = args[1];
} else {
ip = args[1];
socket = args[2];
hostname = $sys.hostname(ip);
}
.
method disconnect
arg [args];
if (sender() != 0)
throw(~perm, "Sender is not the server");
(> .close() <);
.
method receive
arg line, status;
// receive a string, called by .parse()
.
method parse
arg incoming;
var lines, line, index;
// called by the server with an incoming buffer
if (sender())
throw(~perm, "Sender and caller are not the server");
lines = buffer_to_strings(buffer_append(buffer, incoming));
index = listlen(lines);
buffer = lines[index];
lines = delete(lines, index);
line_buffer = [@line_buffer, @lines];
while (line_buffer) {
line = line_buffer[1];
line_buffer = delete(line_buffer, 1);
(| .receive(line, 'external) |);
}
.
method send
arg what;
var line;
// send off a string or list of strings. Calls .echo()
if (type(what) == 'list) {
for line in (what)
.send(line);
} else {
.echo(what, 'string);
}
.
method echo
arg what, type;
// send off a string or buffer
(> .perms(sender()) <);
switch (type) {
case 'string:
(> echo(buffer_from_strings([what])) <);
case 'buffer:
(> echo(what) <);
}
.
method bind_port
arg port, receiver;
// bind to a port
(> .perms(sender(), 'this) <);
(> $sys.bind_port(port, receiver) <);
.
method unbind_port
arg port;
// unbind from a port
(> .perms(sender(), 'this) <);
(> $sys.unbind_port(port) <);
.
method ip
(> .perms(sender(), 'trusts) <);
return ip;
.
method hostname
(> .perms(sender(), 'trusts) <);
return hostname;
.
method port
(> .perms(sender(), 'trusts) <);
return port;
.
method socket
(> .perms(sender(), 'trusts) <);
return socket;
.
method active
(> .perms(sender(), 'trusts) <);
return active;
.
method set_ip
arg str;
(> .perms(sender(), 'this) <);
ip = str;
.
method set_hostname
arg str;
(> .perms(sender(), 'this) <);
hostname = str;
.
method set_port
arg int;
(> .perms(sender(), 'this) <);
port = int;
.
method set_socket
arg int;
(> .perms(sender(), 'this) <);
socket = int;
.
method set_active
arg bit;
(> .perms(sender(), 'this) <);
active = bit;
.