$VERSION
=
'2.065'
;
sub
new($)
{
my
(
$class
,
%args
) =
@_
;
my
$self
=
bless
{},
$class
;
my
$user
=
$self
->{MSIL_user} =
$args
{user};
$self
->{MSIL_folders} =
$args
{folders};
$self
->{MSIL_inbox} =
$args
{inbox};
$self
->{MSIL_delim} =
exists
$args
{delimiter} ?
$args
{delimiter} :
'/'
;
$self
;
}
sub
delimiter(;$)
{
my
$delim
=
shift
->{MSIL_delim};
ref
$delim
?
$delim
->(
shift
) :
$delim
;
}
sub
user() {
shift
->{MSIL_user} }
sub
folders()
{
my
$self
=
shift
;
$self
->{MSIL_folders} ||
$self
->user->topfolder;
}
sub
inbox()
{
my
$self
=
shift
;
$self
->{MSIL_inbox} ||
$self
->user->inbox;
}
sub
list($$)
{
my
(
$self
,
$base
,
$pattern
) =
@_
;
return
[
'(\Noselect)'
,
$self
->delimiter(
$base
),
''
]
if
$pattern
eq
''
;
my
$delim
=
$self
->delimiter(
$base
);
my
@path
=
split
$delim
,
$base
;
my
$folder
=
$self
->folders;
while
(
@path
&&
defined
$folder
)
{
$folder
=
$folder
->folder(
shift
@path
);
}
defined
$folder
or
return
();
my
@pattern
=
split
$delim
,
$pattern
;
return
$self
->_list(
$folder
,
$delim
,
@pattern
);
}
sub
_list($$@)
{
my
(
$self
,
$folder
,
$delim
) = (
shift
,
shift
,
shift
);
if
(!
@_
)
{
my
@flags
;
push
@flags
,
'\Noselect'
if
$folder
->onlySubfolders ||
$folder
->deleted;
push
@flags
,
'\Noinferiors'
unless
$folder
->inferiors;
my
$marked
=
$folder
->marked;
push
@flags
, (
$marked
?
'\Marked'
:
'\Unmarked'
)
if
defined
$marked
;
local
$" =
' '
;
my
$name
=
$folder
->fullname;
for
(
$name
)
{ s/^=//;
s![/\\]!
$delim
!g;
}
return
[
"(@flags)"
,
$delim
,
$name
];
}
my
$pat
=
shift
;
if
(
$pat
eq
'%'
)
{
my
$subs
=
$folder
->subfolders
or
return
$self
->_list(
$folder
,
$delim
);
return
map
{
$self
->_list(
$_
,
$delim
,
@_
) }
$subs
->sorted;
}
if
(
$pat
eq
'*'
)
{
my
@own
=
$self
->_list(
$folder
,
$delim
,
@_
);
my
$subs
=
$folder
->subfolders or
return
@own
;
return
@own
,
map
{
$self
->_list(
$_
,
$delim
,
'*'
,
@_
) }
$subs
->sorted;
}
$folder
=
$folder
->find(
subfolders
=>
$pat
) or
return
();
$self
->_list(
$folder
,
$delim
,
@_
);
}
1;