package wml_net;
use strict;
use wml;
use IO::Socket;

%wml_net::outgoing_schemas = ();
%wml_net::incoming_schemas = ();

sub connect
{
	my ($host,$port) = @_;
	my $sock = IO::Socket::INET->new(PeerAddr => $host,
	                             PeerPort => $port,
				     Proto => 'tcp',
				     Type => SOCK_STREAM)
			   or die "Could not connect to $host:$port: $@\n";
	print $sock pack('N',0) or die "Could not send initial handshake";

	my $connection_num = "";
	read $sock, $connection_num, 4;
	die "Could not read connection number" if length($connection_num) != 4;

	$wml_net::outgoing_schemas{$sock} = [];
	$wml_net::incoming_schemas{$sock} = [];
	return $sock;
}

sub disconnect
{
	my ($sock) = @_;
	delete($wml_net::outgoing_schemas{$sock});
	delete($wml_net::incoming_schemas{$sock});
	close $sock;
}

sub read_packet
{
	my ($sock) = @_;
	my $buf = '';
	read $sock, $buf, 4;
	die "Could not read length" if length($buf) != 4;

	my $len = unpack('N',$buf);

	my $res = "\0" * $len;
	my $count = 0;
	while($len > $count) {
		$buf = '';
		my $bytes = $len - $count;
		read $sock, $buf, $bytes or die "Error reading socket: $!";
		substr($res, $count, length $buf) = $buf;
		$count += length $buf;
	}

	$res = substr($res,0,$len-1);

	return &wml::read_binary($wml_net::incoming_schemas{$sock},$res);
}

sub write_packet
{
	my ($sock,$doc) = @_;

	my $data = &wml::write_binary($wml_net::outgoing_schemas{$sock},$doc);
	my $header = pack('N',length $data);
	print $sock "$header$data" or die "Error writing to socket: $!";
}

'Wesnoth network protocol';
