#####  INCM_MODULE：INCM Plug-in用 モジュール  by GETWILD'74  #############
 # 2004/04/07  Ver1.23

 # 一　五明さんのCMLIB15を参考にしました

package INCM_MODULE;

$_=$0; s/[^\\]+$//; s/data\\.*$/Plugins\\/;

# クラス読み込み
require ($_.'INCM_MODULE\Http.PM');
require ($_.'INCM_MODULE\Parse.PM');
require ($_.'INCM_MODULE\CodeCnv.PM');
require ($_.'INCM_MODULE\CMT.PM');
require ($_.'INCM_MODULE\IO.PM');
require ($_.'INCM_MODULE\BbsIni.PM');
require ($_.'INCM_MODULE\Data.PM');

$DATA = Data->new;

###########################################################################
#                                                                         #
#  +++ 設定関係 +++                                                       #
#                                                                         #
#                                                                         #

#--------------------------------------------------------------------------
#  INCM_MODULEクラスのインスタンス生成
#--------------------------------------------------------------------------
sub new{
	my $Class = shift;
	my $InParam = {@_};
	my $Param = {};

	# STDOUTのバッファリングoff
	$| = 1;
	# STDERRもバッファリングoff
	select((select(STDERR), $| = 1)[0]);

	my $InArgv = $ARGV[0];  my($wrtdat, $section);
	my($Parent) = caller;

	#------------------------------------------------------------------------
	#  初期設定
	#   入力： Init(Agent => 1); $ARGVにパラメーター
	#   出力： 0は初期設定のみ
	#    各パラメーターをセットしてインスタンス生成
	#   Agentが真ならMozilla偽装する
	#------------------------------------------------------------------------
	# フォルダプロパティ
	if ($InArgv =~ /^i$/) {
		my %UseParam = ( URL => 1, UPURL => 1, NAME => 1, EMAIL => 1, HP => 1, KEY => 1,
							USER => 1, PASS => 1, PARAM1 => 1, PARAM2 => 1,
							_URL => 2, _UPURL => 2, _NAME => 2, _EMAIL => 2, _HP => 2, _KEY => 2,
							_USER => 2, _PASS => 2, _PARAM1 => 2, _PARAM2 => 2 );
		# INIファイルの各セクション読み込み
		my $BbsIni = BbsIni->new;
		my ($Basic, $Dialog, $ETC) = $BbsIni->GetIni;
		$BbsIni->ParseParam;
		# DIALOGセクションのみはずす
		$wrtdat = $Basic.$ETC;

		my $L_Count = '000';
		my $SetProperty = $Parent.'::SetProperty';
		my $Property = &$SetProperty($BbsIni->GetBbsData);
		my $ParentDialog = $Parent.'::Dialog';
		$ParentDialog = ${$ParentDialog};
		$ParentDialog =~ s/^#//; $ParentDialog =~ s/\n #/\n/g;
		$ParentDialog =~ s/\[IniDIALOG\]/\[DIALOG\]/;
		my @Dialog = split("\n", $ParentDialog);
		my $SetDialog = shift @Dialog; $SetDialog .= "\n";
		foreach my $Line (@Dialog) {
			my $Name = $1 if ($Line =~ /^(.*?)=.*?$/);
			if ($UseParam{$Name}) {
				if (!$$Property{$Name}) {
					$SetDialog .= $Line."\n";
				} elsif ($$Property{$Name} ne '1' && $UseParam{$Name} == 2) {
					$Line =~ s/=.*?$/=$$Property{$Name}/;
					$SetDialog .= $Line."\n";
				} elsif ($UseParam{$Name} == 1) {
					$Line =~ s/1$/0/;
					$SetDialog .= $Line."\n";
				}
			} else {
				if ($$Property{$Name}) {
					if ($Name =~ /^L\d\d\d/) {
						$Line =~ s/^L\d\d\d/L$L_Count/;
						$L_Count++;
						$L_Count = sprintf("%03d", $L_Count);
						if ($$Property{$Name} ne '1') {
							$Line =~ s/(=[^,]*,[^,]*,).*/$1$$Property{$Name}/;
						}
					}
					$SetDialog .= $Line."\n";
				}
			}
		}
		$SetDialog =~ s/\n+$//;
		my $Ini = IO->new->Open('incm_bbs.ini',0 ,1);
		$Ini->Write($SetDialog,"\n",$wrtdat);
		$Ini->Close;
		return 0;

	# ローカルでのインポート
	} elsif ($InArgv) {
		# ローカルファイル変換
		$Param->{Mode}{Local} = 1; $Param->{File}{LocalFile} = $InArgv;
		$Param->{HTTP} = IO->new($InArgv, 1);
		$Param->{LOG} = IO->new('NUL', 0, 1);
		$InArgv = $ARGV[1] || '001.cm$'; 					# 出力ファイル名
		$Param->{CMT} = IO->new($InArgv, 1, 1);

		# incm_bbs.ini から必要パラメーター抽出
		my $BbsIni = BbsIni->new($Param);
		$BbsIni->ParseParam;

		# デバッグモード設定
		$DATA->Debug('Local') if ($BbsIni->GetParam('DEBUG', 'P'));

	# HTTP巡回
	} else {
		# 引数無し=巡回:ソケット設定
		$Param->{Mode}{Local} = 0;

		# incm_bbs.ini から必要パラメーター抽出
		$DATA->SetObj(Obj => 'INI', Ref => BbsIni->new($Param));
		$DATA->CallObj('INI')->ParseParam;

		# デバッグモード設定
		$DATA->Debug('Normal') if ($DATA->CallObj('INI')->GetParam('DEBUG', 'P'));

		$DATA->DebugWrite;

		$DATA->SetObj(Obj => 'HTTP', Ref => Http->new);
		$DATA->CallObj('HTTP')->Authorization;
		$DATA->SetObj(Obj => 'LOG', Ref => IO->new->Open('LOG.HTM', 1, 1));
		$DATA->SetObj(Obj => 'INCM', Ref => $Param);
	}

	$Param->{Mode}{HtmlView} = 1 if ($DATA->CallObj('INI')->GetParam('FileDown', 'L'));

	# AGENT設定
	$DATA->CallObj('HTTP')->Agent($InParam->{Agent}, $DATA->CallObj('INI')->GetParam('Proxy'));
	$DATA->SetRound(Name => 'Http,Agent', Data => $InParam->{Agent});

	bless $Param, $Class;
}

#--------------------------------------------------------------------------
#  終了処理
#--------------------------------------------------------------------------
sub Fin{
	my $Class = shift;
	select(STDOUT);
	$DATA->CallObj('HTTP')->Close if ($DATA->CallObj('HTTP'));
	$DATA->CallObj('CMT')->Close if ($DATA->CallObj('CMT'));
	$DATA->CallObj('LOG')->Close if ($DATA->CallObj('LOG'));
	$DATA->CallObj('Other')->Close if ($DATA->CallObj('Other'));

	# ローカルでなければ終了処理
	if (!$Class->GetMode('Local')) {
		if (my $UpUrl = $DATA->GetBasic('UpUrl')) {
			$DATA->CallObj('INI')->SetUpUrl($UpUrl);
		}
		# INIファイルの各セクション保存
		$DATA->CallObj('INI')->Save;
	}
	IO->StdOut(' - done.');
	$DATA->CallObj('DEBUG')->Close if ($DATA->CallObj('DEBUG'));
}

#--------------------------------------------------------------------------
#  Modeを返す
#--------------------------------------------------------------------------
sub GetMode{
	my $Class = shift;
	my $Param = shift;
	return $Class->{Mode}{$Param};
}

#--------------------------------------------------------------------------
#  iniパラメータを返す
#--------------------------------------------------------------------------
sub GetParam{
	my $Class = shift;
	my $Param = shift;
	my $Option = shift;
	return $DATA->CallObj('INI')->GetParam($Param, $Option);
}

#--------------------------------------------------------------------------
#  iniパラメータを設定
#--------------------------------------------------------------------------
sub SetParam{
	my $Class = shift;
	my $Param = shift;
	my $Option = shift;
	my $Data = shift;
	$DATA->CallObj('INI')->SetParam($Param, $Option, $Data);
}

#--------------------------------------------------------------------------
#  巡回処理
#--------------------------------------------------------------------------
sub Main{
	my $Class = shift;
	$DATA->DebugWrite(Code => '巡回メイン');
	my($BBS_Name, $BBS_Ver) = $DATA->CallObj('INI')->GetBbsData;
	my($Parent) = caller; my $RET;
	my $AutoSelect = $Parent.'::AutoSelect';
	my $SetBBSdef = $Parent.'::SetBBSdef';

	# スクリプトの種類が分かっていない場合は判別処理
	unless ($BBS_Name) {
		# ローカル変換でなければ接続
		if (!$Class->GetMode('Local')) {
			# 自動判別定義処理
			$DATA->CallObj('HTTP')->GetHttp;
			my $AutoParse = Parse->new;
			($BBS_Name, $BBS_Ver) = $AutoParse->AutoSelect(&$AutoSelect, DATA => $DATA);
			$RET = 1;
		} else {
			IO->Error('自動判定してからインポートして下さい');
		}
	}

	# 巡回用掲示板定義を設定
	my $Param = { &$SetBBSdef($BBS_Name, $BBS_Ver) };
	$DATA->SetBasic($Param->{Basic});
	#リンク元設定
	$DATA->CallObj('HTTP')->Referer;
	# ログイン
	$DATA->CallObj('HTTP')->Login if ($DATA->GetBasic('Http', 'Login'));
	#ファイルアップロードモード
	$Class->{Mode}{UpLoad} = 1 if ($Param->{CMT}{Head}{Parent}{Method} eq 'LIB' || $Param->{CMT}{Head}{Child}{Method} eq 'LIB');
	$Class->{Mode}{UpLoad} = 1 if ($Class->GetParam('FileUpload', 'L'));

	# CMTファイルのデフォルト設定
	if (!%{$Param->{CMT}{Files}}) {
		$Param->{CMT}{Files}{'001'}{Title}{Mode} = 'AUTO';
	}

	# 必要な分CMTファイルを作成しつつ巡回
	foreach my $CmtNo (sort {$a cmp $b} keys %{$Param->{CMT}{Files}}) {
		$DATA->SetRound(Name => 'CMT,No', Data => $CmtNo);
		next if (!$CmtNo);
		$DATA->SetObj(Obj => 'CMT', Ref => IO->new->Open($CmtNo.'.cm$', 1, 1));

		# CMTヘッダの設定
		$DATA->SetObj(Obj => 'HeadCMT', Ref => CMT->new($Param->{CMT}));

		# 解析定義の設定
		my $SetPrm = $Param->{Prm}; my $SetReg = $Param->{Reg};
		$SetPrm = $SetPrm->{$CmtNo} if ($SetPrm->{$CmtNo});
		$SetReg = $SetReg->{$CmtNo} if ($SetReg->{$CmtNo});
		my $Parse = Parse->new($SetPrm, $SetReg);
		$DATA->SetObj(Obj => 'Parse', Ref => $Parse);

		# 書き込み処理
		$Class->WriteMain if ($Class->{Mode}{UpLoad});

		# 各巡回処理
		my $Types = $SetPrm->{Type};
		foreach my $Type (@$Types) {
			if ($Type =~ /^Topic/) {
				$DATA->CallObj('Parse')->GetTopic($Type);
			} elsif($Type =~ /^Tree/) {
				$DATA->CallObj('Parse')->GetTree($Type);
			} elsif($Type =~ /^Other/) {
				$DATA->CallObj('Parse')->GetOther($Type);
			} else {
				$Class->ReadMain($Type);
			}
		}
		$DATA->CallObj('CMT')->Close;
		if ($Param->{CMT}{Files}{$CmtNo}{SetPoint}) {
			my $p = $CmtNo; $p =~ s/^0+//;
			$Class->SetParam("Point$p", 'L', $DATA->GetRound('NewPoint'));
			$DATA->SetRound(Name => 'NewPoint', Data => undef);
		}
		$DATA->SetRound(Name => 'Topic1,NextPageFlag', Data => '');
	}

	$Class->Fin;
}

#--------------------------------------------------------------------------
#  記事の出力
#--------------------------------------------------------------------------
sub ReadMain{
	my $Class = shift;
	my $Type = shift;
	$DATA->SetRound(Name => 'Type', Data => 'Main');
	my $Parse = $DATA->CallObj('Parse');
	my $Tree = $DATA->GetRound('Mode','Main','Tree');
	my $InPage = $Parse->GetPrm('Main', 'InPage');
	my @List; local($List);

	# 記事数カウンタ等初期化
	$DATA->SetRound(Name => 'Main,Count,AtclMax', Data => 0);
	$DATA->PrintInfo(PageCountReset => 1);

	unless($Tree) {
		# HTTP接続
		my $Uri = eval($Parse->GetPrm('Main','Uri')) if ($Parse->GetPrm('Main','Uri'));
		$DATA->CallObj('HTTP')->GetHttp(Param => $DATA->CallObj('HTTP')->SetPageParam, Uri => $Uri);

		# CMTヘッダ用の設定
		$DATA->CallObj('HeadCMT')->SetHead;
	}

	# CMTヘッダ出力
	$DATA->CallObj('HeadCMT')->PrintCMThead;

	# BaseUrlの設定
	$BaseUri = $DATA->CallObj('INI')->GetParam('Uri');
	$BaseUri = eval($Parse->GetPrm('Main','BaseUri')) if ($Parse->GetPrm('Main','BaseUri'));

	# 出力メッセージ設定
	my $InfoMes = 'Page #Page#:';
	if (my $Mes = $Parse->GetPrm('Main', 'InfoMes')) {
		$InfoMes = $Mes;
	}

	ATCL:{

		$DATA->SetRound(Name => 'Main,ReadEnd', Data => 0);
		$DATA->SetRound(Name => 'Count,Info', Data => 0);

		# 各ページ毎の記事数
		$DATA->PrintInfo(AtclCountReset => 1, Info => $InfoMes, PageCount => 1);
		my $Page = $DATA->GetRound('Main', 'Count', 'Page');

		Tree:{
			if ($Tree) {
				@List = @{$Parse->GetResult('GetList', $Parse->GetPrm('Main', 'List'), $Page)} if (!@List);
				last ATCL if (!@List);
				my $Uri;
				if ($Parse->GetPrm('Main', 'PullList') eq 'Shift') {
					$List = shift(@List);
				} else {
					$List = pop(@List);
				}
				$Uri = $List->{List};
				my $SetUri;
				if ($Uri =~ /[^\?]+\?/) {
					$SetUri = $BaseUri.$Uri
				} elsif ($BaseUri =~ /\?/) {
					$SetUri = $BaseUri.'&'.$Uri
				} elsif ($BaseUri =~ /[^\.]+\.[^\.]+$/) {
					$SetUri = $BaseUri.'?'.$Uri
				} else {
					$SetUri = $BaseUri.$Uri
				}
				# 接続出来た
				if($DATA->CallObj('HTTP')->HttpReq(Uri => $SetUri, NoMes => 1, IO => 1)){
					if ($DATA->GetRound('Count', 'Info') > 30) {
						$DATA->PrintInfo(AtclCountReset => 1, Info => $InfoMes, InfoCountReset => 1);
					}
					IO->StdOut('o'); $DATA->{Round}{Count}{Info}++;
				# 接続出来ない
				}else{
					IO->StdOut('x'); next;
				}
			}

			InPage:{
				# ページ頭読み飛ばし
				$DATA->CallObj('HTTP')->ReadStep(Read => 'Top');

				# 区切り設定
				$DATA->CallObj('HTTP')->ReadStep(Set => 'Step');
				# 文字コード設定
				my $CnvMethode = $DATA->GetRound('CnvMethod');

				# 区切り毎に、ファイル終端まで $_に読む
				while (my $STR = $DATA->CallObj('HTTP')->Read) {
					# 文字コード変換
					CodeCnv->$CnvMethode(\$STR) if ($CnvMethode);
					# 次ページ解析
					$Parse->GetNextPage(\$STR) if (!$Parse->GetResult('Main', 'NextParam'));
					# 投稿用Url解析
					$Parse->GetUpUrl(\$STR) if ($DATA->GetBasic('UpUrl', 'Type') eq 'Main' && !$DATA->GetBasic('UpUrl', 'Parse'));

					my (@Logs, $Parent, $Child, @Child);
					if (my $Split = $Parse->GetPrm('Main', 'Split')) {
						($Parent, $Child) = (split(/$Split->{Parent}/s, $STR))[0,1];
						(@Child) = split(/$Split->{Child}/s, $Child);
						$Logs[0] = $Parent;
						push @Logs, @Child;
					} else {
						$Logs[0] = $STR;
					}
					while ($DATA->{String} = shift @Logs) {

						# LOGへの書き出し
						$DATA->{String} .= "\n\n<!-- ### Step ### -->\n\n" if ($DATA->CallObj('DEBUG'));
						$DATA->CallObj('LOG')->PrintLog(ParaGraphCnv => 1, Parent => $Class);

						# ページ末読み飛ばし
						$DATA->CallObj('HTTP')->ReadStep(Read => 'Bottom');

						if ($DATA->GetRound('Count', 'Info') > 30) {
							$DATA->PrintInfo(Info => $InfoMes, InfoCountReset => 1);
						}

						# 日付が取得出来たら記事とみなす
						if($Parse->Found){
							# 時系列形式
							if ($Type eq 'Date') {
								$Class->DateType;
							} elsif ($Type eq 'Thread') {
								$Class->ThreadType;
							}
							# 未読ポインタより古ければ終了
							last ATCL if($DATA->CompareDate == 1);
							# 未読ポインタ更新チェック
							$DATA->NewPtr;
						}
					}						# ← while(@Logs)の終わり
					last if ($DATA->GetRound('Main', 'ReadEnd'));
				}							# ← while(<HTTP>)の終わり
				if ($InPage) {
					unless ($DATA->CallObj('HTTP')->NextPage) {
						last InPage;
					} else {
						redo InPage;
					}
				}
			} # ← InPageの終わり
			if ($Tree) {
				if (!@List) {
					redo ATCL if (@{$Parse->GetResult('GetList', $Parse->GetPrm('Main', 'List'), $Page+1)});
				}
				redo Tree if (@List);
			}
		}							# ← Tree:の終わり
		$Tree = undef if ($Parse->GetPrm('Main', 'ListOff'));

#####  次のページ  #####

		last ATCL unless ($DATA->CallObj('HTTP')->NextPage);			# 戻り値が偽なら抜ける
		redo ATCL;

	}							# ← ATCL: の終わり


#####  タイプ別記事取得処理  #####

	# 時系列タイプ
	sub DateType{
		my $Class = shift;
		# 読み取り状況表示
		$DATA->PrintInfo(Parent => '*', AtclCount => 1);
		# 記事出力
		$DATA->CallObj('Parse')->Parse;
		&SetParse;
		$DATA->CallObj('HeadCMT')->PrintCMTmessage;
	}

	# スレッドタイプ
	sub ThreadType{
		my $Class = shift;
		my $PTR = $DATA->CallObj('Parse')->GetPrm('Main', 'Root');
		if ($DATA->{String} =~ /$PTR/is) {
			# 読み取り状況表示
			$DATA->PrintInfo(Parent => '*', AtclCount => 1);
			$DATA->CallObj('Parse')->{Result}{Main}{Root} = 0;
		} else {
			$DATA->PrintInfo(Child => '.');
			$DATA->CallObj('Parse')->{Result}{Main}{Root} = 1;
		}

		# 記事出力
		$DATA->CallObj('Parse')->Parse;
		&SetParse;
		$DATA->CallObj('HeadCMT')->PrintCMTmessage;
	}

	sub SetParse {
		my $Parse = $DATA->CallObj('Parse');
		my $TreeNoOpt = $Parse->GetReg('Main', 'TreeNo', 'SetParse');
		my $ResNumOpt = $Parse->GetReg('Main', 'ResNum', 'SetParse');
		my $NumOpt = $Parse->GetReg('Main', 'Num', 'SetParse');
		my $DateOpt = $Parse->GetReg('Main', 'Date', 'SetParse');
		if ($TreeNoOpt == 1) {
			$Parse->{Result}{Main}{TreeNo} = $List->{TreeNo};
		} elsif ($TreeNoOpt && $Parse->{Result}{Main}{TreeNo} !~ /$TreeNoOpt/) {
			$Parse->{Result}{Main}{TreeNo} = $List->{TreeNo};
		}
		if ($ResNumOpt == 1) {
			$Parse->{Result}{Main}{ResNum} = $List->{ResNum};
		} elsif ($ResNumOpt && $Parse->{Result}{Main}{ResNum} !~ /$ResNumOpt/) {
			$Parse->{Result}{Main}{ResNum} = $List->{ResNum};
		}
		if ($NumOpt == 1) {
			$Parse->{Result}{Main}{Num} = $List->{Num};
		} elsif ($NumOpt && $Parse->{Result}{Main}{Num} !~ /$NumOpt/) {
			$Parse->{Result}{Main}{Num} = $List->{Num};
		}
		if ($DateOpt == 1) {
			$Parse->{Result}{Main}{Date} = $List->{Date};
		} elsif ($DateOpt && $Parse->{Result}{Main}{Date} !~ /$DateOpt/) {
			$Parse->{Result}{Main}{Date} = $List->{Date};
		}
	}
}

#--------------------------------------------------------------------------
#  発言送信処理
#--------------------------------------------------------------------------
sub WriteMain{
	my $Class = shift;
	my $rParam = { @_ };

	my $Method = 'POST';
	$Method = 'Multipart' if ($Class->GetParam('FileUpload', 'L'));

	my ($CmwHead, @CMW, $CMW, $Uri, $Count, $Host);

	$CmtNo = $DATA->GetRound('CMT', 'No');
	return 0 unless (-e $CmtNo.'.cmw');

	$/ = "\n.\nS:";
	open (CMW, $CmtNo.'.cmw');		# CMWファイルを開く(Read)

	# CMWのヘッダを取得
	$CMW = <CMW>;
	while ($CMW =~ s/^(#[A-Z]:.*\n)//){
		$CmwHead .= $1;
	}

	# 基本データセット
	my ($N, $E, $H, $K, $I, $I2, $C, $C2, $C3, $AREA, $AGE, $SEX, $ID, $Pass, $Opt, $Opt2, $Opt3,
		$ic, $ic2, $co, $co2, $co3, $Area, $Age, $Sex);
	$N = $Class->GetParam('NAME', 'P');
	$E = $Class->GetParam('EMAIL', 'P');
	$H = $Class->GetParam('HP', 'P');
	$K = $Class->GetParam('KEY', 'P');
	$I = $Class->GetParam('ICON', 'L');
	$I2 = $Class->GetParam('ICON2', 'L');
	$C = $Class->GetParam('COLOR', 'L');
	$C2 = $Class->GetParam('COLOR2', 'L');
	$C3 = $Class->GetParam('COLOR3', 'L');
	$AREA = $Class->GetParam('AREA', 'L');
	$AGE = $Class->GetParam('AGE', 'L');
	$SEX = $Class->GetParam('SEX', 'L');
	$WORK = $Class->GetParam('WORK', 'L');
	$ic = $Class->GetParam('Icon', 'L');
	$ic2 = $Class->GetParam('Icon2', 'L');
	$co = $Class->GetParam('Color', 'L');
	$co2 = $Class->GetParam('Color2', 'L');
	$co3 = $Class->GetParam('Color3', 'L');
	$Area = $Class->GetParam('Area', 'L');
	$Age = $Class->GetParam('Age', 'L');
	$Sex = $Class->GetParam('Sex', 'L');
	$ID = $Class->GetParam('ID', 'L');
	$Pass = $Class->GetParam('Pass', 'L');
	$Opt = $Class->GetParam('Opt1', 'L');
	$Opt2 = $Class->GetParam('Opt2', 'L');
	$Opt3 = $Class->GetParam('Opt3', 'L');

#	CodeCnv->UrlEncode(\$N);
#	CodeCnv->UrlEncode(\$E);
#	CodeCnv->UrlEncode(\$H);
#	CodeCnv->UrlEncode(\$K);
#	CodeCnv->UrlEncode(\$I);
#	CodeCnv->UrlEncode(\$I2);
#	CodeCnv->UrlEncode(\$AREA);
#	CodeCnv->UrlEncode(\$AGE);
#	CodeCnv->UrlEncode(\$SEX);
#	CodeCnv->UrlEncode(\$ic);
#	CodeCnv->UrlEncode(\$ic2);
#	CodeCnv->UrlEncode(\$Area);
#	CodeCnv->UrlEncode(\$Age);
#	CodeCnv->UrlEncode(\$Sex);
#	CodeCnv->UrlEncode(\$ID);
#	CodeCnv->UrlEncode(\$Pass);
#	CodeCnv->UrlEncode(\$Opt);
#	CodeCnv->UrlEncode(\$Opt2);
#	CodeCnv->UrlEncode(\$Opt3);

	do {
		$Count++;

		# 送信予定記事から各項目の取得
		$CMW = "S:$CMW";
		$CMW =~ s/^S:S:/S:/;
		$CMW =~ s/S:$//s;
		my ($S, $Sr, $T, $P, $M) = ();
		$S  = $1 if ($CMW =~ /^S:(.+?)\n/m );
		$Sr = $1 if ($S   =~ /^\*,(\d+),/  );
		$T  = $1 if ($CMW =~ /^T:(.+?)\n/m );
		$P  = $1 if ($CMW =~ /^P:(.+?)\n/m );
		$M  = $1 if ($CMW =~ /M:(.+)\.\n$/s);
#		CodeCnv->UrlEncode(\$T);
#		CodeCnv->UrlEncode(\$M);

		# 親記事を使用する場合の読み込み

		# 引数のセット
		my $Param = $P;
		$Param =~ s/^LIB,//;
		$Uri = $Class->GetParam('Uri');
		$Host = $Class->GetParam('Host');
		if ($Param =~ s/^\$c,//) {
			$Uri = $Class->GetParam('UpUri');
			$Host = $Class->GetParam('UpHost');
		} else {
			$Param =~ s/^\$C,//;
		};
		my %o;
		if ($Param =~ /\$o[NEMHT]&/) {
			my %oParam; my $Set = $Param;
			while ($Set =~ s/\$o([NEMHT])//) { $oParam{$1} = 1; }
			open (IN, $CmtNo.'.cmt');
			$/ = "\n\.\n";
			while (my $Log = <IN>) {
				while ($Log =~ s/^(#[A-Z]:.*\n)//){}
				if ($Log =~ /^S:[Ss]?(\d+)/ && $1 eq $Sr) {
					foreach my $Key (%oParam) {
						if ($Log =~ /M:\n(.+)\n\.\n/s && $oParam{'M'} && $Key eq 'M') { $o{M} = $1; next; }
						$o{$Key} = $1 if ($Log =~ /^$Key:(.*?)\n/m && $oParam{$Key});
						CodeCnv->UrlEncode(\$o{$Key}) if ($o{$Key});
					}
					last;
				}
			}
			$o{N} =~ s/\[.+?\]//g;
		}

		if ($Method eq 'Multipart') {
			$Class->{Boundary} = 'i6n5c1m8m9o2d3u8l7e4';
			my @PostData = split(/&/, $Param);
			$Param = undef; my $FileParam;
			foreach $PostData (@PostData){
				$PostData =~ /([^=]+)=(.*)/;
				my ($Name, $Value) = ($1, $2);
				$Value =~ s/\$Sr/$Sr/;
				$Value =~ s/\$N/$N/;
				$Value =~ s/\$E/$E/;
				$Value =~ s/\$H/$H/;
				$Value =~ s/\$K/$K/;
				$Value =~ s/\$T/$T/;
				$Value =~ s/\$M/$M/;
				$Value =~ s/%0d%0a/\n/;

				$Value =~ s/\$\(L_ICON\)/$I/;
				$Value =~ s/\$\(L_ICON2\)/$I2/;
				$Value =~ s/\$\(L_COLOR\)/$C/;
				$Value =~ s/\$\(L_COLOR2\)/$C2/;
				$Value =~ s/\$\(L_COLOR3\)/$C3/;
				$Value =~ s/\$\(L_AREA\)/$AREA/;
				$Value =~ s/\$\(L_AGE\)/$AGE/;
				$Value =~ s/\$\(L_SEX\)/$SEX/;
				$Value =~ s/\$\(L_WORK\)/$WORK/;
				$Value =~ s/\$\(L_Icon\)/$ic/;
				$Value =~ s/\$\(L_Icon2\)/$ic2/;
				$Value =~ s/\$\(L_Color\)/$co/;
				$Value =~ s/\$\(L_Color2\)/$co2/;
				$Value =~ s/\$\(L_Color3\)/$co3/;
				$Value =~ s/\$\(L_Area\)/$Area/;
				$Value =~ s/\$\(L_Age\)/$Age/;
				$Value =~ s/\$\(L_Sex\)/$Sex/;
				$Value =~ s/\$\(L_ID\)/$ID/;
				$Value =~ s/\$\(L_Pass\)/$Pass/;
				$Value =~ s/\$\(L_Opt1\)/$Opt/;
				$Value =~ s/\$\(L_Opt2\)/$Opt2/;
				$Value =~ s/\$\(L_Opt3\)/$Opt3/;

				$Value =~ s/\$oN/$o{N}/;
				$Value =~ s/\$oE/$o{E}/;
				$Value =~ s/\$oH/$o{H}/;
				$Value =~ s/\$oT/$o{T}/;
				$Value =~ s/\$oM/$o{M}/;

				if ($Value =~ /\$\(L_File(\d*)\)/) {
					my $FileNo = $1; my ($FilePath, $FileName, $FileData);
					if (!$FileNo) {
						$FilePath = $Class->GetParam('File', 'L');
						next if (!$FilePath);
						$FilePath =~ /\\([^\\]+)$/; $FileName = $1;
						$Class->SetParam('File', 'L', '');
					} elsif ($FileNo == 2) {
						$FilePath = $Class->GetParam('File2', 'L');
						next if (!$FilePath);
						$FilePath =~ /\\(.*?)$/; $FileName = $1;
						$Class->SetParam('File2', 'L', '');
					} elsif ($FileNo == 3) {
						$FilePath = $Class->GetParam('File3', 'L');
						next if (!$FilePath);
						$FilePath =~ /\\(.*?)$/; $FileName = $1;
						$Class->SetParam('File3', 'L', '');
					} elsif ($FileNo == 4) {
						$FilePath = $Class->GetParam('File4', 'L');
						next if (!$FilePath);
						$FilePath =~ /\\(.*?)$/; $FileName = $1;
						$Class->SetParam('File4', 'L', '');
					}
					if (-e $FilePath) {
						CodeCnv->UrlEncode(\$FileName);
						open(FILE, $FilePath); binmode FILE;
						while (my $Line = <FILE>) {
							$FileData .= $Line;
						}
						close FILE;
					}
					$FileParam .= "--$Class->{Boundary}\r\nContent-Disposition: form-data; name=\"$Name\"; filename=\"$FileName\"\r\n";
					$FileParam .= "Content-Type: application/octet-stream\r\n\r\n";
					$FileParam .= $FileData."\r\n";
				} else {
					$Param .= "--$Class->{Boundary}\r\nContent-Disposition: form-data; name=\"$Name\"\r\n\r\n";
					$Param .= "$Value\r\n";
				}
			}
			$Param .= $FileParam;
			$Param .= "--$Class->{Boundary}--\r\n";
		} else {
			$Param =~ s/\$Sr/$Sr/;
			$Param =~ s/\$N/$N/;
			$Param =~ s/\$E/$E/;
			$Param =~ s/\$HP/$H/;
			$Param =~ s/\$K/$K/;
			$Param =~ s/\$T/$T/;
			$Param =~ s/\$M/$M/;
			$Param =~ s/%0d%0a/\n/;

			$Param =~ s/\$\(L_ICON\)/$I/;
			$Param =~ s/\$\(L_ICON2\)/$I2/;
			$Param =~ s/\$\(L_COLOR\)/$C/;
			$Param =~ s/\$\(L_COLOR2\)/$C2/;
			$Param =~ s/\$\(L_COLOR3\)/$C3/;
			$Param =~ s/\$\(L_AREA\)/$AREA/;
			$Param =~ s/\$\(L_AGE\)/$AGE/;
			$Param =~ s/\$\(L_SEX\)/$SEX/;
			$Param =~ s/\$\(L_WORK\)/$WORK/;
			$Param =~ s/\$\(L_Icon\)/$ic/;
			$Param =~ s/\$\(L_Icon2\)/$ic2/;
			$Param =~ s/\$\(L_Color\)/$co/;
			$Param =~ s/\$\(L_Color2\)/$co2/;
			$Param =~ s/\$\(L_Color3\)/$co3/;
			$Param =~ s/\$\(L_Area\)/$Area/;
			$Param =~ s/\$\(L_Age\)/$Age/;
			$Param =~ s/\$\(L_Sex\)/$Sex/;
			$Param =~ s/\$\(L_ID\)/$ID/;
			$Param =~ s/\$\(L_Pass\)/$Pass/;
			$Param =~ s/\$\(L_Opt1\)/$Opt/;
			$Param =~ s/\$\(L_Opt2\)/$Opt2/;
			$Param =~ s/\$\(L_Opt3\)/$Opt3/;

			$Param =~ s/\$oN/$o{N}/;
			$Param =~ s/\$oE/$o{E}/;
			$Param =~ s/\$oH/$o{H}/;
			$Param =~ s/\$oT/$o{T}/;
			$Param =~ s/\$oM/$o{M}/;
		}

		# 発言送信処理
		my $Error = '';
		$DATA->PrintInfo(Info => "送信処理中...($Count)");
		my $HTTP = Http->new;
		$HTTP->Authorization;
		$HTTP->Agent($DATA->GetRound('Http', 'Agent'), $Class->GetParam('Proxy'));
		$HTTP->Referer if ($DATA->GetBasic('Http', 'Referer'));
		# ログイン
		$HTTP->Login if ($DATA->GetBasic('Http', 'Login'));
		# 拡張パラメータ
		if (my $Eval = $DATA->CallObj('HeadCMT')->{Param}{Write}{ParamEval}) {
			eval($Eval);
		}
		# 接続
		$Error = $HTTP->GetHttp(Param => $Param, NoMes => 1, Method => $Method, Uri => $Uri) || '送信に失敗しました';
		$Error = '' if ($Error ne '送信に失敗しました');
		open (PostHTML, ">送信LOG.html");
		binmode PostHTML;
		while (my $Line = $HTTP->Read("\n")) { print PostHTML $Line; }
		close PostHTML;

		if ($Error) {
			$DATA->PrintInfo(Info => $Error);
		} else {
			$S =~ s/,U,/,,/ ;		# 発言に成功したらUを消す
		}
		$CMW  = "S:$S\n";
		$CMW .= "T:$T\n";
		$CMW .= "P:$P\n";
		$CMW .= "M:$M.\n";
		push @CMW, $CMW;
		$/ = "\n.\nS:";
		$HTTP->Close;
		my $Debug = 'ParamEval = '.$DATA->CallObj('HeadCMT')->{Param}{Write}{ParamEval}."\n";
		$Debug .= '			Uri = '.$Uri."\n";
		$Debug .= '			Param = '.$Param."\n";
		$Debug .= '			Method = '.$Method;
		$DATA->DebugWrite(Code => $Debug);
	} while ($CMW = <CMW>);
	close CMW;

	# CMWに書き戻し
	open (CMW, ">$CmtNo.cmw");		# CMWファイルを開く(Write)
	binmode (CMW);
	print CMW $CmwHead;
	print CMW @CMW;
	close CMW;

	return 1;
}

1;
