ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-FCP/FCP.pm
(Generate patch)

Comparing AnyEvent-FCP/FCP.pm (file contents):
Revision 1.5 by root, Tue Dec 1 13:49:56 2009 UTC vs.
Revision 1.8 by root, Fri Jun 18 16:59:13 2010 UTC

6 6
7 use AnyEvent::FCP; 7 use AnyEvent::FCP;
8 8
9 my $fcp = new AnyEvent::FCP; 9 my $fcp = new AnyEvent::FCP;
10 10
11# transactions return condvars 11 # transactions return condvars
12 my $lp_cv = $fcp->list_peers; 12 my $lp_cv = $fcp->list_peers;
13 my $pr_cv = $fcp->list_persistent_requests; 13 my $pr_cv = $fcp->list_persistent_requests;
14 14
15 my $peers = $lp_cv->recv; 15 my $peers = $lp_cv->recv;
16 my $reqs = $pr_cv->recv; 16 my $reqs = $pr_cv->recv;
26The module uses L<AnyEvent> to find a suitable event module. 26The module uses L<AnyEvent> to find a suitable event module.
27 27
28Only very little is implemented, ask if you need more, and look at the 28Only very little is implemented, ask if you need more, and look at the
29example program later in this section. 29example program later in this section.
30 30
31=head2 EXAMPLE
32
33This example fetches the download list and sets the priority of all files
34with "a" in their name to "emergency":
35
36 use AnyEvent::FCP;
37
38 my $fcp = new AnyEvent::FCP;
39
40 $fcp->watch_global_sync (1, 0);
41 my $req = $fcp->list_persistent_requests_sync;
42
43 for my $req (values %$req) {
44 if ($req->{filename} =~ /a/) {
45 $fcp->modify_persistent_request_sync (1, $req->{identifier}, undef, 0);
46 }
47 }
48
31=head2 IMPORT TAGS 49=head2 IMPORT TAGS
32 50
33Nothing much can be "imported" from this module right now. 51Nothing much can be "imported" from this module right now.
34 52
35=head2 THE AnyEvent::FCP CLASS 53=head2 THE AnyEvent::FCP CLASS
42 60
43use common::sense; 61use common::sense;
44 62
45use Carp; 63use Carp;
46 64
47our $VERSION = '0.21'; 65our $VERSION = '0.3';
48 66
49use Scalar::Util (); 67use Scalar::Util ();
50 68
51use AnyEvent; 69use AnyEvent;
52use AnyEvent::Handle; 70use AnyEvent::Handle;
72127.0.0.1:9481, or the environment variables C<FREDHOST> and C<FREDPORT>). 90127.0.0.1:9481, or the environment variables C<FREDHOST> and C<FREDPORT>).
73 91
74If no C<name> was specified, then AnyEvent::FCP will generate a 92If no C<name> was specified, then AnyEvent::FCP will generate a
75(hopefully) unique client name for you. 93(hopefully) unique client name for you.
76 94
77=cut
78
79#TODO
80#You can install a progress callback that is being called with the AnyEvent::FCP 95You can install a progress callback that is being called with the AnyEvent::FCP
81#object, a txn object, the type of the transaction and the attributes. Use 96object, the type, a hashref with key-value pairs and a reference to any received data,
82#it like this: 97for all unsolicited messages.
83# 98
99Example:
100
84# sub progress_cb { 101 sub progress_cb {
85# my ($self, $txn, $type, $attr) = @_; 102 my ($self, $type, $kv, $rdata) = @_;
86# 103
87# warn "progress<$txn,$type," . (join ":", %$attr) . ">\n"; 104 if ($type eq "simple_progress") {
105 warn "$kv->{identifier} $kv->{succeeded}/$kv->{required}\n";
106 }
88# } 107 }
108
109=cut
89 110
90sub new { 111sub new {
91 my $class = shift; 112 my $class = shift;
92 my $self = bless { @_ }, $class; 113 my $self = bless { @_ }, $class;
93 114
94 $self->{host} ||= $ENV{FREDHOST} || "127.0.0.1"; 115 $self->{host} ||= $ENV{FREDHOST} || "127.0.0.1";
95 $self->{port} ||= $ENV{FREDPORT} || 9481; 116 $self->{port} ||= $ENV{FREDPORT} || 9481;
96 $self->{name} ||= time.rand.rand.rand; # lame 117 $self->{name} ||= time.rand.rand.rand; # lame
97 $self->{timeout} ||= 600; 118 $self->{timeout} ||= 3600*2;
119 $self->{progress} ||= sub { };
98 120
99 $self->{id} = "a0"; 121 $self->{id} = "a0";
100 122
101 { 123 {
102 Scalar::Util::weaken (my $self = $self); 124 Scalar::Util::weaken (my $self = $self);
103 125
104 $self->{hdl} = new AnyEvent::Handle 126 $self->{hdl} = new AnyEvent::Handle
105 connect => [$self->{host} => $self->{port}], 127 connect => [$self->{host} => $self->{port}],
106 timeout => $self->{timeout}, 128 timeout => $self->{timeout},
107 on_error => sub { 129 on_error => sub {
108 warn "<@_>\n"; 130 warn "@_\n";#d#
109 exit 1; 131 exit 1;
110 }, 132 },
111 on_read => sub { $self->on_read (@_) }, 133 on_read => sub { $self->on_read (@_) },
112 on_eof => $self->{on_eof} || sub { }; 134 on_eof => $self->{on_eof} || sub { };
113 135
120 expected_version => "2.0", 142 expected_version => "2.0",
121 ); 143 );
122 144
123 $self 145 $self
124} 146}
125
126#sub progress {
127# my ($self, $txn, $type, $attr) = @_;
128#
129# $self->{progress}->($self, $txn, $type, $attr)
130# if $self->{progress};
131#}
132 147
133sub send_msg { 148sub send_msg {
134 my ($self, $type, %kv) = @_; 149 my ($self, $type, %kv) = @_;
135 150
136 my $data = delete $kv{data}; 151 my $data = delete $kv{data};
221 $self->{node_hello} = $kv; 236 $self->{node_hello} = $kv;
222 } elsif (exists $self->{id}{$kv->{identifier}}) { 237 } elsif (exists $self->{id}{$kv->{identifier}}) {
223 $self->{id}{$kv->{identifier}}($self, $type, $kv, $rdata) 238 $self->{id}{$kv->{identifier}}($self, $type, $kv, $rdata)
224 and delete $self->{id}{$kv->{identifier}}; 239 and delete $self->{id}{$kv->{identifier}};
225 } else { 240 } else {
226 # on_warn 241 &{ $self->{progress} };
227 #warn "protocol warning (unexpected $type message)\n";
228 } 242 }
229} 243}
230 244
231sub _txn { 245sub _txn {
232 my ($name, $sub) = @_; 246 my ($name, $sub) = @_;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines