/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

/**
 * 
 * 		アップロードファイル編集クラス
 *
 *			変更履歴
 *				2004.01.08 新規作成	五木田
 **/
package jp.co.ntt.lms.xmo.util;

import java.io.BufferedReader;
import java.util.Vector;

public class EditUploadFile
{
	// 静的変数
	private static final String BOUNDARY_KEY        = "boundary=";
	private static final String CONTENT_DISPOSITION = "Content-Disposition: ";
	private static final String CONTENT_TYPE        = "Content-Type: ";
	private static final String START_MAIN          = "";
	
	// 動的変数
	private String  strStartBoundary;
	private String  strEndBoundary;
	private String  strContentType;
	private boolean boolStartMainFlag;
	private boolean boolStartBoundary;
	
	/**
	 * コンストラクタ
	 **/
	public EditUploadFile()
	{
		;
	}
	
	/**
	 * ファイル部取得関数<BR>
	 * アップロードファイルからコンテント部等を<BR>
	 * 除いたファイル部を取得する。<BR>
	 *
	 * @param objBr ファイル全体
	 * @param strCt コンテントタイプ
	 * @return Vector アップロードパラメータリスト
	 **/
	public Vector getUploadParamList(
								BufferedReader objBr,
								String strCt
								)
	{
		Vector vecRet        = new Vector();							// 戻り値
		StringBuffer strData = new StringBuffer();						// データ部
		UploadParam objUp    = null;									// アップロードパラメータクラス
		
		String strLine       = "";										// １行文字列
		boolStartMainFlag    = false;									// データ部開始フラグ
		boolStartBoundary    = false;									// バウンダリーキー開始フラグ
		
		try
		{
			setBoundary(strCt);											// バウンダリーキー設定
			
			while(true)
			{
				strLine = objBr.readLine();								// アップロードファイル１行読込
				
				if(strLine == null)
				{
					// 入力ファイルが終了
					// ただし通常はここに入ることはない
					boolStartMainFlag = false;
					boolStartBoundary = false;
					break;
				}
				else
				{
					if(strLine.equalsIgnoreCase(strStartBoundary))		// バウンダリー開始ならば(必ずこれが先頭)
					{
						// 開始バウンダリーキーは読込
						// アップロードパラメータクラスを追加
						if(boolStartBoundary && 
							objUp != null)								// 最初のバウンダリー開始ならば
						{
							objUp.setMainData(strData.toString());
							vecRet.add(objUp);
							strData = new StringBuffer();				// データ部初期化
						}
						
						// アップロードパラメータクラス設定準備処理
						objUp             = new UploadParam();			// アップロードパラメータクラス初期化
						boolStartBoundary = true;						// バウンダリー開始ON
						boolStartMainFlag = false;						// データ部OFF
					}
					else if(strLine.indexOf(CONTENT_DISPOSITION) == 0)	// コンテントディスポジションならば
					{
						// コンテントディスポジションは読み飛ばし
						if(objUp != null)
						{
							// コンテントディスポジションを設定
							objUp.setDisposition(strLine);
						}
					}
					else if(strLine.indexOf(CONTENT_TYPE) == 0)			// コンテントタイプならば
					{
						// コンテントタイプは読み飛ばし
						int    intLen         = CONTENT_TYPE.length();
						String strContentType = strLine.substring(intLen);
						if(objUp != null)
						{
							// コンテントタイプ設定
							objUp.setContentType(strContentType);
						}
					}
					else if(strLine.equals(START_MAIN))					// データ部開始ならば
					{
						if(boolStartMainFlag)
						{
							// データ部ONならばデータ部内の空白行
							// のため追加する
							strLine = "\n";
							strData.append(strLine);
						}
						else
						{
							boolStartMainFlag = true;					// データ部開始ON
						}
					}
					else if(strLine.equalsIgnoreCase(strEndBoundary))	// バウンダリー終了ならば
					{
						// 終了バウンダリーキーは読込完了
						// 終了バウンダリーキーは含まない
						boolStartBoundary = false;
						boolStartMainFlag = false;
						if(objUp != null)
						{
							// データ部設定
							objUp.setMainData(strData.toString());
						}
						
						// アップロードパラメータクラスを追加
						vecRet.add(objUp);
						
						break;
					}
					else
					{
						strData.append(strLine);
					}
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		return vecRet;
	}
	
	/**
	 * 開始終了バウンダリーキー設定<BR>
	 * アップロードファイルの開始バウンダリーキーと<BR>
	 * 終了バウンダリーキーの設定をおこなう。<BR>
	 *
	 * @param strContentType
	 **/
	private void setBoundary(String strContentType)
	{
		strContentType        = strContentType.toLowerCase();			// コンテントタイプ小文字化
		int intPos            = strContentType.indexOf(BOUNDARY_KEY)	// バウンダリーキー位置取得
								 + BOUNDARY_KEY.length();
		
		this.strStartBoundary = "--" + 
								strContentType.substring(intPos);		// 開始バウンダリー設定
								
		this.strEndBoundary   = "--" + 
								strContentType.substring(intPos)
								 + "--";								// 終了バウンダリー設定
	}
}
	