File Coverage

blib/lib/Mail/Server/IMAP4/List.pm
Criterion Covered Total %
statement 54 57 94.7
branch 28 32 87.5
condition 5 6 83.3
subroutine 9 11 81.8
pod 6 7 85.7
total 102 113 90.2


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::Server::IMAP4::List;{
13             our $VERSION = '4.01';
14             }
15              
16              
17 2     2   377794 use strict;
  2         4  
  2         94  
18 2     2   13 use warnings;
  2         4  
  2         129  
19              
20 2     2   67 use Log::Report 'mail-box-imap4', import => [];
  2         5  
  2         29  
21              
22             #--------------------
23              
24             sub new($)
25 2     2 1 338511 { my ($class, %args) = @_;
26 2         11 (bless {}, $class)->init(\%args);
27             }
28              
29             sub init($)
30 2     2 0 4 { my ($self, $args) = @_;
31 2         11 my $user = $self->{MSIL_user} = $args->{user};
32 2         5 $self->{MSIL_folders} = $args->{folders};
33 2         5 $self->{MSIL_inbox} = $args->{inbox};
34 2 50       8 $self->{MSIL_delim} = exists $args->{delimiter} ? $args->{delimiter} : '/';
35 2         11 $self;
36             }
37              
38             #--------------------
39              
40             sub delimiter(;$)
41 32     32 1 55 { my $delim = shift->{MSIL_delim};
42 32 100       125 ref $delim ? $delim->(shift) : $delim;
43             }
44              
45              
46 0     0 1 0 sub user() { $_[0]->{MSIL_user} }
47              
48              
49             sub folders()
50 28     28 1 55 { my $self = shift;
51 28 50       78 $self->{MSIL_folders} || $self->user->topfolder;
52             }
53              
54              
55             sub inbox()
56 0     0 1 0 { my $self = shift;
57 0 0       0 $self->{MSIL_inbox} || $self->user->inbox;
58             }
59              
60             #--------------------
61              
62             sub list($$)
63 32     32 1 24658 { my ($self, $base, $pattern) = @_;
64              
65 32 100       125 return [ '(\Noselect)', $self->delimiter($base), '' ]
66             if $pattern eq '';
67              
68 28         52 my $delim = $self->delimiter($base);
69 28         433 my @path = split $delim, $base;
70 28         69 my $folder = $self->folders;
71              
72 28   66     93 while(@path && defined $folder)
73 35         1889 { $folder = $folder->folder(shift @path);
74             }
75 28 100       2437 defined $folder or return ();
76              
77 26         225 my @pattern = split $delim, $pattern;
78 26         55 return $self->_list($folder, $delim, @pattern);
79             }
80              
81             sub _list($$@)
82 127     127   8894 { my ($self, $folder, $delim) = (shift, shift, shift);
83              
84 127 100       241 if(!@_)
85 36         38 { my @flags;
86 36 100 100     89 push @flags, '\Noselect'
87             if $folder->onlySubfolders || $folder->deleted;
88              
89 36 100       367 push @flags, '\Noinferiors' unless $folder->inferiors;
90 36         177 my $marked = $folder->marked;
91 36 100       142 push @flags, ($marked ? '\Marked' : '\Unmarked')
    100          
92             if defined $marked;
93              
94 36         50 local $" = ' ';
95              
96             # This is not always correct... should compose the name from the
97             # parts... but in nearly all cases, the following is sufficient.
98 36         63 my $name = $folder->fullname;
99 36         5210 for($name)
100 36         113 { s/^=//;
101 36         192 s![/\\]!$delim!g;
102             }
103 36         199 return [ "(@flags)", $delim, $name ];
104             }
105              
106 91         127 my $pat = shift;
107 91 100       179 if($pat eq '%')
108 3 100       7 { my $subs = $folder->subfolders
109             or return $self->_list($folder, $delim);
110 2         218 return map $self->_list($_, $delim, @_), $subs->sorted;
111             }
112              
113 88 100       143 if($pat eq '*')
114 40         85 { my @own = $self->_list($folder, $delim, @_);
115 40 100       707 my $subs = $folder->subfolders or return @own;
116 13         1797 return @own, map $self->_list($_, $delim, '*', @_), $subs->sorted;
117             }
118              
119 48 100       120 $folder = $folder->find(subfolders => $pat) or return ();
120 20         1225 $self->_list($folder, $delim, @_);
121             }
122              
123             #--------------------
124              
125             1;