=pod

=head1 NAME

examples/socket_anyevent.pl - AnyEvent version of examples/socket.pl with automatic selection of Event library

=head1 AUTHOR

Vikas N Kumar

=cut

use strict;
use warnings;
use Prima qw(InputLine Edit Application);
use AnyEvent;
use AnyEvent::Socket;

my $loop = AnyEvent->condvar;
my $impl = AnyEvent::detect;
print "AnyEvent implementation is $impl\n";

my $w = Prima::MainWindow-> create(
	size      => [ $::application-> width * 0.6, $::application-> height * 0.6],
	text      => 'AnyEvent demo',
    onDestroy => sub {
        # when the window is closed we want AnyEvent to also exit
        $loop->send;
    },
);

my $e = $w-> insert( Edit =>
	pack     => { side => 'top', expand => 1, fill => 'both'},
	text     => '',
	wordWrap => 1,
);

my $il = $w-> insert( InputLine =>
	text      => 'Enter URL:',
	current   => 1,
	pack      => { side => 'bottom', fill => 'x'},
	onKeyDown => sub {
	    my ( $me, $code, $key, $mod) = @_;
	    return unless $key == kb::Enter;
	    $me-> clear_event;
	    my $t = $me-> text;

	    return $e-> text( "Invalid URL") unless $t =~ m/^(?:http:\/\/)?([^\/]*)((?:\/.*$)|$)/;
    	my ($remote, $uri, $port) = ($1,$2,80);
	    $uri = '/' unless length $uri;

        $e-> text("");

        tcp_connect $remote, $port, sub {
            my ($fh, $host, $port) = @_;

			return $e-> text("error:$!") unless $fh;

            # make a GET request on the socket
            syswrite $fh, "GET $uri HTTP/1.1 \r\n\r\n";
            shutdown $fh, 1;

            # create an event watcher on the socket $fh for reading
            my $ev;
            $ev = AnyEvent->io(fh => $fh, poll => 'r', cb => sub {
                my $response = '';
                my $len = sysread $fh, $response, 10240;
                if (not defined $len or $len <= 0) {
                    undef $ev; # remove the watcher
		        } else {
			        $e-> text( $e->text . $response );
                }
            });
       };
       0; # keep void context of tcp_connect
    },
);
$il-> select_all;

# replace 'run Prima' with the below timer
my $timer = AnyEvent->timer(after => 0, interval => 1/20, cb => sub {
        $::application->yield;
});
# start the AnyEvent loop
$loop->recv;