File Coverage

lib/Sisimai/Mail/Maildir.pm
Criterion Covered Total %
statement 55 55 100.0
branch 15 22 68.1
condition 5 5 100.0
subroutine 8 8 100.0
pod 2 2 100.0
total 85 92 92.3


line stmt bran cond sub pod time code
1             package Sisimai::Mail::Maildir;
2 6     6   136391 use v5.26;
  6         23  
3 6     6   53 use strict;
  6         11  
  6         140  
4 6     6   43 use warnings;
  6         9  
  6         342  
5 6     6   2927 use IO::Dir;
  6         98343  
  6         358  
6 6     6   44 use IO::File;
  6         7  
  6         1017  
7             use Class::Accessor::Lite (
8 6         62 'new' => 0,
9             'ro' => [
10             'dir', # [String] Path to Maildir/
11             ],
12             'rw' => [
13             'path', # [String] Path to each file
14             'file', # [String] Each file name of a mail in the Maildir/
15             'size', # [Integer] The number of email files in the Maildir/
16             'offset', # [Integer] The number of email files which have been read
17             'handle', # [IO::Dir] Directory handle
18             ]
19 6     6   1714 );
  6         2941  
20              
21             sub new {
22             # Constructor of Sisimai::Mail::Maildir
23             # @param [String] argv1 Path to Maildir/
24             # @return [Sisimai::Mail::Maildir] Object
25             # [Undef] is not a directory or does not exist
26 10     10 1 377692 my $class = shift;
27 10 50 100     50 my $argv1 = shift // return undef; return undef unless -d $argv1;
  9         227  
28 9         24 my $files = 0;
29              
30 9         18 eval {
31             # Count the number of files in the Maildir/
32 9         7709 opendir MAILDIR, $argv1;
33 9         1883 while( my $e = readdir MAILDIR ) {
34 3896 100       35302 next unless -f sprintf("%s/%s", $argv1, $e);
35 3878         7137 $files += 1;
36             }
37 9         379 closedir MAILDIR;
38             };
39              
40 9         180 my $param = {
41             'dir' => $argv1,
42             'file' => undef,
43             'path' => undef,
44             'size' => $files,
45             'offset' => 0,
46             'handle' => IO::Dir->new($argv1),
47             };
48 9         2351 return bless($param, __PACKAGE__);
49             }
50              
51             sub read {
52             # Maildir reader, works as an iterator.
53             # @return [String] Contents of file in Maildir/
54 3257     3257 1 896045 my $self = shift;
55 3257 50       12931 return "" unless defined $self->{'dir'};
56 3257 50       105037 return "" unless -d $self->{'dir'};
57 3257 100       16167 return "" unless $self->{'offset'} < $self->{'size'};
58              
59 3249         10262 my $seekhandle = $self->{'handle'};
60 3249         6864 my $readbuffer = '';
61              
62 3249         5621 eval {
63 3249 50       9841 $seekhandle = IO::Dir->new($self->{'dir'}) unless $seekhandle;
64 3249         20177 while( my $r = $seekhandle->read ) {
65             # Read each file in the directory
66 3265 100 100     55415 next if( $r eq '.' || $r eq '..' );
67              
68 3249         8150 my $emailindir = $self->{'dir'}.'/'.$r;
69 3249         7972 $emailindir =~ y{/}{}s;
70 3249         6981 $self->{'offset'} += 1;
71 3249 50       57378 next unless -f $emailindir;
72 3249 50       32199 next unless -s $emailindir;
73 3249 50       41987 next unless -r $emailindir;
74              
75 3249         10882 $self->{'path'} = $emailindir;
76 3249         10123 $self->{'file'} = $r;
77 3249         34728 my $filehandle = IO::File->new($emailindir, 'r');
78 3249         524942 $readbuffer = do { local $/; <$filehandle> };
  3249         19672  
  3249         407753  
79 3249         21895 $filehandle->close;
80 3249         82820 last;
81             }
82 3249 100       19670 $seekhandle->close unless $self->{'offset'} < $self->{'size'};
83             };
84 3249         18030 return $readbuffer;
85             }
86              
87             1;
88             __END__