File Coverage

blib/lib/Email/Outlook/Message/Attachment.pm
Criterion Covered Total %
statement 31 62 50.0
branch 2 10 20.0
condition 7 12 58.3
subroutine 9 10 90.0
pod 2 2 100.0
total 51 96 53.1


line stmt bran cond sub pod time code
1             package Email::Outlook::Message::Attachment;
2             =head1 NAME
3              
4             Email::Outlook::Message::Attachment - Handle attachment data in .msg files
5              
6             =head1 DESCRIPTION
7              
8             This is an internal module of Email::Outlook::Message. It is a subclass of
9             Email::Outlook::Message::Base.
10              
11             =head1 METHODS
12              
13             =over 8
14              
15             =item B
16              
17             Create a new attachment object, using $pps as data source. Overrides the base
18             method by setting some default values.
19              
20             =item B
21              
22             Convert the attachment to an Email::MIME object.
23              
24             =back
25              
26             =head1 AUTHOR
27              
28             Matijs van Zuijlen, C
29              
30             =head1 COPYRIGHT AND LICENSE
31              
32             Copyright 2002--2014 by Matijs van Zuijlen
33              
34             This module is free software; you can redistribute it and/or modify
35             it under the same terms as Perl itself.
36              
37             =cut
38 7     7   43 use strict;
  7         15  
  7         184  
39 7     7   37 use warnings;
  7         14  
  7         181  
40 7     7   35 use Carp;
  7         13  
  7         350  
41 7     7   45 use Email::MIME::ContentType;
  7         14  
  7         326  
42 7     7   36 use base 'Email::Outlook::Message::Base';
  7         12  
  7         3951  
43              
44             our $MAP_ATTACHMENT_FILE = {
45             '3701' => "DATA", # Data
46             '3704' => "SHORTNAME", # Short file name
47             '3707' => "LONGNAME", # Long file name
48             '370E' => "MIMETYPE", # mime type
49             '3712' => "CONTENTID", # content-id
50             '3716' => "DISPOSITION", # disposition
51             };
52              
53             sub new {
54 2     2 1 6 my ($class, $pps, $verbosity) = @_;
55 2         12 my $self = $class->SUPER::new($pps, $verbosity);
56 2         4 bless $self, $class;
57 2   50     10 $self->{MIMETYPE} ||= 'application/octet-stream';
58 2   50     12 $self->{ENCODING} ||= 'base64';
59 2   50     12 $self->{DISPOSITION} ||= 'attachment';
60 2 100       6 if ($self->{MIMETYPE} eq 'multipart/signed') {
61 1         3 $self->{ENCODING} = '8bit';
62             }
63 2         5 return $self;
64             }
65              
66             sub to_email_mime {
67 2     2 1 5 my $self = shift;
68              
69 2         8 my $mt = parse_content_type($self->{MIMETYPE});
70             my $m = Email::MIME->create(
71             attributes => {
72             content_type => "$mt->{discrete}/$mt->{composite}",
73 2         34 %{$mt->{attributes}},
74             encoding => $self->{ENCODING},
75             filename => $self->{LONGNAME} || $self->{SHORTNAME},
76             name => $self->{LONGNAME} || $self->{LONGNAME},
77             disposition => $self->{DISPOSITION},
78             },
79             header => [ 'Content-ID' => $self->{CONTENTID} ],
80 2   66     125 body => $self->{DATA});
      66        
81 2         3615 return $m
82             }
83              
84             sub _property_map {
85 2     2   10 return $MAP_ATTACHMENT_FILE;
86             }
87              
88             sub _process_subdirectory {
89 0     0   0 my ($self, $pps) = @_;
90 0         0 my $name = $self->_get_pps_name($pps);
91 0         0 my ($property, $encoding) = $self->_parse_item_name($name);
92              
93 0 0       0 if ($property eq '3701') { # Nested msg file
94 0         0 my $is_msg = 1;
95 0         0 foreach my $child (@{$pps->{Child}}) {
  0         0  
96 0 0       0 unless ($self->_get_pps_name($child) =~ / ^ ( __recip | __attach
97             | __substg1 | __nameid | __properties ) /x
98             ) {
99 0         0 $is_msg = 0;
100 0         0 last;
101             }
102             }
103 0 0       0 if ($is_msg) {
104 0         0 my $msgp = Email::Outlook::Message->_empty_new();
105 0         0 $msgp->_set_verbosity($self->{VERBOSE});
106 0         0 $msgp->_process_pps($pps);
107              
108 0         0 $self->{DATA} = $msgp->to_email_mime->as_string;
109 0         0 $self->{MIMETYPE} = 'message/rfc822';
110 0         0 $self->{ENCODING} = '8bit';
111             } else {
112 0         0 foreach my $child (@{$pps->{Child}}) {
  0         0  
113 0 0       0 if (eval { $child->isa('OLE::Storage_Lite::PPS::File')}) {
  0         0  
114 0         0 foreach my $prop ("Time1st", "Time2nd") {
115 0         0 $child->{$prop} = undef;
116             }
117             }
118             }
119             my $nPps = OLE::Storage_Lite::PPS::Root->new(
120 0         0 $pps->{Time1st}, $pps->{Time2nd}, $pps->{Child});
121 0         0 my $data;
122 0         0 my $io = IO::String->new($data);
123 0         0 binmode($io);
124 0         0 $nPps->save($io, 1);
125 0         0 $self->{DATA} = $data;
126             }
127             } else {
128 0         0 $self->_warn_about_unknown_directory($pps);
129             }
130 0         0 return;
131             }
132              
133 2     2   6 sub _property_stream_header_length { return 8; }
134              
135             1;