parent $misc object $network_root var $root dbref 'network_root var $root child_index 4 var $root fertile 0 var $root manager $network_root var $root owned [$network_root] var $root owners [$network_root] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $root inited 1 var $network_root buffer `[] var $network_root ip "" var $network_root hostname "" var $network_root socket 0 var $network_root port 0 var $network_root active 0 method init_network_root (> .perms(caller(), $root) <); (> .reset_connection() <); . method uninit_network_root (> .perms(caller(), $root) <); (> .reset_connection() <); . method reset_connection // reset parameters to their default values (> .perms(caller(), $network_root) <); disconnect(); 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.connect(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 = hostname(ip); } . method disconnect arg [args]; if ((sender() != 0) || (sender() != this())) 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; // called by the server with an incoming buffer if (sender() != 0) throw(~perm, "Sender and caller are not the server"); lines = buffer_to_strings(buffer_append(buffer, incoming)); buffer = lines[listlen(lines)]; lines = sublist(lines, 1, listlen(lines) - 1); for line in (lines) .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 arg port, receiver; // bind to a port (> .perms(sender(), 'this) <); (> $sys.bind(port, receiver) <); . method unbind arg port; // unbind from a port (> .perms(sender(), 'this) <); (> $sys.unbind(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; .