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.26 by root, Sun Dec 10 16:44:00 2006 UTC vs.
Revision 1.34 by root, Mon Aug 24 04:38:23 2009 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.07"; 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
19 22
20 OPT_RBUF OPT_WBUF 23 OPT_RBUF OPT_WBUF
21 OPT_BRACKPOL OPT_DEBUG OPT_DESPERATE OPT_DUMBNESS OPT_ENCEXT 24 OPT_BRACKPOL OPT_DEBUG OPT_DESPERATE OPT_DUMBNESS OPT_ENCEXT
22 OPT_ERRNO OPT_FAST OPT_IGNMODE OPT_IGNREPLY OPT_OVERWRITE OPT_PREAMB 25 OPT_ERRNO OPT_FAST OPT_IGNMODE OPT_IGNREPLY OPT_OVERWRITE OPT_PREAMB
23 OPT_PROGRESS OPT_SAVEPATH OPT_TINYB64 OPT_USETEXT OPT_VERBOSE 26 OPT_PROGRESS OPT_SAVEPATH OPT_TINYB64 OPT_USETEXT OPT_VERBOSE
24 OPT_VERSION OPT_REMOVE OPT_MOREMIME OPT_DOTDOT 27 OPT_VERSION OPT_REMOVE OPT_MOREMIME OPT_DOTDOT OPT_AUTOCHECK
25 28
26 RET_CANCEL RET_CONT RET_EXISTS RET_ILLVAL RET_IOERR RET_NODATA 29 RET_CANCEL RET_CONT RET_EXISTS RET_ILLVAL RET_IOERR RET_NODATA
27 RET_NOEND RET_NOMEM RET_OK RET_UNSUP 30 RET_NOEND RET_NOMEM RET_OK RET_UNSUP
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 CheckGlobalList
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
476 # the following rules are rather effective on some newsgroups, 487 # the following rules are rather effective on some newsgroups,
477 # like alt.binaries.games.anime, where non-mime, uuencoded data 488 # like alt.binaries.games.anime, where non-mime, uuencoded data
478 # is very common 489 # is very common
479 490
480 # if we find some *.rar, take it as the filename 491 # if we find some *.rar, take it as the filename
481 return $1 if /(\S{3,}\.(?:[rstuvwxyz]\d\d|rar))\s/i; 492 return $1 if /(\S{3,}\.(?:[rstuvwxyz]\d\d|rar))\s/i;
482 493
483 # one common subject format 494 # one common subject format
484 return $1 if /- "(.{2,}?\..+?)" (?:yenc )?\(\d+\/\d+\)/i; 495 return $1 if /- "(.{2,}?\..+?)" (?:yenc )?\(\d+\/\d+\)/i;
485 496
486 # - filename.par (04/55) 497 # - filename.par (04/55)
487 return $1 if /- "?(\S{3,}\.\S+?)"? (?:yenc )?\(\d+\/\d+\)/i; 498 return $1 if /- "?(\S{3,}\.\S+?)"? (?:yenc )?\(\d+\/\d+\)/i;
488 499
489 # - (xxx) No. 1 sayuri81.jpg 756565 bytes 500 # - (xxx) No. 1 sayuri81.jpg 756565 bytes
490 # - (20 files) No.17 Roseanne.jpg [2/2] 501 # - (20 files) No.17 Roseanne.jpg [2/2]
491 return $1 if /No\.[ 0-9]+ (\S+\....) (?:\d+ bytes )?\[/; 502 return $1 if /No\.[ 0-9]+ (\S+\....) (?:\d+ bytes )?\[/;
492 503
504 # try to detect some common forms of filenames
505 return $1 if /([a-z0-9_\-+.]{3,}\.[a-z]{3,4}(?:.\d+))/i;
506
493 # otherwise just pass what we have 507 # otherwise just pass what we have
494 return (); 508 ()
495 }; 509 };
496 510
497 # now read all files in the directory uusrc/* 511 # now read all files in the directory uusrc/*
498 for(<uusrc/*>) { 512 for(<uusrc/*>) {
499 my($retval,$count)=LoadFile ($_, $_, 1); 513 my ($retval, $count) = LoadFile ($_, $_, 1);
500 print "file($_), status(", strerror $retval, ") parts($count)\n"; 514 print "file($_), status(", strerror $retval, ") parts($count)\n";
501 } 515 }
502 516
503 SetOption OPT_SAVEPATH, "uudst/"; 517 SetOption OPT_SAVEPATH, "uudst/";
504 518
505 # now wade through all files and their source parts 519 # now wade through all files and their source parts
506 $i = 0; 520 $i = 0;
507 while ($uu = GetFileListItem($i)) { 521 while ($uu = GetFileListItem $i) {
508 $i++; 522 $i++;
509 print "file nr. $i"; 523 print "file nr. $i";
510 print " state ", $uu->state; 524 print " state ", $uu->state;
511 print " mode ", $uu->mode; 525 print " mode ", $uu->mode;
512 print " uudet ", strencoding $uu->uudet; 526 print " uudet ", strencoding $uu->uudet;
513 print " size ", $uu->size; 527 print " size ", $uu->size;
514 print " filename ", $uu->filename; 528 print " filename ", $uu->filename;
515 print " subfname ", $uu->subfname; 529 print " subfname ", $uu->subfname;
516 print " mimeid ", $uu->mimeid; 530 print " mimeid ", $uu->mimeid;
517 print " mimetype ", $uu->mimetype; 531 print " mimetype ", $uu->mimetype;
518 print "\n"; 532 print "\n";
519 533
520 # print additional info about all parts 534 # print additional info about all parts
521 for ($uu->parts) { 535 for ($uu->parts) {
522 while (my ($k, $v) = each %$_) { 536 while (my ($k, $v) = each %$_) {
523 print "$k > $v, "; 537 print "$k > $v, ";
524 } 538 }
525 print "\n"; 539 print "\n";
526 } 540 }
527 541
528 $uu->decode_temp; 542 print $uu->filename;
529 print " temporarily decoded to ", $uu->binfile, "\n"; 543
530 $uu->remove_temp; 544 $uu->remove_temp;
531 545
532 print strerror $uu->decode; 546 if (my $err = $uu->decode ()) {
547 print ", ", strerror $err, "\n";
548 } else {
533 print " saved as uudst/", $uu->filename, "\n"; 549 print ", saved as uudst/", $uu->filename, "\n";
534 } 550 }
551 }
535 552
536 print "cleanup...\n"; 553 print "cleanup...\n";
537 554
538 CleanUp(); 555 CleanUp;
539 556
540=head1 AUTHOR 557=head1 AUTHOR
541 558
542Marc Lehmann <schmorp@schmorp.de>, the original uulib library was written 559Marc Lehmann <schmorp@schmorp.de>, the original uulib library was written
543by Frank Pilhofer <fp@informatik.uni-frankfurt.de>, and later heavily 560by Frank Pilhofer <fp@informatik.uni-frankfurt.de>, and later heavily

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines