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 7     7   175719 use v5.26;
  7         22  
3 7     7   35 use strict;
  7         11  
  7         182  
4 7     7   52 use warnings;
  7         10  
  7         305  
5 7     7   3166 use IO::Dir;
  7         101720  
  7         348  
6 7     7   62 use IO::File;
  7         10  
  7         1006  
7             use Class::Accessor::Lite (
8 7         81 '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 7     7   1234 );
  7         2900  
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 11     11 1 445896 my $class = shift;
27 11 50 100     47 my $argv1 = shift // return undef; return undef unless -d $argv1;
  10         232  
28 10         27 my $files = 0;
29              
30 10         20 eval {
31             # Count the number of files in the Maildir/
32 10         5917 opendir MAILDIR, $argv1;
33 10         3084 while( my $e = readdir MAILDIR ) {
34 3911 100       31291 next unless -f sprintf("%s/%s", $argv1, $e);
35 3891         6433 $files += 1;
36             }
37 10         193 closedir MAILDIR;
38             };
39              
40 10         120 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 10         1552 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 3269     3269 1 667716 my $self = shift;
55 3269 50       7954 return "" unless defined $self->{'dir'};
56 3269 50       71782 return "" unless -d $self->{'dir'};
57 3269 100       9593 return "" unless $self->{'offset'} < $self->{'size'};
58              
59 3260         5069 my $seekhandle = $self->{'handle'};
60 3260         3871 my $readbuffer = '';
61              
62 3260         3889 eval {
63 3260 50       6103 $seekhandle = IO::Dir->new($self->{'dir'}) unless $seekhandle;
64 3260         11618 while( my $r = $seekhandle->read ) {
65             # Read each file in the directory
66 3278 100 100     35431 next if( $r eq '.' || $r eq '..' );
67              
68 3260         5366 my $emailindir = $self->{'dir'}.'/'.$r;
69 3260         5913 $emailindir =~ y{/}{}s;
70 3260         6219 $self->{'offset'} += 1;
71 3260 50       43893 next unless -f $emailindir;
72 3260 50       25024 next unless -s $emailindir;
73 3260 50       27761 next unless -r $emailindir;
74              
75 3260         6371 $self->{'path'} = $emailindir;
76 3260         4574 $self->{'file'} = $r;
77 3260         20027 my $filehandle = IO::File->new($emailindir, 'r');
78 3260         322442 $readbuffer = do { local $/; <$filehandle> };
  3260         11513  
  3260         168280  
79 3260         14053 $filehandle->close;
80 3260         59713 last;
81             }
82 3260 100       11156 $seekhandle->close unless $self->{'offset'} < $self->{'size'};
83             };
84 3260         14372 return $readbuffer;
85             }
86              
87             1;
88             __END__