//-------------------------------------------------------------------------------
//
//	FILE: my_MenuCtl.c
//
//	IMenu interfaceのメインプログラム 
//
//-------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------+
//改版履歴                                                                                                |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  No.   |  date     | 問題票番号 | 変更/修正内容                                          |    name     |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #000  | 05.xx.xx  |            | 新規作成                                               | O.Fukaya    |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #001  | 05.04.08  |            | 表示メニュー文言修正                                   | t.morishita |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #002  | 05.04.08  |            | IMENUCTL_SetItem()処理不具合修正                       | t.morishita |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #003  | 05.05.04  |            | MCS_PARAM_DESCENDINGとMCS_PARAM_ASCENDING設定間違い    | N.Kanagawa  |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #004  | 05.05.26  |            | IMENUCTL_SetProperties()MP_ICON_DELAY_IMAGEの設定修正  | t.morishita |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #005  | 05.06.09  |            | ログクリア処理不具合修正                               | t.morishita |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//  #006  | 05.06.17  |            | WSTRTOSTR→WSTRCOMPRESSに修正                         | N.Kanagawa  |
//--------+-----------+------------+--------------------------------------------------------+-------------+
//        |           |            |                                                        |             |
//--------+-----------+------------+--------------------------------------------------------+-------------+

#include "come01.bid"
#include "MenuCtl.h"


//	AEEClsCreateInstance :: アプレットの作成
int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
{
	//	作業用変数の定義
	MyApp	*pApp = NULL ;
	*ppObj = NULL;
	
	// Class IDの確認
	if ( ClsId == AEECLSID_COME01 )
	{
		if ( AEEApplet_New( sizeof(MyApp), ClsId, pIShell, po, (IApplet**)ppObj,
			(AEEHANDLER)myHandleEvent, (PFNFREEAPPDATA)myAppCleanup ) == TRUE )
		{
			pApp = (MyApp*)*ppObj;

			
			//	Appletインスタンスの作成
			if ( FALSE == initMyApp(pApp) )
			{
				return  EFAILED;
			}
			
			return AEE_SUCCESS;
		}
	}
	
	//	ログ出力
	DBGPRINTF("ClsID is iligal.") ;
	return EFAILED;
}

//	initMyApp :: アプレットの初期化
boolean initMyApp(MyApp *pApp)
{
	// 作業変数の定義
	AEEDeviceInfo	adi;
	int				nErr = 0;
	char			szBuf[MAX_LENGTH] = "";
	
	// NULLチェック
	if( pApp == NULL )
	{
		DBGPRINTF( "pApp is NULL" );
		return FALSE;
	}
	
	// 初期化
	pApp->m_pihv = NULL;
	pApp->pimc = NULL;
	pApp->m_piaLog = NULL;
	pApp->ncon = CON_DEFAULT;
	pApp->npro = 0;
	pApp->bMyPage = FALSE;
	
	ISHELL_GetDeviceInfo(pApp->app.m_pIShell, &adi);
	SETAEERECT(&pApp->arect, 0, 0, adi.cxScreen, adi.cyScreen - SIZE_ERRORLOG);

	
	nErr = ISHELL_CreateInstance(pApp->app.m_pIShell, AEECLSID_HTML, (void**)&pApp->m_pihv);
	if( nErr != SUCCESS )
	{
		IAUTOLOG_ErrorCheck( pApp->m_piaLog, nErr, szBuf, MAX_LENGTH );
		DBGPRINTF( "AEECLSID_HTML Ins %s", szBuf );
		return FALSE;
	}

	IHTMLVIEWER_SetRect(pApp->m_pihv, &pApp->arect);
	IHTMLVIEWER_SetNotifyFn(pApp->m_pihv, (PFNHVIEWNOTIFY)HtmlNotify_MENU, pApp);

	// IAutoLogインスタンス生成
	nErr = ISHELL_CreateInstance(pApp->app.m_pIShell, AEECLSID_IAUTOLOG, (void**)&pApp->m_piaLog);
	if( nErr != SUCCESS )
	{
		DBGPRINTF( "AEECLSID_IAUTOLOG Ins 0x%x", nErr );
		return FALSE;
	}

	//Log初期化
	if( InitAutoLog( pApp ) != SUCCESS )
	{
		DBGPRINTF("IAutoLog Init EFAILED");
		return  FALSE ;
	}

	return TRUE;
}

//	myAppCleanupインスタンスの終了処理
void myAppCleanup(MyApp* pApp)
{
	//Log関係初期化
	EndAutoLog( pApp );
	// 各インスタンスの参照カウンタのデクリメント
	if( pApp->m_pihv != NULL )
	{
		ReleaseI((void **)&pApp->m_pihv);
	}
	if( pApp->pimc != NULL )
	{
		ReleaseI((void **)&pApp->pimc);
	}
	if( pApp->m_piaLog != NULL )
	{
		ReleaseI((void **)&pApp->m_piaLog);
	}
}

//	ReleaseI :: 汎用メモリ解放関数
uint32 ReleaseI(void **ppif)
{
	uint32	nRes = 0;

	if (*ppif)
	{
		nRes = IBASE_Release((IBase*)*ppif);
		*ppif = 0;
	}
	return nRes;
}

//	MainHtml :: 試験開始の画面作成
void MainHtml(MyApp *pApp)
{
	char	szHtml[] = { 
		"== come01 MENU ==<br>"								// メインメニュー
		"<a href=1001>1.基本動作確認</a><br>"				// 1.基本動作確認
		"<a href=1002>2.コントロール確認</a><br>"				// 2.コントロール確認
		"<a href=1003>3.ログ""\x95""\x5c""示</a><br>"		// 3.ログ表示
		"<a href=1004>4.ログクリア</a><br>"					// 4.ログクリア
		"<br>"												//
		"<a href=1005>5.アプリ終了</a><br>"					// 5.アプリ終了
		"<br>"												//
	};


	pApp->bMyPage = TRUE;
	IHTMLVIEWER_SetRect(pApp->m_pihv, &pApp->arect);
	IHTMLVIEWER_ParseBuffer( pApp->m_pihv, szHtml );

	return;
}


//	ShowMainMenu :: 基本画面の作成
void ShowMainMenu(MyApp *pApp)
{
	// 作業変数の定義
	char pszHtmlData[] = {
		"Main Menu<BR>"
		"<FORM METHOD=POST ACTION=1001>"
		"<HR>"
		"<P>CTL選択<BR>"
		"<INPUT TYPE=radio NAME=ctype VALUE=menu CHECKED> MENUCTL <BR>"
		"<INPUT TYPE=radio NAME=ctype VALUE=list> LISTCTL <BR>"
		"<INPUT TYPE=radio NAME=ctype VALUE=icon> ICONVIEWCTL <BR></P>"
		"<CENTER><INPUT TYPE=SUBMIT VALUE=OK></FORM>"
	};

	// NULLチェック
	if( pApp == NULL )
	{
		DBGPRINTF("pApp is NULL");
		return;
	}

	if( pApp->m_pihv == NULL )
	{
		DBGPRINTF("IHtmlViewerインスタンス is NULL");
		return;
	}

	pApp->bMyPage = TRUE;

	//	HTMLの描画範囲を変更
	IHTMLVIEWER_SetRect(pApp->m_pihv, &pApp->arect);
	IHTMLVIEWER_ParseBuffer(pApp->m_pihv, pszHtmlData);
}

//	HtmlNotify_MENU :: HTMLVIEWERメッセージハンドラ
void HtmlNotify_MENU(MyApp *pApp, HViewNotify *phvn, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	// 作業変数の定義
	char pszBuf[MAX_LENGTH]="";
	boolean bRet = FALSE;
	// NULLチェック
	if( pApp == NULL )
	{
		DBGPRINTF("pApp is NULL");
		return;
	}

	if( pApp->m_pihv == NULL )
	{
		DBGPRINTF("IHtmlViewerインスタンス is NULL");
		return;
	}

	switch( phvn->code )
	{
	case HVN_JUMP:
		switch( ATOI( phvn->u.submit.pszURL ) )
		{
		case 1001:
			//基本動作確認
			bRet =  menuMain_item1( pApp );
			// アプリ状態遷移
			MoveState( pApp, LOG_ADDREF_REL );
			break;

		case 1002:
			//コントロール確認
			ShowMainMenu( pApp );
			MoveState( pApp, MENU_CTLSEL );
			break;

		case 1003:
			//ログ表示
			bRet =  menuMain_item9( pApp );
			// アプリ状態遷移
			MoveState( pApp, LOG_ALL_DISP );
			break;

		case 1004:
			//ログクリア
			bRet =  menuMain_item10( pApp );
			// アプリ状態遷移
			MoveState( pApp, LOG_ALL_CLEAR );
			break;

		case 1005:
			//アプリ終了
			//アプリ終了
			ISHELL_CloseApplet( pApp->app.m_pIShell, FALSE );
			break ;
		default:
			break;
		}
			break;

	
	case HVN_SUBMIT:
		switch( ATOI( phvn->u.submit.pszURL ) )
		{
		case 1001:

			IAUTOLOG_GetParam(pApp->m_piaLog, phvn->u.submit.pszData, "ctype", pszBuf, MAX_LENGTH);
			pApp->bMyPage = FALSE;
			if( STRCMP(pszBuf, "menu") == 0 )
			{
				pApp->ctype = MENUCTL;
			}
			else if( STRCMP(pszBuf, "list") == 0 )
			{
				pApp->ctype = LISTCTL;
			}
			else if( STRCMP(pszBuf, "icon") == 0 )
			{
				pApp->ctype = ICONVIEWCTL;
			}
			
			if ( pApp->pimc != NULL )
			{
				test_Release( pApp, pApp->pimc );
			}
			
			if ( TRUE != CreateMenuCtl(pApp) )
			{
				DBGPRINTF( "CreateMenuCtl ERROR" );
			}
			
			MoveState( pApp, MENU_CTL );
			break;
		case 2001:
			IAUTOLOG_Debug( pApp->m_piaLog, pApp->m_pihv, phvn );
			break;
		default :
			break;
		}
		break;
	default :
		break;
	}
	
	return;
}

boolean InitAutoLog( MyApp  *pApp )
{
	int	nRet;
	
	//IAUTOLOG初期化
	pApp->m_pifm = NULL;
	pApp->m_pif_log = NULL;
	pApp->m_nLogCount = 1;
	pApp->m_nDisplayLogCount = 1;
	pApp->m_bLogDispFlg = FALSE;
	
	MEMSET(pApp->m_szHtmlBuf, NULL, BUFSIZE_HTML);
	
	if ( IAUTOLOG_Management(pApp->m_piaLog, AUTOLOG_PATH ) != IAUTOLOG_SUCCESS )
	{
		DBGPRINTF("AUTOLOG_Management FAILED");
		return (EFAILED) ;
	}
	
	// IFileMgrインスタンス生成
	if (ISHELL_CreateInstance(pApp->app.m_pIShell, AEECLSID_FILEMGR, (void**)&pApp->m_pifm)
		!= SUCCESS)
	{
		DBGPRINTF("IFileMgr CreateInstance EFAILED");
		return (EFAILED);
	}
	
	//ログファイルの作成
	nRet = IFILEMGR_Test(pApp->m_pifm, LOG_FILE);
	if ( nRet == SUCCESS )
	{
		nRet = IFILEMGR_Remove(pApp->m_pifm,LOG_FILE);
		if( nRet != SUCCESS)
		{
			DBGPRINTF("LOGFILE DELETE ERROR %s", LOG_FILE);
			return (EFAILED);
		}
	}
	pApp->m_pif_log = IFILEMGR_OpenFile(pApp->m_pifm, LOG_FILE, _OFM_CREATE);
	if ( pApp->m_pif_log == NULL )
	{
		DBGPRINTF("LOGFILE OPEN ERROR %s", LOG_FILE);
		return (EFAILED);
	}
	IFILE_Write(pApp->m_pif_log,"<html><body></body></html>",26);
	
	return SUCCESS;

}

boolean	 EndAutoLog( MyApp  *pApp )
{
	AutoLogChain	*tmpLogChain;
	byte			*bTmp;
	
	//Log表示メモリクリア
	if( pApp->m_AutoLogChain != NULL )
	{
		tmpLogChain = pApp->m_AutoLogChain;
		do{
	
			bTmp = (byte *)tmpLogChain->pNextPtr;
			FREEIF( tmpLogChain );
			tmpLogChain = (AutoLogChain *)bTmp;
	
		}while (tmpLogChain != NULL);
	}
	
	//メモリ解放
	if( pApp->m_pcReadBuf != NULL )
	{
		FREEIF( pApp->m_pcReadBuf );
	}
	
	//IFILEMGRの破棄
	if( pApp->m_pifm != NULL )
	{
		IFILEMGR_Release( pApp->m_pifm ) ;
		pApp->m_pifm = NULL ;
	}
	
	//IFILEの破棄
	if( pApp->m_pif_log != NULL )
	{
		IFILE_Release( pApp->m_pif_log ) ;
		pApp->m_pif_log = NULL ;
	}
	
	//	AUTOLOGの破棄
	if( pApp->m_piaLog != NULL )
	{
		IAUTOLOG_Release( pApp->m_piaLog ) ;
		pApp->m_piaLog = NULL ;
	}
	
	return TRUE;
}

void LogDisp( MyApp *pApp )
{
	int		nRet=0;						//戻り値
	char	aszBuf[ERR_BUF] = "";		// エラーコード格納
	uint32  unRes = 0;					//戻り値
	int32	nLogSize = 0;				//データサイズ
	FileInfo	fi;						//File情報
	AutoLogChain	*pAutoLogChain;		//Log表示用tmp
	AutoLogChain	*pAutoLogChainNext;	//Log表示用tmp
		
	//LOG表示中フラグON
	pApp->m_bLogDispFlg = TRUE;
	
	MEMSET(pApp->m_szHtmlBuf,NULL,BUFSIZE_HTML);
	MEMSET(&fi, 0, sizeof(FileInfo));
	
	//ファイルの情報を取得
	nRet = IFILE_GetInfo(pApp->m_pif_log, &fi);
	if( nRet != SUCCESS )
	{
		IAUTOLOG_ErrorCheck( pApp->m_piaLog, nRet, aszBuf, ERR_BUF );
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "---ﾛｸﾞ読み込み失敗---") );
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "ERROR IFILE_GetInfo %s", aszBuf) );
		STRCAT( pApp->m_szHtmlBuf, "ﾌｧｲﾙの読み込みに失敗しました<br>" );
		IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf ) ;
		IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
		return;
	}
	//ファイルの先頭に移動
	unRes = IFILE_Seek(pApp->m_pif_log, _SEEK_START, 0);
	if( unRes != SUCCESS )
	{
		IAUTOLOG_ErrorCheck( pApp->m_piaLog, unRes, aszBuf, ERR_BUF );
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "---ﾛｸﾞ読み込み失敗---") );
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "ERROR IFILE_Seek %s", aszBuf) );
		STRCAT( pApp->m_szHtmlBuf, "ﾌｧｲﾙの読み込みに失敗しました<br>" );
		IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf ) ;
		IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
		return;
	}
	
	//NULL以外はメモリ解放
	if( pApp->m_pcReadBuf != NULL )
	{
		FREEIF( pApp->m_pcReadBuf );
	}
	
	//ファイルのメモリを確保
	pApp->m_pcReadBuf = (char *)MALLOC(( fi.dwSize + 1 ));
	if ( pApp->m_pcReadBuf == NULL )
	{
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "---ﾛｸﾞ読み込み失敗---") );
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "ERROR MALLOC") );
		STRCAT( pApp->m_szHtmlBuf, "ﾌｧｲﾙの読み込みに失敗しました<br>" );
		IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf ) ;
		IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
		FREEIF( pApp->m_pcReadBuf );
		return;
	}
	
	//ファイルの読込み
	nLogSize = IFILE_Read( pApp->m_pif_log, (void *)pApp->m_pcReadBuf, (fi.dwSize +1) );
	// 読込み失敗
	if( nLogSize == 0 )
	{
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "---ﾛｸﾞ読み込み失敗---") );
		IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, FALSE, "ERROR IFILE_Read") );
		STRCAT( pApp->m_szHtmlBuf, "ﾌｧｲﾙの読み込みに失敗しました<br>" );
		IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf ) ;
		IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
		FREEIF( pApp->m_pcReadBuf );
		return;
	}
	
	//ファイルの先頭位置を指定
	pAutoLogChain = MALLOC( sizeof( AutoLogChain ) );
	if( pAutoLogChain == NULL )
	{
		FREEIF( pApp->m_pcReadBuf );
		return;
	}
	pAutoLogChain->pcLogPtr   = pApp->m_pcReadBuf;					//文字列の先頭位置
	pAutoLogChain->nCharLen   = STRLEN(pAutoLogChain->pcLogPtr);	//初期化
	pAutoLogChain->pBeforePtr = NULL;								//初期化
	pAutoLogChain->pNextPtr   = NULL;								//初期化
	pApp->m_AutoLogChain = pAutoLogChain;							//Log表示用保持
	
	//改ページがあるまで読み読み
	while( STRSTR( pAutoLogChain->pcLogPtr, "\n" ) != NULL ){
	
		pAutoLogChainNext = MALLOC( sizeof( AutoLogChain ) );							//次のページの位置保持用エリア取得
		pAutoLogChainNext->pcLogPtr   = STRSTR( pAutoLogChain->pcLogPtr, "\n" ) + 1;	//次のページの開始文字位置を保持
		pAutoLogChainNext->nCharLen   = STRLEN( pAutoLogChainNext->pcLogPtr );			//次のページの文字列長を保持
		pAutoLogChainNext->pBeforePtr = pAutoLogChain;									//現在(次の前)のページ開始位置を保持
		pAutoLogChainNext->pNextPtr	  = NULL;											//次の次のページの位置を初期化
	
		pAutoLogChain->pNextPtr = pAutoLogChainNext;										//次のページを設定
		pAutoLogChain->nCharLen = pAutoLogChainNext->pcLogPtr - pAutoLogChain->pcLogPtr;	//文字列の長さを設定
		pAutoLogChain = pAutoLogChainNext;													//次のページを作業用に設定する
	
	};
	
	//1ページ目の表示内容を取得
	pApp->m_AutoLogDispNow = pApp->m_AutoLogChain;
	MEMSET(pApp->m_szHtmlBuf,NULL,BUFSIZE_HTML);
	MEMCPY( pApp->m_szHtmlBuf, pApp->m_AutoLogDispNow->pcLogPtr, pApp->m_AutoLogDispNow->nCharLen );
	
	//ログの表示
	IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf );
	IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
	
	return;
}

void LogClear( MyApp *pApp )
{
	int		nRet=0;					//戻り値
	char	aszOutput[BUF];			//出力用tmp
	AutoLogChain	*tmpLogChain;
	byte			*bTmp;
	
	//Log表示メモリクリア
	if( pApp->m_AutoLogChain != NULL ){
		tmpLogChain = pApp->m_AutoLogChain;
		do{
		
			bTmp = (byte *)tmpLogChain->pNextPtr;
			FREEIF(tmpLogChain );
			tmpLogChain = (AutoLogChain *)bTmp;
	
		}while (tmpLogChain != NULL);
// add sta 05.06.09 t.morishita #005
		pApp->m_AutoLogChain = NULL;
// add end 05.06.09 t.morishita #005
	}
	
	MEMSET(pApp->m_szHtmlBuf,NULL,BUFSIZE_HTML);
	nRet = IFILEMGR_Test(pApp->m_pifm, LOG_FILE);
	if ( nRet == SUCCESS )
	{	//ファイルを閉じる
		if( pApp->m_pif_log != NULL )
		{
			nRet = IFILE_Release( pApp->m_pif_log );
			pApp->m_pif_log = NULL;
			if ( nRet != 0)
			{
				DBGPRINTF("ERROR IFILE_Release");
				STRCAT( pApp->m_szHtmlBuf, "ERROR IFILE_Release<br>" );
				return;
			}
		}
		nRet = IFILEMGR_Remove(pApp->m_pifm, LOG_FILE);
		if( nRet != SUCCESS)
		{
			DBGPRINTF("LOGFILE DELETE ERROR %s", LOG_FILE);
			SPRINTF( aszOutput, "LOGFILE DELETE ERROR %s<br>", LOG_FILE);
			STRCAT( pApp->m_szHtmlBuf, aszOutput );
			return;
		}
	}
	pApp->m_pif_log = IFILEMGR_OpenFile(pApp->m_pifm, LOG_FILE, _OFM_CREATE);
	if ( pApp->m_pif_log == NULL )
	{
		DBGPRINTF("LOGFILE OPEN ERROR %s", LOG_FILE);
		SPRINTF( aszOutput, "LOGFILE OPEN ERROR %s<br>", LOG_FILE);
		STRCAT( pApp->m_szHtmlBuf, aszOutput );
		return;
	}
	IFILE_Write(pApp->m_pif_log,"<html><body></body></html>",26);
	STRCAT( pApp->m_szHtmlBuf, "ﾛｸﾞをｸﾘｱしました<br>" );
	IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf ) ;
	IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
	
	return;
}

void LogDispChange( MyApp *pApp, boolean next )
{
	if( pApp->m_AutoLogDispNow == NULL )
	{
		return;
	}
	
	if( pApp->m_AutoLogDispNow->pBeforePtr != NULL && next == BEFORE )		//前のページへ
	{
		pApp->m_AutoLogDispNow = pApp->m_AutoLogDispNow->pBeforePtr;
	
	}else if( pApp->m_AutoLogDispNow->pNextPtr != NULL && next == NEXT )	//次のページへ
	{
		pApp->m_AutoLogDispNow = pApp->m_AutoLogDispNow->pNextPtr;
	}else
	{
		return;
	}
	
	MEMSET(pApp->m_szHtmlBuf,NULL,BUFSIZE_HTML);
	MEMCPY( pApp->m_szHtmlBuf, pApp->m_AutoLogDispNow->pcLogPtr, pApp->m_AutoLogDispNow->nCharLen );
	
	//ログの表示
	IHTMLVIEWER_ParseBuffer( pApp->m_pihv , pApp->m_szHtmlBuf );
	IHTMLVIEWER_Redraw( pApp->m_pihv ) ; 
	
	return;
}

// ---------------------------------------------------------
// 関数名	: LogOutMake
// LOG出力作成
// ---------------------------------------------------------
boolean LogOutMake(MyApp  *pApp, boolean bDispFlag, boolean bTimeFlg, const char *pszFormat, ... )
{
	char		aszMesbuf[BUF];
	char		aszLogbuf[BUF];
	va_list		varg;
	int			nRet=0;
	char		aszReturn[5];
	
	MEMSET(aszMesbuf, NULL, BUF);
	MEMSET(aszLogbuf, NULL, BUF);
	MEMSET(aszReturn, NULL, sizeof(aszReturn));
	
	va_start( varg, pszFormat );
	VSPRINTF( aszMesbuf, pszFormat, varg );
	va_end( varg );
	
	//オートログへの書き込み
	IAUTOLOG_FileWrite( pApp->m_piaLog, (pApp->m_piaLog, bTimeFlg, aszMesbuf) );
	
	//文字列を設定
	if( bTimeFlg == TRUE )
	{
		if( STRSTR( aszMesbuf , "START" ) != NULL )
		{	//STARTは先頭に改行を追加
			SPRINTF( aszReturn, "<BR>" );
		}
	}
	
	//文字列設定
	SPRINTF( aszLogbuf, "%s%s<BR>", aszReturn, aszMesbuf );
	
	//画面表示
	if( bDispFlag == TRUE )
	{
		//行数カウント
		pApp->m_nDisplayLogCount++;
	
		nRet = pApp->m_nDisplayLogCount % 200;
		if( nRet == 0 )
		{
			SPRINTF( aszLogbuf, "%s%s<BR>\n", aszReturn, aszMesbuf );
		}
		STRCAT( pApp->m_szHtmlBuf, aszLogbuf );
	}
	
	//文字列設定
	SPRINTF( aszLogbuf, "%s%s<BR></body></html>", aszReturn, aszMesbuf );
	
	//行数カウント
	pApp->m_nLogCount++;
	
	//ログファイルへの書き込み
	nRet = pApp->m_nLogCount % 200;
	if( nRet == 0 )
	{
		SPRINTF( aszLogbuf, "%s%s<BR>\n</body></html>", aszReturn, aszMesbuf );
	}
	
	nRet = IFILE_Seek(pApp->m_pif_log,_SEEK_END,-14);
	if( nRet != SUCCESS )
	{
		return FALSE;
	}
	IFILE_Write(pApp->m_pif_log, aszLogbuf, STRLEN(aszLogbuf));
	
	return TRUE;
}

