#!/usr/bin/perl

=head1 NAME

al2mh - al2mh convert mail spool from AL-Mail32 to mh format.

=head1 SYNOPSIS

$ al2mh directory

directory is AL-Mail32 mail spool of an Account.

=head1 DESCRIPTION

 First, you must copy directory what is mail spool of AL-Mail32 from Windows to Linux.

(ex)c:\Program Files\Almail32\Mailbox\Account1

 If you copy to home directory as Account, you must type following on terminal.

$ al2mh ~/Account1

 Then this program convert mail spool to mh format in ~/Mail/.

=head1 AUTHOR

Yasumichi Akahoshi <yasumichi@users.sourceforge.jp>

=head1 SEE ALSO

al2syl-addr

=cut

# declaration to use module and library.
use Jcode;
require 'w2l-tools.pl';

# AL-Mail32 forder name => mh directory name
%objdirs = (
	'Inbox.box'	=> 'inbox',
	'Outbox.box'	=> 'sent',
);

$mhdir = 'Mail';	# name of mh directory


#
# ᥤ롼
#

$mhdir = $ENV{'HOME'}."/$mhdir/";	# append home directory name

# check arguments.
if(@ARGV != 1) {
	die "Invalid argument.\n";
}

$ALdir = $ARGV[0];	# place AL-Mail32 mail spool

if(not(-d $ALdir)) {	# Is $ALdir directory.
	die "$ALdir isn't directory.\n";
}

# Include trailing back slash
if ($ALdir =~ /[^\/]$/) {
	$ALdir = $ALdir."/";
}

# mh directory is made if it isn't exists.
if (not(-e $mhdir)) {
	mkdir($mhdir);
}

# get list in directory.
opendir(DIR, $ALdir) or die;
@files = readdir(DIR);
closedir(DIR);

# convert each directory.
foreach $file (@files) {
	next if $file =~ /^\./;
	next if (-f $ALdir.$file);
	$srcdir = $ALdir.$file.'/';	# source
	if(exists($objdirs{$file})) {	# object
		$objdir = $mhdir.$objdirs{$file};
	} else {
		$objdir = $mhdir.&get_folder_title($srcdir);
	}
	$objdir = &mkobjdir($objdir);	# Object directory is made.

	$dnumber = &get_first_name($objdir);	# get first file name.

	# convert each mail file.
	opendir(DIR, $srcdir);
	foreach $srcdata (readdir(DIR)) {
		next if (not($srcdata =~ /\.ALM/i));
		print "convert: $srcdir$srcdata => $objdir$dnumber\n";
		$mail = &convert_mail($srcdir.$srcdata);
		open(FILE, ">$objdir$dnumber") or die "$objdir$dnumber couldn't be create.\n";
		print FILE $mail;
		close(FILE);
		$dnumber++;
	}
	close(DIR);
}


#
# convert mail data
#

sub convert_mail {
	my($fname) = @_;	# File name.
	my $header = "";	# Header
	my $body = "";		# Body

	open(FILE, $fname) or die;

	# Get header and convert to Base64
	do {
		$line = <FILE>;
		$line =~ s/\r\n/\n/g;
		$line = jcode($line)->mime_encode;
		$header = $header.$line;
	} until ($line =~ /^$/);

	# Get body and convert character code to iso-2022-jp
	while (defined($line = <FILE>)) {
		$line =~ s/\r\n/\n/g;
		$body = $body.$line;
	}
	$body = jcode($body)->jis;

	close(FILE);

	# return result
	return $header.$body;
}

#
# ѴΥǥ쥯ȥ
#	¸ߤǥ쥯ȥǤʤѤΥǥ쥯ȥ֤
#
sub mkobjdir {
	my($dir) = @_;

	if(-f $dir) {
		print STDERR "$dir is normal file.\n";
		my $obj = $dir.'.AL/';
		mkdir($obj);
		return	$obj;
	}

	if (not(-e $dir)) {
		mkdir($dir);
	}

	return	$dir.'/';	# /䴰
}

#
# Entry.inititle
#
sub get_folder_title {
	my($srcdir) = @_;

	open(FILE, $srcdir."Entry.ini") or die $srcdir."Entry.ini isn't exists\n";
	@lines = <FILE>;
	close(FILE);

	foreach $line (@lines) {
		$line =~ s/\r\n/\n/g;
		if($line =~ /^Title=(.*)$/) {
			$title = jcode($1)->euc;
		}
	}

	return $title;
}
