Changeset 5826
- Timestamp:
- 07/04/09 15:27:42 (3 years ago)
- Location:
- trunk/Padre-Plugin-Swarm
- Files:
-
- 4 added
- 8 edited
- 1 moved
-
Makefile.PL (modified) (1 diff)
-
irc_gw.pl (modified) (1 diff)
-
lib/Padre/Plugin/Swarm (added)
-
lib/Padre/Plugin/Swarm.pm (modified) (2 diffs)
-
lib/Padre/Plugin/Swarm/share (moved) (moved from trunk/Padre-Plugin-Swarm/share)
-
lib/Padre/Swarm/Service.pm (added)
-
lib/Padre/Swarm/Service/Chat.pm (modified) (4 diffs)
-
lib/Padre/Swarm/Transport.pm (added)
-
lib/Padre/Swarm/Transport/IRC.pm (modified) (1 diff)
-
lib/Padre/Swarm/Transport/Multicast.pm (modified) (12 diffs)
-
lib/Padre/Wx/Swarm/Chat.pm (modified) (1 diff)
-
t/05_transport.t (modified) (1 diff)
-
t/06_service.t (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Padre-Plugin-Swarm/Makefile.PL
r5735 r5826 5 5 requires IO::Socket::Multicast 0 6 6 requires IO::Select 0 7 requires Params::Util 8 requires Class::XSAccessor 9 requires Class::AutoUse 7 10 test_requires Test::More 0.42 8 11 install_share -
trunk/Padre-Plugin-Swarm/irc_gw.pl
r5739 r5826 44 44 45 45 my $c = AnyEvent->condvar; 46 47 # display all irc messages for debugging48 #$con->reg_cb ('irc_*' => sub { warn "DEBUG: " . join ('|', %{$_[1]}) . "\n"; });49 46 50 47 $con->reg_cb ( -
trunk/Padre-Plugin-Swarm/lib/Padre/Plugin/Swarm.pm
r5808 r5826 124 124 125 125 my $chatframe = Padre::Wx::Swarm::Chat->new($self->main); 126 126 127 #my $sidebar = Padre::Wx::Swarm::VectorScope->new($self->main); 127 128 128 #my $sidebar = Padre::Wx::Swarm::Foo->new($self->main); 129 129 #$self->set_sidebar( $sidebar ); … … 142 142 } 143 143 144 # private subroutine to return the current share directory location 145 sub _sharedir { 146 return Cwd::realpath( 147 File::Spec->join(File::Basename::dirname(__FILE__),'Swarm/share') 148 ); 149 } 150 151 144 152 #sub _start_transports { 145 153 # my $self = shift; -
trunk/Padre-Plugin-Swarm/lib/Padre/Swarm/Service/Chat.pm
r5822 r5826 6 6 use Time::HiRes (); 7 7 use Padre::Swarm::Transport::Multicast (); 8 use Padre::S ervice ();8 use Padre::Swarm::Service (); 9 9 my $marshal = JSON::XS->new->allow_blessed->convert_blessed; 10 10 11 our @ISA = 'Padre::S ervice';11 our @ISA = 'Padre::Swarm::Service'; 12 12 13 13 use Class::XSAccessor … … 26 26 my $self = shift; 27 27 Padre::Util::debug('Starting chat service'); 28 my $mc = Padre::Swarm::Transport::Multicast->new(); 29 $mc->subscribe_channel( $_ ) 28 $self->_attach_transports; 29 Padre::Util::debug('Chat transports attached'); 30 Padre::Util::debug( $self->transport ); 31 32 $self->transport->subscribe_channel( $_ ) 30 33 for $self->service_channels; 31 $mc->start; 32 $self->set_transport( $mc ); 34 35 Padre::Util::debug('Channels subscribed'); 36 $self->transport->start; 33 37 Time::HiRes::sleep(0.5); # QUACKERY.. socket construction? 34 38 $self->queue->enqueue( { type=>'disco' , want=>['chat'] } ); … … 50 54 my @messages; 51 55 push @messages, 52 $self->transport->receive_from_ sock($_)56 $self->transport->receive_from_channel($_) 53 57 for @ready; 54 58 while ( my ($payload,$frame) = splice(@messages,0,2) ) { … … 88 92 89 93 sub new { 90 my ($class,$config) = @_; 91 92 my $running : shared = 0 ; 93 my $self = bless {running=>$running} , $class; 94 my ($class,%config) = @_; 95 my $self = bless {%config} , $class; 94 96 return $self; 95 97 } -
trunk/Padre-Plugin-Swarm/lib/Padre/Swarm/Transport/IRC.pm
r5825 r5826 1 package Padre:: Transport::IRC;1 package Padre::Swarm::Transport::IRC; 2 2 3 3 use strict; 4 4 use warnings; 5 use Padre::Swarm::Transport; 5 6 7 use AnyEvent; 8 use AnyEvent::IRC::Client; 9 use Class::XSAccessor 10 getters => { 11 connection => 'connection', 12 condvar => 'condvar', 13 }; 14 6 15 use Carp; 7 16 17 our @ISA = 'Padre::Swarm::Transport'; 18 19 20 8 21 sub start { 22 my $self = shift; 23 24 my $con = AnyEvent::IRC::Client->new; 25 $con->connect ( 26 "irc.perl.org" => 6667 , 27 { nick => 'swarm_submersible' , 28 user => 'Padre-Swarm-Transport-IRC' , 29 real => getlogin() 30 } 31 ); 32 $self->{connection} = $con; 33 my $c = AnyEvent->condvar; 34 $self->{condvar} = $c; 35 36 37 38 } 39 40 sub shutdown { 41 my $self = shift; 42 $self->connection->disconnect; 43 delete $self->{connection}; 44 } 45 46 sub _register_irc_callbacks { 47 my ($self,$con) = @_; 48 49 50 $con->reg_cb ( 51 connect => sub { 52 my ($con, $err) = @_; 53 if (defined $err) { 54 warn "Connect ERROR! => $err\n"; 55 $self->condvar->broadcast; 56 } else { 57 warn "Connected! Yay!\n"; 58 } 59 60 $con->register( 61 $self->nickname, 62 'Padre-Swarm-Transport-IRC', 63 , getlogin() 64 ); 65 $con->send_srv( JOIN => '#padre' ); 66 67 }, 68 disconnect => sub { 69 warn "Oh, got a disconnect: $_[1], exiting...\n"; 70 $self->condvar->broadcast; 71 } 72 ); 73 74 $con->reg_cb( 75 publicmsg => sub { 76 my ($handle,$channel,$ircmsg)= @_; 77 my $nick = $con->nick; 78 79 my $body = join (' ',@{ $ircmsg->{params} } ); 80 my $msg = { 81 user => $ircmsg->{prefix}, 82 message => $body , 83 type => 'chat', 84 }; 85 my $frame = { 86 address => $handle, 87 channel => $channel, 88 }; 89 warn "Publick message in $channel from $handle"; 90 push @{ $self->{incoming_buffer}{$channel} }, [$msg,$frame]; 91 92 } 93 ); 94 95 96 } 97 98 99 sub _connect_channel { 100 my ($self,$channel) = @_; 101 my $con = $self->connection; 102 my $room = '#padre_swarm_' . $channel; 103 warn "Join #padre"; 104 $con->send_srv( JOIN => '#padre' ); 105 } 106 107 108 109 sub poll { 110 my ($self,$time) = @_; 111 warn "Polling for $time:"; 112 $self->condvar->recv(); 113 if ( keys %{ $self->{incoming_buffer} } ) { 114 return keys %{ $self->{incoming_buffer} }; 115 } 116 117 } 118 119 sub receive_from_channel { 120 my ($self,$channel) = @_; 121 return unless exists $self->{incoming_buffer}{$channel}; 122 shift @{ $self->{incoming_buffer}{$channel} }; 9 123 10 124 } 11 125 12 13 sub shutdown { 126 sub tell_channel { 127 my ($self,$channel,$payload) = @_; 128 my $con = $self->connection; 14 129 15 130 $con->send_chan( '#padre', 'PRIVMSG', 131 '#padre', 132 $payload 133 ); 16 134 } 17 18 sub poll {19 20 }21 22 135 1; -
trunk/Padre-Plugin-Swarm/lib/Padre/Swarm/Transport/Multicast.pm
r5815 r5826 5 5 use IO::Select (); 6 6 use IO::Socket::Multicast; 7 use Padre::Swarm::Transport; 7 8 use Params::Util qw( _INSTANCE _POSINT ); 8 9 use Carp qw( confess croak ); … … 13 14 selector => 'selector', 14 15 started => 'started', 16 sockets => 'sockets', 15 17 }; 16 18 17 19 use constant MCAST_GROUP => '239.255.255.1'; 20 21 our @ISA = 'Padre::Swarm::Transport'; 18 22 19 23 =pod … … 69 73 $obj{subscriptions} = {}; 70 74 $obj{channels} = {}; 75 $obj{sockets} = {}; 71 76 $obj{started} = 0; 72 77 $obj{selector} = $selector; … … 81 86 croak "Transport already started" if $self->started; 82 87 while ( my ($channel,$loopback) = each %{ $self->subscriptions } ) { 83 $self->_connect_ socket( $channel, $loopback );88 $self->_connect_channel( $channel, $loopback ); 84 89 } 85 90 return $self->started( 1 ); … … 90 95 croak "Transport is not started" unless $self->started; 91 96 while ( my ($channel,$socket) = each %{ $self->channels } ) { 92 $self->_shutdown_ socket( $channel );97 $self->_shutdown_channel( $channel ); 93 98 } 94 99 $self->started(0); … … 102 107 { 103 108 $self->subscriptions->{$channel} = $loopback; 104 $self->_connect_ socket($channel,$loopback) if $self->started ;109 $self->_connect_channel($channel,$loopback) if $self->started ; 105 110 } 106 111 else { … … 115 120 { 116 121 delete $self->subscriptions->{$channel}; 117 $self->_shutdown_ socket($channel);122 $self->_shutdown_channel($channel); 118 123 } 119 124 else { … … 126 131 $timeout ||= 0; 127 132 warn "Polling before service start!!" unless $self->started; 128 return $self->selector->can_read($timeout); 129 133 my @socks = $self->selector->can_read($timeout); 134 my @channels = map { $self->sockets->{"$_"} } @socks; 135 return @channels; 130 136 } 131 137 … … 143 149 } 144 150 145 sub receive_from {151 sub receive_from_channel { 146 152 my ($self,$channel) = @_; 147 153 if ( exists $self->channels->{$channel} ) { … … 159 165 my $remote = $sock->recv( $buffer, 65535 ); 160 166 if ( $remote ) { 167 #warn "Got remote of '$remote'"; 161 168 my ($rport,$raddr) = sockaddr_in $remote; 162 169 my $ip = inet_ntoa $raddr; … … 171 178 } 172 179 173 sub _connect_ socket{180 sub _connect_channel { 174 181 my ($self,$port,$loopback) = @_; 175 182 confess "Socket '$port' already connected" … … 183 190 $self->channels->{$port} = $socket; 184 191 $self->selector->add( $socket ); 185 return 1; 186 } 187 188 sub _shutdown_socket { 192 $self->sockets->{"$socket"} = $port; 193 return 1; 194 } 195 196 sub _shutdown_channel { 189 197 my ($self,$port) = @_; 190 198 my $socket = delete $self->channels->{$port}; 191 199 return 1 unless defined $socket; 192 200 delete $self->subscriptions->{$port}; 201 delete $self->sockets->{"$socket"}; 193 202 $self->selector->remove( $socket ); 194 203 $socket->mcast_drop( MCAST_GROUP ); -
trunk/Padre-Plugin-Swarm/lib/Padre/Wx/Swarm/Chat.pm
r5822 r5826 56 56 $self->SetSizer($sizer); 57 57 58 my $service = Padre::Swarm::Service::Chat->new(); 58 my $service = Padre::Swarm::Service::Chat->new( 59 use_transport => { 60 #'Padre::Swarm::Transport::Multicast'=>{}, 61 'Padre::Swarm::Transport::IRC'=>{}, 62 } 63 ); 59 64 $self->service( $service ); 60 65 -
trunk/Padre-Plugin-Swarm/t/05_transport.t
r5818 r5826 33 33 my @ready = $tr->poll; 34 34 ok( @ready , 'Poll should return some ready handles' ); 35 my ($message,$frame) = $tr->receive_from ( CHAT );35 my ($message,$frame) = $tr->receive_from_channel( CHAT ); 36 36 is_deeply( $message, $channel_data , 'Received channel data' ); 37 37 ok( !$tr->poll(1) , 'Poll should have no data to read' );
Note: See TracChangeset
for help on using the changeset viewer.
