File Coverage

blib/lib/App/winmaildat2tar.pm
Criterion Covered Total %
statement 55 99 55.5
branch 0 18 0.0
condition 0 9 0.0
subroutine 20 31 64.5
pod 0 7 0.0
total 75 164 45.7


line stmt bran cond sub pod time code
1             package App::winmaildat2tar;
2              
3 1     1   673 use v5.14;
  1         3  
4 1     1   5 use warnings;
  1         1  
  1         46  
5             our $VERSION = "0.99";
6              
7 1     1   482 use Getopt::EX::Long qw(:DEFAULT Configure ExConfigure);
  1         39946  
  1         211  
8             ExConfigure BASECLASS => [ __PACKAGE__, "Getopt::EX" ];
9             Configure "bundling";
10              
11             my $default_format = $0 =~ /2(\w+)$/ ? $1 : 'tar';
12              
13 1     1   562 use Getopt::EX::Hashed; {
  1         10772  
  1         6  
14             has format => 'f =s', is => 'ro', default => $default_format;
15             }
16 1     1   123 no Getopt::EX::Hashed;
  1         3  
  1         4  
17              
18             sub run {
19 0     0 0   my $app = shift;
20 0           local @ARGV = @_;
21 0 0         $app->getopt or usage();
22              
23 0           my $archive;
24              
25 0 0         @ARGV or usage();
26 0           for my $file (@ARGV) {
27 1     1   724 use Convert::TNEF;
  1         26889  
  1         235  
28 0 0         my $tnef = Convert::TNEF->read_in($file, { output_to_core => 'ALL' })
29             or die $Convert::TNEF::errstr;
30 0 0         my @attachments = $tnef->attachments or do {
31 0           warn "$file: no attachment data\n";
32 0           next;
33             };
34 0           for my $ent (@attachments) {
35 0   0       my $name = $ent->longname // $ent->name // unknown();
      0        
36 0   0       ($archive //= App::winmaildat2tar::Archive->new($app->format))
37             ->add($name, $ent->data);
38             }
39             }
40              
41 0 0         print $archive->write if $archive;
42              
43 0           exit;
44             }
45              
46             sub usage {
47 0     0 0   die sprintf "Usage: %s winmail.dat\n", $0 =~ s|.*/||r;
48             }
49              
50             sub unknown {
51 0     0 0   my $seq = (state $_seq)++;
52 0 0         sprintf "unknown%s.dat", $seq ? "_$seq" : "";
53             }
54              
55             1;
56              
57             ######################################################################
58              
59             package App::winmaildat2tar::Archive {
60 1     1   21 use v5.14;
  1         4  
61 1     1   7 use warnings;
  1         2  
  1         37  
62 1     1   5 use Data::Dumper;
  1         2  
  1         68  
63              
64 1     1   660 use Moo; {
  1         10133  
  1         5  
65             has format => ( is => 'ro', required => 1 );
66             has archive => ( is => 'rw' );
67             around BUILDARGS => sub {
68             my ($orig, $class, $format) = @_;
69             $format =~ s/^([a-z\d])([a-z\d]*)$/\u$1\L$2/i
70             or die "$format: invalid format.\n";
71             $class->$orig(format => $format);
72             };
73             sub BUILD {
74 0     0 0   my($obj, $args) = @_;
75 0           my $class = ref $obj;
76 0           my $format = $obj->format;
77 0           my $subclass = "$class\::$format";
78 0           bless $obj, $subclass;
79 0 0         $obj->can('newarchive') or die "$format: unknown format.\n";
80 0 0         $obj->newarchive or die;
81             }
82 1     1   1564 } no Moo;
  1         1  
  1         6  
83              
84             sub newarchive {
85 0     0 0   my $obj = shift;
86 0           $obj->archive($obj->module->new);
87             }
88             sub module {
89 0     0 0   sprintf "Archive::%s", shift->format;
90             }
91             sub write {
92 0     0 0   shift->archive->write;
93             }
94             }
95              
96             package App::winmaildat2tar::Archive::Tar {
97 1     1   329 use v5.14;
  1         10  
98 1     1   6 use warnings;
  1         1  
  1         32  
99 1     1   693 use Archive::Tar;
  1         84619  
  1         142  
100             our @ISA = qw(App::winmaildat2tar::Archive);
101             sub add {
102 0     0     my $obj = shift;
103 0           my($name, $data) = @_;
104 0           my $option = { uname => 'nobody', gname => 'nogroup' };
105 0           $obj->archive->add_data($name, $data, $option);
106             }
107             }
108              
109             package App::winmaildat2tar::Archive::Ar {
110 1     1   17 use v5.14;
  1         4  
111 1     1   17 use warnings;
  1         7  
  1         37  
112 1     1   607 use Archive::Ar;
  1         6162  
  1         121  
113             our @ISA = qw(App::winmaildat2tar::Archive);
114             sub add {
115 0     0     my $obj = shift;
116 0           my($name, $data) = @_;
117 0           $obj->archive->add_data($name, $data);
118             }
119             }
120              
121             package App::winmaildat2tar::Archive::Zip {
122 1     1   22 use v5.14;
  1         3  
123 1     1   5 use warnings;
  1         3  
  1         36  
124 1     1   694 use Archive::Zip;
  1         47263  
  1         166  
125             our @ISA = qw(App::winmaildat2tar::Archive);
126             sub add {
127 0     0     my $obj = shift;
128 0           my($name, $data) = @_;
129 0           $obj->archive->addString($data, $name);
130             }
131             sub write {
132 0     0     my $obj = shift;
133 0 0         open my $fh, ">", \(my $data) or die "open: $!";
134 0           $obj->archive->writeToFileHandle($fh);
135 0           close $fh;
136 0           $data;
137             }
138             }
139              
140             1;
141              
142             __END__