File Coverage

blib/lib/App/winmaildat2tar.pm
Criterion Covered Total %
statement 55 98 56.1
branch 0 18 0.0
condition 0 9 0.0
subroutine 20 31 64.5
pod 0 7 0.0
total 75 163 46.0


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