// -----------------------------------------------------------
//		iautolog.h
// -----------------------------------------------------------
#ifndef _IAUTOLOG_H_
#define _IAUTOLOG_H_


// -----------------------------------------------------------
//		include
// -----------------------------------------------------------

#include "AEE.h"
#include "AEEModGen.h"						// Module interface definitions
#include "AEEAppGen.h"						// Applet interface definitions
#include "AEEShell.h"						// Shell interface definitions
#include "AEEHtmlViewer.h"					// HtmlViewer interface definitions
#include "AEEFile.h"						// File interface definitions
#include "AEEHeap.h "						// Heap interface definitions
#include "AEEStdLib.h"						// StdLib defitions
#include "AEEError.h"						// AEE Error Codes
#include "KDDIError.h"						// KDDI Error Codes
#include "iautolog.bid"						// 本アプリのBIDファイル


// -----------------------------------------------------------
//		define
// -----------------------------------------------------------
#define		LOGDIRECTRY			"log/"		//	ログファイルの名前
#define		FREE_SIZE			(20)		//  ヒープ領域の空きサイズ
#define		FILE_BOX			(5)			//	管理するファイルの数
#define		SHORT_BUFFER		(64)		//	バッファサイズ(小)
#define		MIDDLE_BUFFER		(128)		//	バッファサイズ(中)
#define		LARGE_BUFFER		(256)		//	バッファサイズ(大)
#define		SEEK_POINT			(37)		//	Loggerにて表示する(1行分の)文字列(設定値-1を表示)


// -----------------------------------------------------------
//		Private Error Codes
// -----------------------------------------------------------
#define		IAUTOLOG_ERROR_BASE			(0x5000)
#define		IAUTOLOG_SUCCESS			(SUCCESS)					//	成功
#define		IAUTOLOG_EFAILED			(IAUTOLOG_ERROR_BASE + 1)	//	失敗
#define		IAUTOLOG_EBADPARM			(IAUTOLOG_ERROR_BASE + 2)	//	パラメータ不良
#define		IAUTOLOG_ENOMEMORY			(IAUTOLOG_ERROR_BASE + 3)	//	IAUTOLOG_ENOMEMORY
#define		IAUTOLOG_ECLASS				(IAUTOLOG_ERROR_BASE + 4)	//	IAUTOLOGインターフェース内で
																	//	使用しているインスタンスの作成失敗
#define		IAUTOLOG_EDIRECTRY			(IAUTOLOG_ERROR_BASE + 5)	//	ログ管理ディレクトリに関する処理の失敗
#define		IAUTOLOG_EFILE				(IAUTOLOG_ERROR_BASE + 6)	//	ログファイルに関する処理の失敗


// -----------------------------------------------------------
//		Interface
// -----------------------------------------------------------
typedef  struct  _IAutoLog				IAutoLog ;

QINTERFACE(IAutoLog)
{

	//	IBASEからの継承
	DECLARE_IBASE(IAutoLog)

	int			( *MemoryCheck		)	( IAutoLog  *p );
	int			( *Management		)	( IAutoLog  *p, const char *szFilename );
	uint32		( *FileWrite		)	( IAutoLog  *p, boolean Flag, const char *pszFormat, ... );
	int			( *Main				)	( IAutoLog  *p, IHtmlViewer *pIHTMLViewer, uint32 nCase );
	int			( *Debug			)	( IAutoLog  *p, IHtmlViewer *pIHTMLViewer, HViewNotify *pHViewNotify );

	void		( *ErrorCheck		)	( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	void		( *BTErrorCheck		)	( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	void		( *KDDIErrorCheck	)	( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	void		( *FILEErrorCheck	)	( IAutoLog  *p, IFileMgr * pIFileMgr, char *pError, uint32 nSize );
	void		( *AUTOErrorCheck	)	( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	void		( *GetParam			)	( IAutoLog  *p, const char  *pszData, const char *element, char *pszBuffer, uint16  nBufSize );

} ;




// -----------------------------------------------------------
//		Function macroscopic definition
// -----------------------------------------------------------

#define		IAUTOLOG_AddRef( p )							GET_PVTBL( p, IAutoLog )->AddRef( p ) 
#define		IAUTOLOG_Release( p )							GET_PVTBL( p, IAutoLog )->Release( p ) 
#define		IAUTOLOG_MemoryCheck( p )						GET_PVTBL( p, IAutoLog )->MemoryCheck( p ) 
#define		IAUTOLOG_Management( p, ps )					GET_PVTBL( p, IAutoLog )->Management( p, ps ) 
#define		IAUTOLOG_FileWrite( p, args )					GET_PVTBL( p, IAutoLog )->FileWrite args
#define		IAUTOLOG_Main( p, ph, n )						GET_PVTBL( p, IAutoLog )->Main( p, ph, n )
#define		IAUTOLOG_Debug( p, ph, pn )						GET_PVTBL( p, IAutoLog )->Debug( p, ph, pn )

#define		IAUTOLOG_ErrorCheck( p, n, ps, un )				GET_PVTBL( p, IAutoLog )->ErrorCheck( p, n, ps, un )	
#define		IAUTOLOG_BTErrorCheck( p, n, ps, un )			GET_PVTBL( p, IAutoLog )->BTErrorCheck( p, n, ps, un )	
#define		IAUTOLOG_KDDIErrorCheck( p, n, ps, un )			GET_PVTBL( p, IAutoLog )->KDDIErrorCheck( p, n, ps, un )
#define		IAUTOLOG_FILEErrorCheck( p, pf, ps, un )		GET_PVTBL( p, IAutoLog )->FILEErrorCheck( p, pf, ps, un )	
#define		IAUTOLOG_AUTOErrorCheck( p, n, ps, un )			GET_PVTBL( p, IAutoLog )->AUTOErrorCheck( p, n, ps, un )
#define		IAUTOLOG_GetParam( p, ps1, ps2, ps3, un )		GET_PVTBL( p, IAutoLog )->GetParam( p, ps1, ps2, ps3, un )


/*======================================================================================

	関数名	: uint32	IAUTOLOG_AddRef( IAutoLog *p )
	説明	: 参照カウンタのインクリメント
----------------------------------------------------------------------------------------
	戻り値	: オブジェクトのインクリメントされた参照カウント

	引数	: IAutoLog		 *p				| IAutoLogインタフェースオブジェクトへのポインタ


======================================================================================== 

  	関数名	: uint32	IAUTOLOG_Release( IAutoLog *p )
	説明	: 参照カウンタのデクリメント
---------------------------------------------------------------------------------------
	戻り値	: オブジェクトのデクリメントされた参照カウント
			  0（ゼロ）は、オブジェクトがメモリーから解放されて無効になった場合

	引数	: IAutoLog		 *p				| IAutoLogrインタフェースオブジェクトへのポインタ


=======================================================================================

  	関数名	: int	 IAUTOLOG_MemoryCheck( IAutoLog  *p )
	説明	: ヒープ領域のメモリー空き容量を確認する
			 「 FREE_SIZE 」以下の値となると「 IAUTOLOG_ENOMEMORY 」を返却します
			  以下のことに注意してください
			  1. デフォルトでは 20 % 以下になると下記エラー値を返却します
			  2. 本関数は IAUTOLOG_Management() をコールした場合、
			     呼び出す必要がありません
			  
--------------------------------------------------------------------------------------
	戻り値	: IAUTOLOG_SUCCESS				: 成功
			  IAUTOLOG_EBADPARM				: パラメータ不良
			  IAUTOLOG_ENOMEMORY			: メモリー不足
			  IAUTOLOG_ECLASS				: IAUTOLOGインターフェース内で
											  使用しているインスタンスの作成失敗

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ


=======================================================================================

  	関数名	: int	 IAUTOLOG_Management( IAutoLog  *p, const char *szFilename )
	説明	: ログファイルの作成、及び作成環境の確認
			  以下のことに注意してください
			  1. ログファイルは最大5つ作成します
				 (5つ以上作成した場合、履歴が最古のものから削除します)
			  2. ファイル名は szFilename 文字列の前に作成時刻が、後ろに "_log"が付与されます
			  3. 拡張子は txt です (本アプリにて設定)
			  4. 本関数をコールした場合、IAUTOLOG_MemoryCheck() を呼び出す必要はありません
			     (本関数の内部処理にて呼び出しております)
--------------------------------------------------------------------------------------
	戻り値	: IAUTOLOG_SUCCESS				: 成功
			  IAUTOLOG_EBADPARM				: パラメータ不良
			  IAUTOLOG_ENOMEMORY			: メモリー不足
			  IAUTOLOG_ECLASS				: IAUTOLOGインターフェース内で
											  使用しているインスタンスの作成失敗
			  IAUTOLOG_EDIRECTRY			: ログ管理ディレクトリに関する処理の失敗
			  IAUTOLOG_EFILE				: ログファイルに関する処理の失敗
			  IAUTOLOG_EFAILED				: ログファイルの管理失敗

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  const char	*szFilename		| ファイル名


======================================================================================

	関数名	: uint32	IAUTOLOG_FileWrite( IAutoLog  *p, boolean Flag, const char *format, ... )
	説明	: ログファイルへの書込み
			  以下のことに注意してください
			  1. [format] のサイズは最大 512 Byteまでとなっております
			     それ以上の値を入れた場合の動作は保証しません
			  2. 本関数はログファイルへの書込み時に、
			     [format] 文字列の前に「[yyyy/mm/dd hh/mm/ss]\t」を、
			     文字列の後に [\n] を付与しております
				 時刻を表示したくない場合は、[Flag] を「FALSE」に設定してください
---------------------------------------------------------------------------------------
	戻り値	: 書込んだバイト数(書込み失敗は 0 Byte)

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  boolean		Flag			| 時刻の表示 TRUE:表示 / FALSE:非表示
			  const char	*format			| 書式制御文字列
			  ...							| オプションの引数


======================================================================================

  	関数名	: int	 IAUTOLOG_Main( IAutoLog *p, IHtmlViewer *pIHTMLViewer, uint32 nCase )
	説明	: Loggerに表示するログを選択する画面
			  以下のことに注意してください
			  1. 通知コード nCase は[HVN_SUBMIT]に通知されます
			  2. nCase にて指定した通知コード内にて IAUTOLOG_Debag() をコールしてください
-------------------------------------------------------------------------------------
	戻り値	: IAUTOLOG_SUCCESS				: 成功
			  IAUTOLOG_EBADPARM				: パラメータ不良
			  IAUTOLOG_ECLASS				: IAUTOLOGインターフェース内で
			 								  使用しているインスタンスの作成失敗
			  IAUTOLOG_EDIRECTRY			: ログ管理ディレクトリに関する処理の失敗
			  IAUTOLOG_EFILE				: ログファイルに関する処理の失敗

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  IHtmlViewer	*pIHTMLViewer	| IHtmlViewerインタフェースオブジェクトへのポインタ
			  uint32		nCase			| 通知コード (HVN_SUBMITに通知されます)


======================================================================================

  関数名	: int	 IAUTOLOG_Debug( IAutoLog *p, IHtmlViewer *pIHTMLViewer, HViewNotify *pHViewNotify );
	説明	: Loggerへの出力
			  以下のことに注意してください
			  1. Logger への出力は [\n] と [\t] の位置情報を基に出力しております
			     そのため、デバッグモードにてログを見やすくするためには、
			     IAUTOLOG_FileWrite() にて上記トークンを入れるようにして下さい
			  2. トークンが連続して続いている場合は、一つのトークとして扱われます
			  3. 1回の DBGPRINTF() にて出力されるログは 36 Byteと設定しております
				 (36Byte以上だとうまく表示されない危険性があるため)
			     36Byteを超える文字列は自動的に次の行へと表示されます
			     設定を変更したい場合は [SEEK_POINT] の設定値を変更してください
--------------------------------------------------------------------------------------
	戻り値	: IAUTOLOG_SUCCESS				: 成功
			  IAUTOLOG_EBADPARM				: パラメータ不良
			  IAUTOLOG_EFILE				: ログファイルに関する処理の失敗

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  IHtmlViewer	*pIHTMLViewer	| IHtmlViewerインタフェースオブジェクトへのポインタ
			  HViewNotify	*pHViewNotify	| 通知情報

========================================================================================

  関数名	: void	 IAUTOLOG_ErrorCheck( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	説明	: 一般的なエラーコードを文字列に変換します
--------------------------------------------------------------------------------------
	戻り値	: 戻り値なし

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  int			nCode			| エラーコード
			  char			*pError			| エラーコードを文字列に変換した際に格納するバッファ
			  uint32		nSize			| pError に対して nSize Byte分コピーする

========================================================================================

  関数名	: void	 IAutoLog_BTErrorCheck( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	説明	: Bluetooth系のエラーコードを文字列に変換します
--------------------------------------------------------------------------------------
	戻り値	: 戻り値なし

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  int			nCode			| エラーコード
			  char			*pError			| エラーコードを文字列に変換した際に格納するバッファ
			  uint32		nSize			| pError に対して nSize Byte分コピーする

========================================================================================

  関数名	: void	 IAutoLog_KDDIErrorCheck( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	説明	: KDDIインタフェースのエラーコードを文字列に変換します
--------------------------------------------------------------------------------------
	戻り値	: 戻り値なし

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  int			nCode			| エラーコード
			  char			*pError			| エラーコードを文字列に変換した際に格納するバッファ
			  uint32		nSize			| pError に対して nSize Byte分コピーする

========================================================================================

  関数名	: void	 IAutoLog_FILEErrorCheck( IAutoLog  *p, IFileMgr * pIFileMgr, char *pError, uint32 nSize );
	説明	: IFILE,IFILEMGRインタフェースのエラーコードを文字列に変換します
--------------------------------------------------------------------------------------
	戻り値	: 戻り値なし

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  IFileMgr		*pIFileMgr		| IFileMgrインタフェースオブジェクトへのポインタ
			  char			*pError			| エラーコードを文字列に変換した際に格納するバッファ
			  uint32		nSize			| pError に対して nSize Byte分コピーする


========================================================================================

  関数名	: void	 IAutoLog_AUTOErrorCheck( IAutoLog  *p, int nCode, char *pError, uint32 nSize );
	説明	: IAUTOLOGインタフェースのエラーコードを文字列に変換します
--------------------------------------------------------------------------------------
	戻り値	: 戻り値なし

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  int			nCode			| エラーコード
			  char			*pError			| エラーコードを文字列に変換した際に格納するバッファ
			  uint32		nSize			| pError に対して nSize Byte分コピーする

========================================================================================

  関数名	: void	 IAutoLog_GetParam( IAutoLog  *p, const char  *pszData, const char *element, char *pszBuffer, uint16  nBufSize );
	説明	: キーを使用して文字列内から特定のパラメータを取得する
			  以下のことに注意してください
			  メモリの確保は外部関数でなされているものとしている為、
			  エラーチェックを行っておりません
			  その他エラー関連について、フリーな状態なので外部でのチェック重要です

--------------------------------------------------------------------------------------
	戻り値	: 戻り値なし

	引数	: IAutoLog		*p				| IAutoLogrインタフェースオブジェクトへのポインタ
			  const char	*pszData		| 検索対象の文字列
			  const char	*element		| 検索する文字列
			  char			*pszBuffere		| 取得した文字列を受け取るバッファ
			  uint16		nBufSize		| pszBufferの最大値

======================================================================================*/


// -----------------------------------------------------------
//		struct
// -----------------------------------------------------------

typedef struct _AUTOLOG
{

	DECLARE_VTBL( IAutoLog )							//	インターフェース

	AEEApplet        aApplet;							//	AEEApplet
	uint32			 m_nReferenceCount ;				//	参照カウンタ

	IFileMgr		*m_pFileMgr ;						//	IFileMgrのインスタンス
	IFile			*m_pFile ;							//	IFileのインスタンス
	IHtmlViewer     *pIHtmlViewer;						//	IHtmlViewerのインスタンス

	char			 szCreateName[MIDDLE_BUFFER] ;		//	ログファイルの名前(パスなし)
	char			 szFileName[MIDDLE_BUFFER] ;		//	ログファイルの名前(パス付き)
	char			*pszReadBuf;						//	ログファイルのデータ
	char			*pszReadPoint;						//	ログファイルの先頭ポインタ
	int32			 unReadSize;						//	ログファイルのサイズ

}	AutoLog;


// -----------------------------------------------------------
//		Function 
// -----------------------------------------------------------
// --------------------------------------------------------
// 作成日	: 2004年3月12日
// 関数名	: IAutoLog_FileCheck
// 説明		: ログファイルの管理
//			  ログファイルが5つ以上になった場合、
//			  最古のファイルを削除する
// 戻り値	: boolean				| 管理の 成功 / 失敗 フラグ
// 引数		: AutoLog  *pAutoLog	| 汎用構造体
// --------------------------------------------------------
boolean	IAutoLog_FileCheck( AutoLog  *pAutoLog );


// --------------------------------------------------------
// 作成日	: 2004年3月17日
// 関数名	: IAutoLog_DBGTimer
// 説明		: Loggerによる連続出力がうまくいかないため、
//			  ISHELL_SetTimer()を用いた連続出力を行っています。
//			  タイマーは 6 ミリ秒で設定しています。
// 戻り値	: void					| 設定無し
// 引数		: AutoLog  *pAutoLog	| 汎用構造体
// --------------------------------------------------------
void	IAutoLog_DBGTimer( AutoLog  *pAutoLog );


#endif //_IAUTOLOG_H_






