File Coverage

blib/lib/Mail/Box/Dir/Message.pm
Criterion Covered Total %
statement 86 101 85.1
branch 25 42 59.5
condition 6 11 54.5
subroutine 15 16 93.7
pod 8 9 88.8
total 140 179 78.2


line stmt bran cond sub pod time code
1             # Copyrights 2001-2019 by [Mark Overmeer].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.02.
5             # This code is part of distribution Mail-Box. Meta-POD processed with
6             # OODoc into POD and HTML manual-pages. See README.md
7             # Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
8              
9             package Mail::Box::Dir::Message;
10 14     14   992 use vars '$VERSION';
  14         24  
  14         623  
11             $VERSION = '3.008';
12              
13 14     14   66 use base 'Mail::Box::Message';
  14         23  
  14         1454  
14              
15 14     14   76 use strict;
  14         100  
  14         325  
16 14     14   71 use warnings;
  14         33  
  14         356  
17              
18 14     14   92 use File::Copy qw/move/;
  14         35  
  14         778  
19 14     14   526 use IO::File;
  14         846  
  14         4210  
20              
21              
22             sub init($)
23 737     737 0 4701 { my ($self, $args) = @_;
24 737         1705 $self->SUPER::init($args);
25              
26             $self->filename($args->{filename})
27 737 50       2058 if $args->{filename};
28              
29 737         994 $self->{MBDM_fix_header} = $args->{fix_header};
30 737         1433 $self;
31             }
32              
33             #-------------------------------------------
34              
35              
36             #-------------------------------------------
37              
38             sub print(;$)
39 226     226 1 357 { my $self = shift;
40 226   33     361 my $out = shift || select;
41              
42 226 100       540 return $self->SUPER::print($out)
43             if $self->isModified;
44              
45 181         374 my $filename = $self->filename;
46 181 50 33     2745 if($filename && -r $filename)
47 181 50       4889 { if(open my $in, '<:raw', $filename)
48 181         424 { local $_;
49 181         8922 print $out $_ while <$in>;
50 181         1313 close $in;
51 181         744 return $self;
52             }
53             }
54              
55 0         0 $self->SUPER::print($out);
56              
57 0         0 1;
58             }
59              
60             #-------------------------------------------
61              
62 14     14   8074 BEGIN { *write = \&print } # simply alias
63              
64             #-------------------------------------------
65              
66              
67             sub filename(;$)
68 3044     3044 1 3701 { my $self = shift;
69 3044 100       6812 @_ ? ($self->{MBDM_filename} = shift) : $self->{MBDM_filename};
70             }
71              
72             #-------------------------------------------
73              
74              
75             # Asking the filesystem for the size is faster counting (in
76             # many situations. It even may be lazy.
77              
78             sub size()
79 0     0 1 0 { my $self = shift;
80              
81 0 0       0 unless($self->isModified)
82 0         0 { my $filename = $self->filename;
83 0 0       0 if(defined $filename)
84 0         0 { my $size = -s $filename;
85 0 0       0 return $size if defined $size;
86             }
87             }
88              
89 0         0 $self->SUPER::size;
90             }
91              
92             #-------------------------------------------
93              
94             sub diskDelete()
95 24     24 1 33 { my $self = shift;
96 24         88 $self->SUPER::diskDelete;
97              
98 24         49 my $filename = $self->filename;
99 24 50       1058 unlink $filename if $filename;
100 24         112 $self;
101             }
102              
103             #-------------------------------------------
104              
105              
106             sub parser()
107 287     287 1 389 { my $self = shift;
108              
109             my $parser = Mail::Box::Parser->new
110             ( filename => $self->{MBDM_filename}
111             , mode => 'r'
112             , fix_header_errors => $self->{MBDM_fix_header}
113 287         767 , $self->logSettings
114             );
115              
116 287 50       60050 unless($parser)
117 0         0 { $self->log(ERROR => "Cannot create parser for $self->{MBDM_filename}.");
118 0         0 return;
119             }
120              
121 287         653 $parser;
122             }
123              
124             #-------------------------------------------
125              
126              
127             sub loadHead()
128 406     406 1 2343 { my $self = shift;
129 406         803 my $head = $self->head;
130 406 100       2093 return $head unless $head->isDelayed;
131              
132 279         513 my $folder = $self->folder;
133 279         709 $folder->lazyPermitted(1);
134              
135 279 50       493 my $parser = $self->parser or return;
136 279         904 $self->readFromParser($parser);
137 279         3009 $parser->stop;
138              
139 279         13428 $folder->lazyPermitted(0);
140              
141 279         752 $self->log(PROGRESS => 'Loaded delayed head.');
142 279         4332 $self->head;
143             }
144              
145             #-------------------------------------------
146              
147              
148             sub loadBody()
149 150     150 1 201 { my $self = shift;
150              
151 150         307 my $body = $self->body;
152 150 100       895 return $body unless $body->isDelayed;
153              
154 8         29 my $head = $self->head;
155 8 50       54 my $parser = $self->parser or return;
156              
157 8 100       41 if($head->isDelayed)
158 2         23 { $head = $self->readHead($parser);
159 2 50       4661 if(defined $head)
160 2         15 { $self->log(PROGRESS => 'Loaded delayed head.');
161 2         34 $self->head($head);
162             }
163             else
164 0         0 { $self->log(ERROR => 'Unable to read delayed head.');
165 0         0 return;
166             }
167             }
168             else
169 6         30 { my ($begin, $end) = $body->fileLocation;
170 6         27 $parser->filePosition($begin);
171             }
172              
173 8         163 my $newbody = $self->readBody($parser, $head);
174 8         7892 $parser->stop;
175              
176 8 50       412 unless(defined $newbody)
177 0         0 { $self->log(ERROR => 'Unable to read delayed body.');
178 0         0 return;
179             }
180              
181 8         34 $self->log(PROGRESS => 'Loaded delayed body.');
182 8         125 $self->storeBody($newbody->contentInfoFrom($head));
183             }
184              
185             #-------------------------------------------
186              
187              
188             sub create($)
189 316     316 1 470 { my ($self, $filename) = @_;
190              
191 316   100     422 my $old = $self->filename || '';
192 316 100 66     950 return $self if $filename eq $old && !$self->isModified;
193              
194             # Write the new data to a new file.
195              
196 225         329 my $new = $filename . '.new';
197 225         825 my $newfile = IO::File->new($new, 'w');
198 225 50       21047 $self->log(ERROR => "Cannot write message to $new: $!"), return
199             unless $newfile;
200              
201 225         686 $self->write($newfile);
202 225         10758 $newfile->close;
203              
204             # Accept the new data
205             # maildir produces warning where not expected...
206             # $self->log(WARNING => "Failed to remove $old: $!")
207             # if $old && !unlink $old;
208              
209 225 100       12248 unlink $old if $old;
210              
211 225 50       851 $self->log(ERROR => "Failed to move $new to $filename: $!"), return
212             unless move($new, $filename);
213              
214 225         13973 $self->modified(0);
215              
216             # Do not affect flags for Maildir (and some other) which keep it
217             # in there. Flags will be processed later.
218 225         1957 $self->Mail::Box::Dir::Message::filename($filename);
219              
220 225         930 $self;
221             }
222              
223             #-------------------------------------------
224              
225             1;