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

Comparing Convert-UUlib/UUlib.pm (file contents):
Revision 1.25 by root, Mon May 2 19:58:40 2005 UTC vs.
Revision 1.32 by root, Mon Oct 13 12:12:56 2008 UTC

1package Convert::UUlib; 1package Convert::UUlib;
2
3no warnings;
4use strict;
2 5
3use Carp; 6use Carp;
4 7
5require Exporter; 8require Exporter;
6require DynaLoader; 9require DynaLoader;
7 10
8$VERSION = "1.06"; 11our $VERSION = '1.12';
9 12
10@ISA = qw(Exporter DynaLoader); 13our @ISA = qw(Exporter DynaLoader);
11 14
12@_consts = qw( 15our @_consts = qw(
13 ACT_COPYING ACT_DECODING ACT_ENCODING ACT_IDLE ACT_SCANNING 16 ACT_COPYING ACT_DECODING ACT_ENCODING ACT_IDLE ACT_SCANNING
14 17
15 FILE_DECODED FILE_ERROR FILE_MISPART FILE_NOBEGIN FILE_NODATA 18 FILE_DECODED FILE_ERROR FILE_MISPART FILE_NOBEGIN FILE_NODATA
16 FILE_NOEND FILE_OK FILE_READ FILE_TMPFILE 19 FILE_NOEND FILE_OK FILE_READ FILE_TMPFILE
17 20
28 31
29 B64_ENCODED BH_ENCODED PT_ENCODED QP_ENCODED 32 B64_ENCODED BH_ENCODED PT_ENCODED QP_ENCODED
30 XX_ENCODED UU_ENCODED YENC_ENCODED 33 XX_ENCODED UU_ENCODED YENC_ENCODED
31); 34);
32 35
33@_funcs = qw( 36our @_funcs = qw(
34 Initialize CleanUp GetOption SetOption strerror SetMsgCallback 37 Initialize CleanUp GetOption SetOption strerror SetMsgCallback
35 SetBusyCallback SetFileCallback SetFNameFilter SetFileNameCallback 38 SetBusyCallback SetFileCallback SetFNameFilter SetFileNameCallback
36 FNameFilter LoadFile GetFileListItem RenameFile DecodeToTemp 39 FNameFilter LoadFile GetFileListItem RenameFile DecodeToTemp
37 RemoveTemp DecodeFile InfoFile Smerge QuickDecode EncodeMulti 40 RemoveTemp DecodeFile InfoFile Smerge QuickDecode EncodeMulti
38 EncodePartial EncodeToStream EncodeToFile E_PrepSingle 41 EncodePartial EncodeToStream EncodeToFile E_PrepSingle
39 E_PrepPartial 42 E_PrepPartial
40 43
41 straction strencoding strmsglevel 44 straction strencoding strmsglevel
42); 45);
43 46
44@EXPORT = @_consts; 47our @EXPORT = @_consts;
45@EXPORT_OK = @_funcs; 48our @EXPORT_OK = @_funcs;
46%EXPORT_TAGS = (all => [@_consts,@_funcs], constants => \@_consts); 49our %EXPORT_TAGS = (all => [@_consts,@_funcs], constants => \@_consts);
47 50
48bootstrap Convert::UUlib $VERSION; 51bootstrap Convert::UUlib $VERSION;
49 52
50Initialize(); 53Initialize();
51 54
52# not when < 5.005_6x 55# not when < 5.005_6x
53# END { CleanUp() } 56# END { CleanUp() }
54 57
55for (@_consts) { 58for (@_consts) {
56 my $constant = constant($_); 59 my $constant = constant($_);
60 no strict 'refs';
57 *$_ = sub () { $constant }; 61 *$_ = sub () { $constant };
58} 62}
59 63
60# action code -> string mapping 64# action code -> string mapping
61sub straction($) { 65sub straction($) {
433=head1 LARGE EXAMPLE DECODER 437=head1 LARGE EXAMPLE DECODER
434 438
435This is the file C<example-decoder> from the distribution, put here 439This is the file C<example-decoder> from the distribution, put here
436instead of more thorough documentation. 440instead of more thorough documentation.
437 441
442 #!/usr/bin/perl
443
438 # decode all the files in the directory uusrc/ and copy 444 # decode all the files in the directory uusrc/ and copy
439 # the resulting files to uudst/ 445 # the resulting files to uudst/
440 446
441 use Convert::UUlib ':all'; 447 use Convert::UUlib ':all';
442 448
443 sub namefilter { 449 sub namefilter {
444 my($path)=@_; 450 my ($path) = @_;
451
445 $path=~s/^.*[\/\\]//; 452 $path=~s/^.*[\/\\]//;
453
446 $path; 454 $path
447 } 455 }
448 456
449 sub busycb { 457 sub busycb {
450 my ($action, $curfile, $partno, $numparts, $percent, $fsize) = @_; 458 my ($action, $curfile, $partno, $numparts, $percent, $fsize) = @_;
451 $_[0]=straction($action); 459 $_[0]=straction($action);
452 print "busy_callback(", (join ",",@_), ")\n"; 460 print "busy_callback(", (join ",",@_), ")\n";
453 0; 461 0
454 } 462 }
455 463
464 SetOption OPT_RBUF, 128*1024;
465 SetOption OPT_WBUF, 1024*1024;
456 SetOption OPT_IGNMODE, 1; 466 SetOption OPT_IGNMODE, 1;
467 SetOption OPT_IGNMODE, 1;
457 SetOption OPT_VERBOSE, 1; 468 SetOption OPT_VERBOSE, 1;
458 469
459 # show the three ways you can set callback functions. I normally 470 # show the three ways you can set callback functions. I normally
460 # prefer the one with the sub inplace. 471 # prefer the one with the sub inplace.
461 SetFNameFilter \&namefilter; 472 SetFNameFilter \&namefilter;
462 473
463 SetBusyCallback "busycb", 333; 474 SetBusyCallback "busycb", 333;
464 475
465 SetMsgCallback sub { 476 SetMsgCallback sub {
466 my ($msg, $level) = @_; 477 my ($msg, $level) = @_;
467 print uc strmsglevel $_[1], ": $msg\n"; 478 print uc strmsglevel $_[1], ": $msg\n";
468 }; 479 };
469 480
470 # the following non-trivial FileNameCallback takes care 481 # the following non-trivial FileNameCallback takes care
471 # of some subject lines not detected properly by uulib: 482 # of some subject lines not detected properly by uulib:
472 SetFileNameCallback sub { 483 SetFileNameCallback sub {
473 return unless $_[1]; # skip "Re:"-plies et al. 484 return unless $_[1]; # skip "Re:"-plies et al.
474 local $_ = $_[0]; 485 local $_ = $_[0];
475 486
487 return $1 if /(\S+\s+IMG_\d+.jpg)/i;
488
476 # the following rules are rather effective on some newsgroups, 489 # the following rules are rather effective on some newsgroups,
477 # like alt.binaries.games.anime, where non-mime, uuencoded data 490 # like alt.binaries.games.anime, where non-mime, uuencoded data
478 # is very common 491 # is very common
479 492
480 # if we find some *.rar, take it as the filename 493 # if we find some *.rar, take it as the filename
481 return $1 if /(\S{3,}\.(?:[rstuvwxyz]\d\d|rar))\s/i; 494 return $1 if /(\S{3,}\.(?:[rstuvwxyz]\d\d|rar))\s/i;
482 495
483 # one common subject format 496 # one common subject format
484 return $1 if /- "(.{2,}?\..+?)" (?:yenc )?\(\d+\/\d+\)/i; 497 return $1 if /- "(.{2,}?\..+?)" (?:yenc )?\(\d+\/\d+\)/i;
485 498
486 # - filename.par (04/55) 499 # - filename.par (04/55)
487 return $1 if /- "?(\S{3,}\.\S+?)"? (?:yenc )?\(\d+\/\d+\)/i; 500 return $1 if /- "?(\S{3,}\.\S+?)"? (?:yenc )?\(\d+\/\d+\)/i;
488 501
489 # - (xxx) No. 1 sayuri81.jpg 756565 bytes 502 # - (xxx) No. 1 sayuri81.jpg 756565 bytes
490 # - (20 files) No.17 Roseanne.jpg [2/2] 503 # - (20 files) No.17 Roseanne.jpg [2/2]
491 return $1 if /No\.[ 0-9]+ (\S+\....) (?:\d+ bytes )?\[/; 504 return $1 if /No\.[ 0-9]+ (\S+\....) (?:\d+ bytes )?\[/;
492 505
506 # try to detect some common forms of filenames
507 return $1 if /([a-z0-9_\-+.]{3,}\.[a-z]{3,4}(?:.\d+))/i;
508
493 # otherwise just pass what we have 509 # otherwise just pass what we have
494 return (); 510 ()
495 }; 511 };
496 512
497 # now read all files in the directory uusrc/* 513 # now read all files in the directory uusrc/*
498 for(<uusrc/*>) { 514 for(<uusrc/*>) {
499 my($retval,$count)=LoadFile ($_, $_, 1); 515 my ($retval, $count) = LoadFile ($_, $_, 1);
500 print "file($_), status(", strerror $retval, ") parts($count)\n"; 516 print "file($_), status(", strerror $retval, ") parts($count)\n";
501 } 517 }
502 518
503 SetOption OPT_SAVEPATH, "uudst/"; 519 SetOption OPT_SAVEPATH, "uudst/";
504 520
505 # now wade through all files and their source parts 521 # now wade through all files and their source parts
506 $i = 0; 522 $i = 0;
507 while ($uu = GetFileListItem($i)) { 523 while ($uu = GetFileListItem $i) {
508 $i++; 524 $i++;
509 print "file nr. $i"; 525 print "file nr. $i";
510 print " state ", $uu->state; 526 print " state ", $uu->state;
511 print " mode ", $uu->mode; 527 print " mode ", $uu->mode;
512 print " uudet ", strencoding $uu->uudet; 528 print " uudet ", strencoding $uu->uudet;
513 print " size ", $uu->size; 529 print " size ", $uu->size;
514 print " filename ", $uu->filename; 530 print " filename ", $uu->filename;
515 print " subfname ", $uu->subfname; 531 print " subfname ", $uu->subfname;
516 print " mimeid ", $uu->mimeid; 532 print " mimeid ", $uu->mimeid;
517 print " mimetype ", $uu->mimetype; 533 print " mimetype ", $uu->mimetype;
518 print "\n"; 534 print "\n";
519 535
520 # print additional info about all parts 536 # print additional info about all parts
521 for ($uu->parts) { 537 for ($uu->parts) {
522 while (my ($k, $v) = each %$_) { 538 while (my ($k, $v) = each %$_) {
523 print "$k > $v, "; 539 print "$k > $v, ";
524 } 540 }
525 print "\n"; 541 print "\n";
526 } 542 }
527 543
528 $uu->decode_temp; 544 print $uu->filename;
529 print " temporarily decoded to ", $uu->binfile, "\n"; 545
530 $uu->remove_temp; 546 $uu->remove_temp;
531 547
532 print strerror $uu->decode; 548 if (my $err = $uu->decode ()) {
549 print ", ", strerror $err, "\n";
550 } else {
533 print " saved as uudst/", $uu->filename, "\n"; 551 print ", saved as uudst/", $uu->filename, "\n";
534 } 552 }
553 }
535 554
536 print "cleanup...\n"; 555 print "cleanup...\n";
537 556
538 CleanUp(); 557 CleanUp;
539 558
540=head1 AUTHOR 559=head1 AUTHOR
541 560
542Marc Lehmann <schmorp@schmorp.de>, the original uulib library was written 561Marc Lehmann <schmorp@schmorp.de>, the original uulib library was written
543by Frank Pilhofer <fp@informatik.uni-frankfurt.de>, and later heavily 562by Frank Pilhofer <fp@informatik.uni-frankfurt.de>, and later heavily

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines