/*
このファイルの中身は、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) ______________________________________.
*/

import java.applet.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.lang.*;

/**
 * <pre>
 * クラス名： scormhacp
 * 処理概要
 *     A class representing a window on the screen.
 *
 *   For example:
 *      Window win = new Window(parent);
 *      win.show();
 * </pre>
 * <br>
 * <pre>
 * 変更履歴：
 *     2004/01/31 新規作成
 * </pre>
 */

public class scormhacp extends Applet
{
	String	mSessionID;		// AICC_SID プロパティ
	String	mTargetURL;		// AICC_URL プロパティ

//ADD Start 2004.12.17 プロトコルのparam化 NTTR
	String strParam;
//ADD End

	/**
	 * コンストラクタ
	 */
	public scormhacp()
	{
	}

	/**
	 * init メソッド
	 */
	public void init()
	{
//ADD Start 2004.12.17 プロトコルのparam化 NTTR
		strParam = getParameter("protocol");
//ADD End
	}

	/**
	 * destroy メソッド
	 */
	public void destroy()
	{
	}

	/**
	 * start メソッド
	 */
	public void start()
	{
	}
	

	/**
	 * stop メソッド
	 */
	public void stop()
	{
	}
	
    /**
     * AICC_SID,AICC_URL 設定 メソッド。
     * AICC_SID,AICC_URL の値を設定する。
     *
     * @param     sid  AICC_SIDの値
     * @param     url  AICC_URLの値
     */
	public void setAICC(String sid, String url)
	{
		mSessionID	= sid;
		mTargetURL	= url;
	}
	
	public String getAICC()
	{
		String str;

		str = mSessionID + "," + mTargetURL;

		return	str;
	}
	
    /**
     * AICC_SID 設定 メソッド。
     * AICC_SID の値を設定する。
     *
     * @param     sid  AICC_SIDの値
     */
	public void setAICC_SID(String sid)
	{
		mSessionID	= sid;
	}
	
    /**
     * AICC_URL 設定 メソッド。
     * AICC_URL の値を設定する。
     *
     * @param     url  AICC_URLの値
     */
	public void setAICC_URL(String url)
	{
		mTargetURL	= url;
	}

	public String UTF8Change(String str)
	{
		try {
			byte[] buffer	= new byte[4096];
			buffer = str.getBytes("UTF8");
			String retStr = "";
			String tmpStr;
			char tmpChar;
			int i = 0;
			int tmpInt;
			for(i=0;i<buffer.length;i++)
			{
				tmpStr = "";
				if(buffer[i] < 0)
				{
					tmpInt = 256 + buffer[i];
					if(tmpInt <16)
					{
						tmpStr = "%0" + Integer.toString(tmpInt,16);
						tmpStr = tmpStr.toUpperCase();
					}
					else
					{
						tmpStr = "%" + Integer.toString(tmpInt,16);
						tmpStr = tmpStr.toUpperCase();
					}
				}
				else
				{
					if((47 < buffer[i])&&(buffer[i] < 58)) // 数字の０から９
					{
						tmpChar = (char)buffer[i];
						tmpStr += tmpChar;
					}
					else if((64 < buffer[i])&&(buffer[i] < 91)) // 英字のAからZ
					{
						tmpChar = (char)buffer[i];
						tmpStr += tmpChar;
					}
					else if((96 < buffer[i])&&(buffer[i] < 123)) // 英字のaからz
					{
						tmpChar = (char)buffer[i];
						tmpStr += tmpChar;
					}
					else if(buffer[i] == 32) // 空白
					{
						tmpStr = "+";
					}
					else if(buffer[i] == 46) // .
					{
						tmpStr = ".";
					}
					else if(buffer[i] == 45) // -
					{
						tmpStr = "-";
					}
					else if(buffer[i] == 42) // *
					{
						tmpStr = "*";
					}
					else if(buffer[i] == 95) // _
					{
						tmpStr = "_";
					}
					else
					{
						tmpInt = buffer[i];
						if(tmpInt <16)
						{
							tmpStr = "%0" + Integer.toString(tmpInt,16);
							tmpStr = tmpStr.toUpperCase();
						}
						else
						{
							tmpStr = "%" + Integer.toString(tmpInt,16);
							tmpStr = tmpStr.toUpperCase();
						}
					}
				}

				retStr += tmpStr;
			}
			return retStr;
		}
		catch (UnsupportedEncodingException err) {
			return "error=" + err;
		}
	}

	// エンコーディングされた文字列をデコードする
	public String SJISChange(String str)
	{
		int strLen		= 0;		// 入力された文字列の長さ
		byte[] buffer	= new byte[4096];
		String retStr 	= "";		// 返却文字列
		String tmpStr = "";
		int tmpInt;
		char tmpChar;
		int i = 0;
		int j = 0;

		try
		{
			strLen = str.length();
			for(i = 0;i < strLen;i++)
			{
				tmpChar = str.charAt(i);
				if(tmpChar == '%')
				{
					tmpStr = "";
					i++;
					tmpStr += str.charAt(i);
					i++;
					tmpStr += str.charAt(i);
					tmpInt = Integer.parseInt(tmpStr,16);
					buffer[j] = (byte)tmpInt;
					j++;
				}
				else if(tmpChar == '+'){
					buffer[j] = ' ';
					j++;
				}else{
					buffer[j] = (byte)tmpChar;
					j++;
				}
			}
			retStr = new String(buffer,"UTF8");
			return retStr;
		}
		catch (UnsupportedEncodingException err) {
			System.out.println(err);
			return "error=" + err;
		}
		catch (NumberFormatException err)
		{
			System.out.println(err);
			return "error=" + err;
		}
	}

    /**
     * CMI ポスト メソッド。
     * AICC コマンドを CMI へポスとする。
     * @param     command  AICCコマンド名.
     * @param     data     AICC データ.
     * @return    AICC リターン.
     */
	public String cmiPost(String command, String data)
	{

		URL					url				= null;
		URLConnection		conn			= null;
		DataInputStream		input			= null;
		DataOutputStream	output			= null;		
		int					bytes_read		= 0;
		byte[]				buffer			= new byte[1024];
		String				cmiData			= "";
boolean				debugFlag		= true;


		// create the URL with the CGI script
		try {
//MOD Start 2004.12.17 プロトコルのparam化 NTTR
//			url = new URL("http://" + mTargetURL);
			url = new URL(strParam + mTargetURL);
//MOD End
		}
		catch (MalformedURLException err) {
			System.out.println("Unable to create URL for CGI (" + mTargetURL + "): " + err);
		}

		// open a connection
		try {
			conn = url.openConnection();
		}
		catch (IOException err) {
			System.out.println("Unable to open URL connection: " + err);
		}

		// We intend to do both input and output 
		conn.setDoOutput(true);
		conn.setDoInput(true);
		
		// Don't use any caching
		conn.setUseCaches(false);
		
		// Set the request property
		conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
		
		// It will never make sense to pop-up any kind of authentication
		conn.setAllowUserInteraction(false);

		// create output
		try {
			output = new DataOutputStream(conn.getOutputStream());
		}
		catch (IOException err) {
			System.out.println("Unable to create the output stream: " + err);
		}

		// form up request
		String request = "command=" + command + 
							"&version=S1.3" +
							"&session_id=" + URLEncoder.encode(mSessionID) +
							"&aicc_data="  + URLEncoder.encode(data);
	
		// write the output
		try {
			output.writeBytes(request);
			output.flush();
		
			// Close the printstream, thus "posting" the CGI request.
			output.close();
		}
		catch (IOException err) {
			System.out.println("Unable to write the data:  " + err);
		}

		// open the input stream to read the response.
		try {
			// Open an input stream to read the response
			input = new DataInputStream(conn.getInputStream());
		}
		catch (IOException err) {
			System.out.println("Unable to open HTTP connection to read: " + err);
		}

		// Keep looping until all data is read.
		try {			
			while((bytes_read = input.read(buffer)) > 0)
				cmiData += new String(buffer, 0, bytes_read);
		}
		catch (IOException err) {
			System.out.println("Unable to read POST response: " + err);
		}

		//
		// close the connection
		finally {
			try {
				if (input != null)
					input.close();
			}
			catch (IOException err) {
				System.out.println("Unable to close HTTP connection: " + err);
			}
		}
		return cmiData;
	}
}
