<!-- -*- mode:text coding:euc-jp -*-
   $FML: encode.sgml,v 1.2 2003/04/15 14:51:42 fukachan Exp $
-->

<chapter id="module.mail.message.encode">
	<title>
	Mail::Message::Encode クラス
	</title>


<sect1 id="module.mail.message.encode.examplee">
	<title>
	[見本] Mail::Message::Encode の使い方
	</title>

<para>
[リファレンス]
fml-help ML's Count: 02012, 02013, 02016 など
</para>

<screen>
[使い方の例]

   * fml 8.0 風の使い方 

	use Mail::Message::Encode;
	my $encode  = new Mail::Message::Encode;
	my $str_euc = $encode->convert( $s, 'euc-jp' );
	my $str_euc = $encode->convert( $s, 'euc-jp', 'iso-2022-jp' );

	my $encode  = new Mail::Message::Encode;
	my $status  = $encode->convert_str_ref( \$s, 'euc-jp' );
	my $status  = $encode->convert_str_ref( \$s, 'euc-jp', 'jis' );

	my $fp = sub { ... };
	$encode->run_in_chcode( $fp, $oout, $in );

   * fml 4.0 互換風の使い方

	ues Mail::Message::Encode qw(STR2EUC);
	my $euc_s = STR2EUC( $s );
</screen>

</sect1>


<sect1 id="module.mail.message.encode.specification">
	<title>
	Mail::Message::Encode の仕様(あらすじ)
	</title>

<para>
本体はプライベートメソッド _convert_str_ref() にまとめてあります。

<screen>
   sub convert # 引数 STR が変換対象
   {
	my ($self, $str, $out_code, $in_code) = @_;
	_convert_str_ref(\$str, $out, $in);

        return $str;
   }


   sub convert_str_ref # 引数 STR_REF が変換対象
   {
	my ($self, $str, $out, $in) = @_;
	_convert_str_ref($str, $out, $in);
   }


   sub _convert_str_ref # 引数 STR_REF が変換対象
   {
        my ($str, $out, $in) = @_;

        # 1. 推測
        もし $in がない → 推測 → 失敗 → 0 をかえす？ 

        # 2. 変換をトライ
        if ($in がわかった or $in が指定された) {
                $out へ変換
                jcode, Jcode, Encode などのモジュールが変換をがんばる
                return 1 ; ＃成功
        }
        else { # principle of least surprise ?
                なにもしない＃ str を、そのまま返す
        }

        return 0 ; # 失敗
   }
</screen>

<screen>
sub base64 {}
sub quoted_printable {}
</screen>
があるといいですかね？
<screen>
$x = $encode->base64($s);
</screen>
また、互換性というか便宜上、STR2XXX() も準備します。
<screen>
   STR2EUC(  $str, [$icode] )
   STR2JIS(  $str, [$icode] )
   STR2SJIS( $str, [$icode] )
</screen>
は convert_str_ref を wrap する関数です。
</para>

</sect1>


<sect1 id="module.mail.message.encode.run.in.code">
	<title>
	ユーティリティ run_in_chcode()
	</title>

<para>
言語依存処理の過程では、
プログラムが扱いやすい文字コード(内部処理コード)に変換し、
処理を行なう関数が多数存在します。
そこで、そういった処理のための下請け関数を用意しておくと便利です。
</para>

<para>
run_in_chcode() は、
引数にある関数 $proc を実行します。
関数 $proc を実行する際の引数は、
あらかじめ指定された文字コードに変換したあと、
関数 $proc に渡されるという仕様です。
</para>

<para>
<screen>
sub run_in_code
{
    my ($self, $proc, $s, $args, $out_code, $in_code) = @_;
    my $proc_status = undef;

    my $obj         = new Mail::Message::Encode;
    my $conv_status = $obj->convert_str_ref(\$s, $out_code, $in_code);

    # XXX-TODO: validate $proc name regexp.
    eval q{
        $proc_status = &$proc($s, $args);
    };

    # XXX-TODO: correct ?
    if ($conv_status && $out_code) {
        $obj->convert_str_ref($s, $out_code, $in_code);
    }

    return wantarray ? ($conv_status, $proc_status): $conv_status;
}
</screen>
これは、次のように動作します。
<screen>
(1) $s を EUC-JP へ変換。
(2) $proc($s, $args); を実行。
(3) $proc の実行結果を返す。
</screen>
</para>

</sect1>


</chapter>
