package NetHirc::Pipe;

use strict;
use warnings;

use POE qw(Kernel Session Wheel::Run);

use NetHirc::Util;

my @events = qw(
_start
_stop
error
stdout
stderr
closed
);

sub new
{
    shift;
    POE::Session->create(
	'package_states' => [ 'NetHirc::Pipe' => [ @events ] ],
	'args'  => [ @_ ],
    );
}

sub _start
{
    my $kernel = $_[KERNEL];
    debug('p', "begin");
    my $heap = $_[HEAP];
    my %args = @_[ARG0..$#_];
    my $wheel = new POE::Wheel::Run(
	Program => $args{'Command'},
	ErrorEvent => 'error',
	StdoutEvent => 'stdout',
	StderrEvent => 'stderr',
	CloseEvent => 'closed',
    );
    $heap->{'wheel'} = $wheel;
    $heap->{'display'} = $args{'Display'};
    $heap->{'error'} = $args{'Error'};
    $heap->{'close'} = $args{'Close'};
}

sub _stop
{
    my $heap = $_[HEAP];
    delete $heap->{'wheel'};
}

sub closed
{
    my $heap = $_[HEAP];
    my $close = $heap->{'close'};
    $close->() if $close;
}

sub error
{
    debug('p', "error");
    my ($heap, $op, $errnum, $errstr) = @_[HEAP, ARG0..ARG2];
    if ($op eq 'read' and not $errstr)
    {
	my $close = $heap->{'close'};
	$close->() if $close;
    }
    else
    {
	my $error = $heap->{'error'};
	$error->($op, $errstr);
    }
    delete $heap->{'wheel'};
}

sub stdout
{
    debug('p', "stdout");
    my ($heap, $output) = @_[HEAP, ARG0];
    my $display = $heap->{'display'};
    $display->($output);
}

sub stderr
{
    debug('p', "stderr");
    my ($heap, $output) = @_[HEAP, ARG0];
    my $display = $heap->{'display'};
    $display->($output);
}

1;
__END__


syntax highlighted by Code2HTML, v. 0.9.1