$VERSION
=
'3.010'
;
our
$default_folder_dir
=
exists
$ENV
{HOME} ?
$ENV
{HOME} .
'/Mail'
:
'.'
;
our
$default_sub_extension
=
'.d'
;
sub
init($)
{
my
(
$self
,
$args
) =
@_
;
$self
->{MBM_sub_ext}
=
$args
->{subfolder_extension} ||
$default_sub_extension
;
$self
->SUPER::init(
$args
);
}
sub
create($@)
{
my
(
$thingy
,
$name
,
%args
) =
@_
;
my
$class
=
ref
$thingy
||
$thingy
;
$args
{folderdir} ||=
$default_folder_dir
;
$args
{subfolder_extension} ||=
$default_sub_extension
;
$class
->SUPER::create(
$name
,
%args
);
}
sub
foundIn($@)
{
my
$class
=
shift
;
my
$name
=
@_
% 2 ?
shift
:
undef
;
my
%args
=
@_
;
$name
||=
$args
{folder} or
return
;
my
$folderdir
=
$args
{folderdir} ||
$default_folder_dir
;
my
$extension
=
$args
{subfolder_extension} ||
$default_sub_extension
;
my
$filename
=
$class
->folderToFilename(
$name
,
$folderdir
,
$extension
);
if
(-d
$filename
)
{
return
0
if
-d File::Spec->catdir(
$filename
,
'new'
);
local
*DIR
;
if
(
opendir
DIR,
$filename
)
{
my
@f
=
grep
!/^\./,
readdir
DIR;
return
0
if
@f
&& !
grep
/\D/,
@f
;
closedir
DIR;
}
return
0
if
-f
"$filename/.mh_sequences"
;
return
1;
}
return
0
unless
-f
$filename
;
return
1
if
-z
$filename
;
open
my
$file
,
'<:raw'
,
$filename
or
return
0;
local
$_
;
while
(<
$file
>)
{
next
if
/^\s*$/;
$file
->
close
;
return
substr
(
$_
, 0, 5) eq
'From '
;
}
return
1;
}
sub
delete
(@)
{
my
$self
=
shift
;
$self
->SUPER::
delete
(
@_
);
my
$subfdir
=
$self
->filename .
$default_sub_extension
;
rmdir
$subfdir
;
}
sub
writeMessages($)
{
my
(
$self
,
$args
) =
@_
;
$self
->SUPER::writeMessages(
$args
) or
return
;
if
(
$self
->{MB_remove_empty})
{
rmdir
$self
->filename .
$self
->{MBM_sub_ext};
}
$self
;
}
sub
type() {
'mbox'
}
sub
listSubFolders(@)
{
my
(
$thingy
,
%args
) =
@_
;
my
$class
=
ref
$thingy
||
$thingy
;
my
$skip_empty
=
$args
{skip_empty} || 0;
my
$check
=
$args
{check} || 0;
my
$folder
=
exists
$args
{folder} ?
$args
{folder} :
'='
;
my
$folderdir
=
exists
$args
{folderdir}
?
$args
{folderdir}
:
$default_folder_dir
;
my
$extension
=
$args
{subfolder_extension};
my
$dir
;
if
(
ref
$thingy
)
{
$extension
||=
$thingy
->{MBM_sub_ext};
$dir
=
$thingy
->filename;
}
else
{
$extension
||=
$default_sub_extension
;
$dir
=
$class
->folderToFilename(
$folder
,
$folderdir
,
$extension
);
}
my
$real
= -d
$dir
?
$dir
:
"$dir$extension"
;
opendir
DIR,
$real
or
return
();
my
@entries
=
grep
!m/\.lo?ck$|^\./,
readdir
DIR;
closedir
DIR;
my
%folders
;
foreach
(
@entries
)
{
my
$entry
= File::Spec->catfile(
$real
,
$_
);
if
( -f
$entry
)
{
next
if
$args
{skip_empty} && ! -s _;
next
if
$args
{check} && !
$class
->foundIn(
$entry
);
$folders
{
$_
}++;
}
elsif
( -d _ )
{
if
(
$args
{skip_empty})
{
opendir
DIR,
$entry
or
next
;
my
@sub
=
grep
!/^\./,
readdir
DIR;
closedir
DIR;
next
unless
@sub
;
}
(
my
$folder
=
$_
) =~ s/
$extension
$//;
$folders
{
$folder
}++;
}
}
map
+(m/(.*)/ && $1),
keys
%folders
;
}
sub
openRelatedFolder(@)
{
my
$self
=
shift
;
$self
->SUPER::openRelatedFolder(
subfolder_extension
=>
$self
->{MBM_sub_ext}
,
@_
);
}
sub
folderToFilename($$;$)
{
my
(
$thingy
,
$name
,
$folderdir
,
$extension
) =
@_
;
$extension
||=
ref
$thingy
?
$thingy
->{MBM_sub_ext} :
$default_sub_extension
;
$name
=~ s
my
@parts
=
split
m!/!,
$name
;
my
$real
=
shift
@parts
;
$real
=
'/'
if
$real
eq
''
;
if
(
@parts
)
{
my
$file
=
pop
@parts
;
$real
= File::Spec->catdir(
$real
.(-d
$real
?
''
:
$extension
),
$_
)
foreach
@parts
;
$real
= File::Spec->catfile(
$real
.(-d
$real
?
''
:
$extension
),
$file
);
}
$real
;
}
1;