
# require "./jcode.pl";

#
# クライアントからのデータを処理する
# フォームからデータを受け取り %form (i.e. $form{$name} = $value) に代入
#

sub init_form {
    local($charset) = @_;

    $method = $ENV{'REQUEST_METHOD'};
    $method =~ tr/A-Z/a-z/;
    if ($method eq 'post') {
        read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    }
    else {
        $query = $ENV{'QUERY_STRING'};
    }
    if ($ENV{'CONTENT_TYPE'} !~ /multipart\/form-data/) {
        &for_not_multipart($charset);
    }
    else {
        &for_multipart($charset);
    }
}

#
# 非マルチパートな入力に対する処理
#

sub for_not_multipart {
    my($charset) = @_;

    @form_array = split(/&/, $query);
    foreach (@form_array) {
        ($property, $value) = split(/=/);
        $value =~ tr/+/ /;   # HTTP rule
        $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C",hex($1))/eg;
        &jcode::convert(*value, $charset);
        $form{$property} = $value;
    }
}

#
# マルチパートな入力に対する処理(ここでは使用しないので無視)
#

#
# $boundary\r\nContent-Disposition: form-data; name="$name"; filename="$filename"\r\nCotent-Type: text/plain\r\n\r\n$contents\r\n
# $boundary\r\nContent-Disposition: form-data; name="$name"\r\n\r\n$contents\r\n
#

sub for_multipart {
    my($charset) = @_;

    # multipart/form-data を使う時は post でなければならない
    unless ($ENV{'REQUEST_METHOD'} eq "POST") {
        &error(" Use POST method for multipart\/form-data/");
    }

    # マルチパートのバウンダリを抽出
    ($junk, $boundary) = split (/=/, $ENV{CONTENT_TYPE}, 2);
    $boundary  =~ s/\n//;
    $boundary  = "--$boundary";

    # パートごとに切り出す（最初のパートは空）
    ($head_dummy, @fields) = split(/$boundary/, $query); 

    # パートごとに対して
    foreach $field (@fields) {
 	$field =~ s/[\r\n]*$//;
 	$field =~ s/^[\r\n]*//;
	last if ($field =~ /^--/);

	#
	$field =~ s/(.+?)\r\n//;
	$line = $1;

	$line =~ s/.*?; //; # Content-Disposition 部は必要ない
	($name, $filename) = split(/; /, $line, 2);
	($junk, $name) = split(/\"/, $name);

	$type = "";
	$file = 0;
	if ($filename ne "") {
	    $file = 1;
	    ($junk, $filename) = split(/\"/, $filename);
	    $field =~ s/(.+?)\r\n//;
	    $line = $1;
	    ($junk, $type) = split(/\: /, $line);
	    $type =~ s/\r*//g;
	    $orgname = $1 if ($filename =~ /([^\/\\]+)$/);
	}
	$field =~ s/\r\n//;

	if ($file == 1) {
	    $upfile{$name}{content} = $field;
	    $upfile{$name}{orgname} = $orgname;
	    $upfile{$name}{type} = $type;
	}
	else {
	    $form{$name} = $field;
	}
    }
}


# 使用できない(させたくない)文字から使用できる文字への置換
# HTML構文上、使用させたくない文字( & " < > )
# 便宜上(データファイルへのCSV出力)、使用させたくない文字( , )
# 好ましくない文字等(先頭末尾の空白)
sub norm_input {
    local($string) = @_;

    $string =~ s/&/&amp;/g;
    $string =~ s/\"/&quot;/g;
    $string =~ s/</&lt;/g;
    $string =~ s/>/&gt;/g;
    $string =~ s/,/&#44;/g;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;

    $string =~ s/\r\n/\n/g;
    $string =~ s/\r/\n/g;
    $string =~ s/\n\n/<br><br>/g;
    $string =~ s/\n/<br>/g;

    return($string);
}


# 排他処理が必要なファイルをロックしてからオープン
sub lock_open {
    local(*FILE, $filename) = @_;

    open(FILE, "$filename") or &error("ファイルエラー","$filename をオー
    プンできません");

    flock(FILE, 2);
}

# 排他処理が必要なファイルをクローズしてからロック解除
sub close_unlock {
    local(*FILE) = @_;

    close(FILE);   #  flock(FILE, 8) は不要(自動的にアンロック)
}

sub http_header {
    return qq|Content-type: text/html;\n\n|;
}

1;

