File Coverage

blib/lib/Mail/Box/File/Message.pm
Criterion Covered Total %
statement 68 68 100.0
branch 10 14 71.4
condition 3 6 50.0
subroutine 16 16 100.0
pod 9 11 81.8
total 106 115 92.1


line stmt bran cond sub pod time code
1             # This code is part of Perl distribution Mail-Box version 4.01.
2             # The POD got stripped from this file by OODoc version 3.05.
3             # For contributors see file ChangeLog.
4              
5             # This software is copyright (c) 2001-2025 by Mark Overmeer.
6              
7             # This is free software; you can redistribute it and/or modify it under
8             # the same terms as the Perl 5 programming language system itself.
9             # SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later
10              
11              
12             package Mail::Box::File::Message;{
13             our $VERSION = '4.01';
14             }
15              
16 25     25   1402 use parent 'Mail::Box::Message';
  25         70  
  25         169  
17              
18 25     25   2104 use strict;
  25         102  
  25         696  
19 25     25   114 use warnings;
  25         49  
  25         1595  
20              
21 25     25   233 use Log::Report 'mail-box', import => [ qw/__x error trace/ ];
  25         62  
  25         255  
22              
23 25     25   4681 use List::Util qw/sum/;
  25         64  
  25         27485  
24              
25             #--------------------
26              
27             sub init($)
28 1304     1304 0 15006 { my ($self, $args) = @_;
29 1304         5182 $self->SUPER::init($args);
30              
31 1304 50       4040 $self->fromLine($args->{from_line}) if exists $args->{from_line};
32 1304         3693 $self;
33             }
34             #--------------------
35              
36             sub fromLine(;$)
37 171     171 1 279 { my $self = shift;
38 171 50       472 $self->{MBMM_from_line} = shift if @_;
39 171   66     818 $self->{MBMM_from_line} ||= $self->head->createFromLine;
40             }
41              
42             #--------------------
43              
44             sub coerce($)
45 98     98 1 1453 { my ($self, $message) = @_;
46 98 50       921 $message->isa(__PACKAGE__) ? $message : $self->SUPER::coerce($message)->labelsToStatus;
47             }
48              
49              
50             sub write(;$)
51 126     126 1 200 { my $self = shift;
52 126   33     360 my $out = shift || select;
53              
54 126         303 my $escaped = $self->escapedBody;
55 126         404 $out->print($self->fromLine);
56              
57 126         38126 my $size = sum 0, map length, @$escaped;
58              
59 126         497 my $head = $self->head;
60 126         929 $head->set('Content-Length' => $size);
61 126         13872 $head->set('Lines' => scalar @$escaped);
62 126         11871 $head->print($out);
63              
64 126         26847 $out->print($_) for @$escaped;
65 126         21934 $out->print("\n");
66 126         1142 $self;
67             }
68              
69             sub clone()
70 45     45 1 101 { my $self = shift;
71 45         208 my $clone = $self->SUPER::clone;
72 45         974 $clone->{MBMM_from_line} = $self->fromLine;
73 45         231 $clone;
74             }
75              
76              
77             sub escapedBody()
78 126     126 1 324 { my @lines = shift->body->lines;
79 126         13961 s/^(\>*From )/>$1/ for @lines;
80 126         320 \@lines;
81             }
82              
83             #--------------------
84              
85             sub readFromParser($)
86 1304     1304 1 2860 { my ($self, $parser) = @_;
87 1304         5642 my ($start, $fromline) = $parser->readSeparator;
88 1304 100       104511 $fromline or return;
89              
90 1264         3938 $self->{MBMM_from_line} = $fromline;
91 1264         3314 $self->{MBMM_begin} = $start;
92              
93 1264         4830 $self->SUPER::readFromParser($parser);
94             }
95              
96 4255     4255 0 11241 sub loadHead() { $_[0]->head }
97              
98              
99             sub loadBody()
100 27     27 1 60 { my $self = shift;
101              
102 27         88 my $body = $self->body;
103 27 100       364 $body->isDelayed or return $body;
104              
105 21         95 my ($begin, $end) = $body->fileLocation;
106 21         88 my $parser = $self->folder->parser;
107 21         181 $parser->filePosition($begin);
108              
109 21         648 my $msgid = $self->messageId;
110 21 50       180 my $newbody = $self->readBody($parser, $self->head)
111             or error __x"unable to read delayed body for {msgid}", msgid => $msgid;
112              
113 21         33550 trace "Loaded delayed body for $msgid";
114 21         963 $self->storeBody($newbody->contentInfoFrom($self->head));
115 21         8653 $newbody;
116             }
117              
118              
119             sub fileLocation()
120 626     626 1 515281 { my $self = shift;
121              
122             wantarray
123             ? ($self->{MBMM_begin}, ($self->body->fileLocation)[1])
124 626 100       2580 : $self->{MBMM_begin};
125             }
126              
127              
128             sub moveLocation($)
129 271     271 1 544 { my ($self, $dist) = @_;
130 271         562 $self->{MBMM_begin} -= $dist;
131              
132 271         788 $self->head->moveLocation($dist);
133 271         3573 $self->body->moveLocation($dist);
134 271         2086 $self;
135             }
136              
137             1;