POE-Component-SmokeBox-Recent

 view release on metacpan or  search on metacpan

lib/POE/Component/SmokeBox/Recent.pm  view on Meta::CPAN

  my $self = bless \%opts, $package;
  $self->{recent} = [];
  $self->{uri} = URI->new( $self->{url} );
  croak "url provided is of an unsupported scheme\n"
	unless $self->{uri}->scheme and $self->{uri}->scheme =~ /^(ht|f)tp|file$/;
  $self->{session_id} = POE::Session->create(
	object_states => [
	   $self => [ qw(_start _process_http _process_ftp _process_file _recent _sig_child _epoch _epoch_fail) ],
	   $self => {
		      http_sockerr  => '_get_connect_error',
		      http_timeout  => '_get_connect_error',
		      http_response => '_http_response',
		      ftp_sockerr   => '_get_connect_error',
		      ftp_error     => '_get_error',
		      ftp_data      => '_get_data',
		      ftp_done      => '_get_done', },
	],
	heap => $self,
	( ref($options) eq 'HASH' ? ( options => $options ) : () ),
  )->ID();
  return $self;
}

sub _start {
  my ($kernel,$sender,$self) = @_[KERNEL,SENDER,OBJECT];
  $self->{session_id} = $_[SESSION]->ID();
  if ( $kernel == $sender and !$self->{session} ) {
	croak "Not called from another POE session and 'session' wasn't set\n";
  }
  my $sender_id;
  if ( $self->{session} ) {
    if ( my $ref = $kernel->alias_resolve( $self->{session} ) ) {
	$sender_id = $ref->ID();
    }
    else {
	croak "Could not resolve 'session' to a valid POE session\n";
    }
  }
  else {
    $sender_id = $sender->ID();
  }
  $kernel->refcount_increment( $sender_id, __PACKAGE__ );
  $kernel->detach_myself();
  $self->{sender_id} = $sender_id;
  if ( $self->{epoch} ) {
    $kernel->yield( '_epoch' );
    return;
  }
  $kernel->yield( '_process_' . $self->{uri}->scheme );
  return;
}

sub _recent {
  my ($kernel,$self,$type) = @_[KERNEL,OBJECT,ARG0];
  my $target = delete $self->{sender_id};
  my %reply;
  $reply{recent} = delete $self->{recent} if $self->{recent};
  $reply{error} = delete $self->{error} if $self->{error};
  $reply{context} = delete $self->{context} if $self->{context};
  $reply{url} = delete $self->{url};
  @{ $reply{recent} } = grep { my @parts = split m!/!; $parts[3] !~ m!^perl6$!i } @{ $reply{recent} };
  my $event = delete $self->{event};
  $kernel->post( $target, $event, \%reply );
  $kernel->refcount_decrement( $target, __PACKAGE__ );
  return;
}

sub _process_http {
  my ($kernel,$self) = @_[KERNEL,OBJECT];
  my @path = $self->{rss} ? ( 'modules', '01modules.mtime.rss' ) : ( 'RECENT' );
  $self->{uri}->path( File::Spec::Unix->catfile( $self->{uri}->path(), @path ) );
  POE::Component::SmokeBox::Recent::HTTP->spawn(
	uri => $self->{uri},
  );
  return;
}

sub _http_response {
  my ($kernel,$self,$response) = @_[KERNEL,OBJECT,ARG0];
  if ( $response->code() == 200 ) {
    if ( $self->{rss} ) {
      for ( split /\n/, $response->content() ) {
        next unless m#<link>(.+?)</link>#i;
        next unless m#by-authors#i;
        my ($link) = $_ =~ m#id/(.+?)</link>\s*$#i;
        next unless $link;
        unshift @{ $self->{recent} }, $link;
      }
    }
    else {
      for ( split /\n/, $response->content() ) {
        next unless /^authors/;
        next unless /\.(tar\.gz|tgz|tar\.bz2|zip)$/;
        s!authors/id/!!;
        push @{ $self->{recent} }, $_;
      }
    }
  }
  else {
    $self->{error} = $response->as_string();
  }
  $kernel->yield( '_recent', 'http' );
  return;
}

sub _process_ftp {
  my ($kernel,$self) = @_[KERNEL,OBJECT];
  my @path = $self->{rss} ? ( 'modules', '01modules.mtime.rss' ) : ( 'RECENT' );
  POE::Component::SmokeBox::Recent::FTP->spawn(
        Username => 'anonymous',
        Password => 'anon@anon.org',
        address  => $self->{uri}->host,
	      port	   => $self->{uri}->port,
	      path     => File::Spec::Unix->catfile( $self->{uri}->path, @path ),
  );
  return;
}

sub _get_connect_error {
  my ($kernel,$self,@args) = @_[KERNEL,OBJECT,ARG0..$#_];
  $self->{error} = join ' ', @args;



( run in 1.102 second using v1.01-cache-2.11-cpan-71847e10f99 )