File Coverage

blib/lib/Mail/Box/IMAP4/Message.pm
Criterion Covered Total %
statement 15 93 16.1
branch 0 50 0.0
condition 0 21 0.0
subroutine 5 14 35.7
pod 6 9 66.6
total 26 187 13.9


line stmt bran cond sub pod time code
1             # This code is part of Perl distribution Mail-Box-IMAP4 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::IMAP4::Message;{
13             our $VERSION = '4.01';
14             }
15              
16 3     3   1440 use parent 'Mail::Box::Net::Message';
  3         7  
  3         24  
17              
18 3     3   2418 use strict;
  3         7  
  3         103  
19 3     3   15 use warnings;
  3         5  
  3         224  
20              
21 3     3   18 use Log::Report 'mail-box-imap4', import => [];
  3         6  
  3         19  
22              
23 3     3   452 use Date::Parse qw/str2time/;
  3         7  
  3         3863  
24              
25             #--------------------
26              
27             sub init($)
28 0     0 0   { my ($self, $args) = @_;
29 0           $self->SUPER::init($args);
30              
31 0 0         $self->{MBIM_write_labels} = exists $args->{write_labels} ? $args->{write_labels} : 1;
32 0           $self->{MBIM_cache_labels} = $args->{cache_labels};
33 0           $self->{MBIM_cache_head} = $args->{cache_head};
34 0           $self->{MBIM_cache_body} = $args->{cache_body};
35 0           $self;
36             }
37              
38              
39             sub size($)
40 0     0 1   { my $self = shift;
41 0 0         $self->isDelayed ? $self->fetch('RFC822.SIZE') : $self->SUPER::size;
42             }
43              
44             sub recvstamp()
45 0     0 0   { my $date = shift->fetch('INTERNALDATE');
46 0 0         defined $date ? str2time($date) : undef;
47             }
48              
49              
50             sub label(@)
51 0     0 1   { my $self = shift;
52 0 0         my $imap = $self->folder->transporter or return;
53 0 0         my $id = $self->unique or return;
54              
55 0 0         if(@_ == 1)
56             { # get one value only
57 0           my $label = shift;
58 0           my $labels = $self->{MM_labels};
59             return $labels->{$label}
60 0 0 0       if exists $labels->{$label} || exists $labels->{seen};
61              
62 0           my $flags = $imap->getFlags($id);
63 0 0         if($self->{MBIM_cache_labels})
64             { # the program may have added own labels
65 0           @{$labels}{keys %$flags} = values %$flags;
  0            
66 0           delete $self->{MBIM_labels_changed};
67             }
68 0           return $flags->{$label};
69             }
70              
71 0           my @private;
72 0 0         if($self->{MBIM_write_labels})
73 0           { @private = $imap->setFlags($id, @_);
74 0           delete $self->{MBIM_labels_changed};
75             }
76             else
77 0           { @private = @_;
78             }
79              
80 0           my $labels = $self->{MM_labels};
81 0 0         my @keep = $self->{MBIM_cache_labels} ? @_ : @private;
82              
83 0           while(@keep)
84 0           { my ($k, $v) = (shift @keep, shift @keep);
85 0 0 0       next if defined $labels->{$k} && $labels->{$k} eq $v;
86              
87 0           $self->{MBIM_labels_changed}++;
88 0           $labels->{$k} = $v;
89             }
90              
91 0 0 0       $self->modified(1) if @private && $self->{MBIM_labels_changed};
92 0           $self;
93             }
94              
95              
96             sub labels()
97 0     0 1   { my $self = shift;
98 0           my $id = $self->unique;
99 0           my $labels = $self->SUPER::labels;
100 0 0         $labels = +{ %$labels } unless $self->{MBIM_cache_labels};
101              
102 0 0 0       if($id && !exists $labels->{seen})
103 0 0         { my $imap = $self->folder->transporter or return;
104 0           my $flags = $imap->getFlags($id);
105 0           @{$labels}{keys %$flags} = values %$flags;
  0            
106             }
107              
108 0           $labels;
109             }
110              
111             #--------------------
112              
113             sub loadHead()
114 0     0 0   { my $self = shift;
115 0           my $head = $self->head;
116 0 0         $head->isDelayed or return $head;
117              
118 0           $head = $self->folder->getHead($self);
119 0 0         $self->head($head) if $self->{MBIM_cache_head};
120 0           $head;
121             }
122              
123             sub loadBody()
124 0     0 1   { my $self = shift;
125              
126 0           my $body = $self->body;
127 0 0         $body->isDelayed or return $body;
128              
129 0           (my $head, $body) = $self->folder->getHeadAndBody($self);
130 0 0         defined $head or return undef;
131              
132 0 0 0       $self->head($head) if $self->{MBIM_cache_head} && $head->isDelayed;
133 0 0         $self->storeBody($body) if $self->{MBIM_cache_body};
134 0           $body;
135             }
136              
137              
138             sub fetch(@)
139 0     0 1   { my ($self, @info) = @_;
140 0           my $folder = $self->folder;
141 0           my $answer = ($folder->fetch( [$self], @info))[0];
142              
143 0 0         @info==1 ? $answer->{$info[0]} : @{$answer}{@info};
  0            
144             }
145              
146              
147             sub writeDelayed($$)
148 0     0 1   { my ($self, $foldername, $imap) = @_;
149              
150 0           my $id = $self->unique;
151 0           my $labels = $self->labels;
152              
153 0 0 0       if($self->head->modified || $self->body->modified || !$id)
    0 0        
154 0           { $imap->appendMessage($self, $foldername);
155 0 0         if($id)
156 0           { $self->delete;
157 0           $self->unique(undef);
158             }
159             }
160             elsif($self->{MBIM_labels_changed})
161 0           { $imap->setFlags($id, %$labels); # non-IMAP4 labels disappear
162 0           delete $self->{MBIM_labels_changed};
163             }
164              
165 0           $self;
166             }
167              
168             #--------------------
169              
170             1;