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.21 by root, Sun Jun 12 01:48:05 2016 UTC vs.
Revision 1.28 by root, Thu Sep 9 00:49:06 2021 UTC

18=head1 DESCRIPTION 18=head1 DESCRIPTION
19 19
20This module implements the freenet client protocol version 2.0, as used by 20This module implements the freenet client protocol version 2.0, as used by
21freenet 0.7. See L<Net::FCP> for the earlier freenet 0.5 version. 21freenet 0.7. See L<Net::FCP> for the earlier freenet 0.5 version.
22 22
23See L<http://wiki.freenetproject.org/FreenetFCPSpec2Point0> for a 23See L<https://wiki.freenetproject.org/FCP> for a description of what the
24description of what the messages do. 24messages do.
25 25
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.
136=item on_error => $callback->($fcp, $message) 136=item on_error => $callback->($fcp, $message)
137 137
138Invoked on any (fatal) errors, such as unexpected connection close. The 138Invoked on any (fatal) errors, such as unexpected connection close. The
139callback receives the FCP object and a textual error message. 139callback receives the FCP object and a textual error message.
140 140
141=item on_failure => $callback->($fcp, $type, $backtrace, $args, $error) 141=item on_failure => $callback->($fcp, $type, $args, $backtrace, $error)
142 142
143Invoked when an FCP request fails that didn't have a failure callback. See 143Invoked when an FCP request fails that didn't have a failure callback. See
144L<FCP REQUESTS> for details. 144L<FCP REQUESTS> for details.
145 145
146=back 146=back
265} 265}
266 266
267sub fatal { 267sub fatal {
268 my ($self, $msg) = @_; 268 my ($self, $msg) = @_;
269 269
270 $self->{hdl}->shutdown; 270 $self->{hdl}->push_shutdown if $self->{hdl};
271 delete $self->{kw}; 271 delete $self->{kw};
272 272
273 if ($self->{on_error}) { 273 if ($self->{on_error}) {
274 $self->{on_error}->($self, $msg); 274 $self->{on_error}->($self, $msg);
275 } else { 275 } else {
276 die $msg; 276 die "AnyEvent::FCP($self->{host}:$self->{port}): $msg";
277 } 277 }
278} 278}
279 279
280sub identifier { 280sub identifier {
281 $_[0]{prefix} . ++$_[0]{idseq} 281 $_[0]{prefix} . ++$_[0]{idseq}
291 $self->{id}{$id} = delete $kv{id_cb}; 291 $self->{id}{$id} = delete $kv{id_cb};
292 } 292 }
293 293
294 my $msg = (touc $type) . "\012" 294 my $msg = (touc $type) . "\012"
295 . join "", map +(touc $_) . "=$kv{$_}\012", keys %kv; 295 . join "", map +(touc $_) . "=$kv{$_}\012", keys %kv;
296
297 sub id {
298 my ($self) = @_;
299
300
301 }
302 296
303 if (defined $data) { 297 if (defined $data) {
304 $msg .= "DataLength=" . (length $data) . "\012" 298 $msg .= "DataLength=" . (length $data) . "\012"
305 . "Data\012$data"; 299 . "Data\012$data";
306 } else { 300 } else {
425 419
426Also comes in this underscore variant: 420Also comes in this underscore variant:
427 421
428 $fcp->get_plugin_info_ ($name, $detailed, $cb); 422 $fcp->get_plugin_info_ ($name, $detailed, $cb);
429 423
430You can thinbk of the underscore as a kind of continuation indicator - the 424You can think of the underscore as a kind of continuation indicator - the
431normal function waits and returns with the data, the C<_> indicates that 425normal function waits and returns with the data, the C<_> indicates that
432you pass the continuation yourself, and the continuation will be invoked 426you pass the continuation yourself, and the continuation will be invoked
433with the results. 427with the results.
434 428
435This callback/continuation argument (C<$cb>) can come in three forms itself: 429This callback/continuation argument (C<$cb>) can come in three forms itself:
444call site. 438call site.
445 439
446This is a popular choice, but it makes handling errors hard - make sure 440This is a popular choice, but it makes handling errors hard - make sure
447you never generate protocol errors! 441you never generate protocol errors!
448 442
449If an C<on_failure> hook exists, it will be invoked with the FCP object, 443In the failure case, if an C<on_failure> hook exists, it will be invoked
450the request type (the name of the method), a (textual) backtrace as 444with the FCP object, the request type (the name of the method, an arrayref
451generated by C<Carp::longmess>, and arrayref containing the arguments from 445containing the arguments from the original request invocation, a (textual)
452the original request invocation and the error object from the server, in 446backtrace as generated by C<Carp::longmess>, and the error object from the
453this order, e.g.: 447server, in this order, e.g.:
454 448
455 on_failure => sub { 449 on_failure => sub {
456 my ($fcp, $request_type, $backtrace, $orig_args, $error_object) = @_; 450 my ($fcp, $request_type, $orig_args, $backtrace, $error_object) = @_;
457 451
458 warn "FCP failure ($type), $error_object->{code_description} ($error_object->{extra_description})$backtrace"; 452 warn "FCP failure ($type @$args), $error_object->{code_description} ($error_object->{extra_description})$backtrace";
459 exit 1; 453 exit 1;
460 }, 454 },
461 455
462=item A condvar (as returned by e.g. C<< AnyEvent->condvar >>) 456=item A condvar (as returned by e.g. C<< AnyEvent->condvar >>)
463 457
737 }); 731 });
738}; 732};
739 733
740=item $status = $fcp->remove_request ($identifier[, $global]) 734=item $status = $fcp->remove_request ($identifier[, $global])
741 735
742Remove the request with the given isdentifier. Returns true if successful, 736Remove the request with the given identifier. Returns true if successful,
743false on error. 737false on error.
744 738
745=cut 739=cut
746 740
747_txn remove_request => sub { 741_txn remove_request => sub {
792 786
793C<$want_read> and C<$want_write> should be set to a true value when you 787C<$want_read> and C<$want_write> should be set to a true value when you
794want to read (get) files or write (put) files, respectively. 788want to read (get) files or write (put) files, respectively.
795 789
796On error, an exception is thrown. Otherwise, C<$can_read> and 790On error, an exception is thrown. Otherwise, C<$can_read> and
797C<$can_write> indicate whether you can reaqd or write to freenet via the 791C<$can_write> indicate whether you can read or write to freenet via the
798directory. 792directory.
799 793
800=cut 794=cut
801 795
802_txn test_dda => sub { 796_txn test_dda => sub {
923on every change, which will be called as C<< $cb->($fcp, $kv, $type) >>, where C<$type> 917on every change, which will be called as C<< $cb->($fcp, $kv, $type) >>, where C<$type>
924is the type of the original message triggering the change, 918is the type of the original message triggering the change,
925 919
926To fill this cache with the global queue and keep it updated, 920To fill this cache with the global queue and keep it updated,
927call C<watch_global> to subscribe to updates, followed by 921call C<watch_global> to subscribe to updates, followed by
928C<list_persistent_requests_sync>. 922C<list_persistent_requests>.
929 923
930 $fcp->watch_global_sync_; # do not wait 924 $fcp->watch_global_; # do not wait
931 $fcp->list_persistent_requests; # wait 925 $fcp->list_persistent_requests; # wait
932 926
933To get a better idea of what is stored in the cache, here is an example of 927To get a better idea of what is stored in the cache, here is an example of
934what might be stored in C<< $fcp->{req}{"Frost-gpl.txt"} >>: 928what might be stored in C<< $fcp->{req}{"Frost-gpl.txt"} >>:
935 929
1044 if 0.1 > rand; 1038 if 0.1 > rand;
1045 } 1039 }
1046 } 1040 }
1047 1041
1048 # see if the dummy plugin is loaded, to ensure all previous requests have finished. 1042 # see if the dummy plugin is loaded, to ensure all previous requests have finished.
1049 $fcp->get_plugin_info_sync ("dummy"); 1043 $fcp->get_plugin_info ("dummy");
1050 1044
1051=head1 SEE ALSO 1045=head1 SEE ALSO
1052 1046
1053L<http://wiki.freenetproject.org/FreenetFCPSpec2Point0>, L<Net::FCP>. 1047L<http://wiki.freenetproject.org/FreenetFCPSpec2Point0>, L<Net::FCP>.
1054 1048

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines