ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

BREWでiアプリ統合作成ツールのための、1イベント1関数化(その2:呼ばれる側のソース)

2006-12-01 13:40:36 | ケータイ

 シリーズBREWでiアプリっぽくリスナーをつけるため、1イベント1関数にする方法のつづきです(名前が長いので改名しました)

 いま、1つの画面仕様書から、雛形ファイルを変えるだけで、BREWとiアプリ(あとJavaもOKだけど)、2つに対応したソースを出すツールを考えています。
 で、その場合、まず、

1.あるイベントが発生したときに、ある関数に飛ぶように登録します
2.そのイベントがきたら、登録してある関数をディスパッチします
3・結果として、イベントごとに関数を用意すれば、その関数に飛んでくれることになります。

ということを実現することが必要だってことになって、これを実現する関数として
以下の4つの関数が必要だということになりました

//■1.生成
IEventList *IEVENTLIST_Create();

//■2.解放
void IEVENTLIST_Release(IEventList *pMe);

//■3.イベント登録(addListenerにあたる)
int IEVENTLIST_Add(IEventList *pMe,void* pArg,int kind,AEEEvent eCode,
    uint16 wParam,uint32 dwParam,PFNAEEEVENT func);

//■4.イベント処理(ディスパッチ)
boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam);

 今回は、このソース(ヘッダファイルとソースファイル)について公開します。




■ヘッダファイル(IEventList.h)
ヘッダファイルについては、以下のとおりです。
/*============================================
FILE: IEventList.h
内容:イベント設定
作者:ウィリアムのいたずら
=============================================*/


/*============================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================*/
#ifndef _IEVENTLIST_H
#define	_IEVENTLIST_H
#include "AEE.h"        // Standard AEE definitions
#include "AEEShell.h"   // AEE Shell Services
#include "AEEStdLib.h"  // AEE stdlib stuff

//============================================//
//	変数定義				//
//============================================//

//	イベント判断種類
#define	IEVENTLIST_KIND_ECODE	0	// eCodeだけで判断する
#define	IEVENTLIST_KIND_WPARAM	1	// wParamも
#define	IEVENTLIST_KIND_DWPARAM	2	// dwParamも


//============================================//
//	イベント保持クラス追加		//
//============================================//
typedef struct _IEventList
{
	int	eventsu;		//	イベントの数
	int	*kind;		//	イベント判断種類
	AEEEvent	*eCode;		//	コード
	uint16	*wParam;		//	第一詳細引数
	uint32	*dwParam;		//	第二詳細引数
	PFNAEEEVENT *func;		//	呼び出し関数
	void	**pArg;		//	引渡し関数
} IEventList;
/*===============================================
FUNCTION DEFINITIONS
================================================*/
#ifdef _IEVENTLIST_C
IEventList *IEVENTLIST_Create();
void IEVENTLIST_Release(IEventList *pMe);
int IEVENTLIST_Add(IEventList *pMe,void* pArg,int kind,AEEEvent eCode,
	uint16 wParam,uint32 dwParam,PFNAEEEVENT func);
boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode,
	uint16 wParam, uint32 dwParam);
#else
extern IEventList *IEVENTLIST_Create();
extern void IEVENTLIST_Release(IEventList *pMe);
extern int IEVENTLIST_Add(IEventList *pMe,void* pArg,int kind,AEEEvent eCode,
	uint16		wParam,uint32 dwParam,PFNAEEEVENT func);
extern boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode,
	 uint16 wParam, uint32 dwParam);
#endif
#endif

(上記< > ¥ は本当は半角です)





■ソースファイル(IEventList.c)
ソースファイル(上記4つの関数)については、以下のとおりです。
/*==========================================
FILE: IEventList.c
内容:イベント設定
作者:ウィリアムのいたずら
============================================*/


/*===========================================
INCLUDES AND VARIABLE DEFINITIONS
============================================*/
#define	_IEVENTLIST_C
#include	"IEventList.h"

/*==========================================
FUNCTION DEFINITIONS
============================================*/
//==========================================//
//	関数名:IEVENTLIST_Create	       //
//	内容 :イベントリストの生成       //
//==========================================//
IEventList *IEVENTLIST_Create()
{
	IEventList *pMe;

	//	メモリ領域確保
	pMe	=	NULL;
	if ( (pMe = MALLOC(sizeof(IEventList))) == NULL )
	{
		return	NULL;
	}

	//	初期化
	pMe->eventsu	=	0;
	pMe->eCode	=	NULL;
	pMe->wParam	=	NULL;
	pMe->dwParam	=	NULL;
	pMe->func	=	NULL;
	pMe->pArg	=	NULL;

	return	pMe;
}


//==========================================//
//	関数名:IEVENTLIST_Release	       //
//	内容 :イベントリストの解放       //
//==========================================//
void	IEVENTLIST_Release(IEventList *pMe)
{
	if ( pMe	==	NULL )
		return;

	if ( pMe->kind		!=	NULL)
	{
		FREEIF(pMe->kind);
	}

	if ( pMe->eCode		!=	NULL)
	{
		FREEIF(pMe->eCode);
	}

	if ( pMe->wParam		!=	NULL)
	{
		FREEIF(pMe->wParam);
	}

	if ( pMe->dwParam		!=	NULL)
	{
		FREEIF(pMe->dwParam);
	}

	if ( pMe->func		!=	NULL)
	{
		FREEIF(pMe->func);
	}

	if ( pMe->pArg		!=	NULL)
	{
		FREEIF(pMe->pArg);
	}

	FREEIF(pMe);
}

//==========================================//
//	関数名:IEVENTLIST_Add	        //
//	内容 :イベントリスト追加	        //
//==========================================//
int IEVENTLIST_Add(IEventList *pMe,void *pArg,int kind,AEEEvent eCode,
	uint16		wParam,uint32 dwParam,PFNAEEEVENT func)
{
	int	n_eventsu;
	int	*n_kind;
	AEEEvent	*n_eCode;
	uint16	*n_wParam;
	uint32	*n_dwParam;
	PFNAEEEVENT *n_func;
	void	**n_pArg;
	
	if ( pMe	==	NULL )
		return	-1;

	//	新しい領域確保
	n_eventsu	= pMe->eventsu	+	1;
	n_kind	= (int *)MALLOC(n_eventsu * sizeof(int));
	n_eCode	= (AEEEvent *)MALLOC(n_eventsu * sizeof(AEEEvent));
	n_wParam	= (uint16 *)MALLOC(n_eventsu * sizeof(uint16));
	n_dwParam	= (uint32 *)MALLOC(n_eventsu * sizeof(uint32));
	n_func	= (PFNAEEEVENT *)MALLOC(n_eventsu * sizeof(PFNAEEEVENT));
	n_pArg	= (void **)MALLOC(n_eventsu * sizeof(void *));

	//	古い領域のコピーと解放
	if ( pMe->eventsu	!=	0 )
	{
		MEMCPY(n_kind,pMe->kind,pMe->eventsu * sizeof(int));
		FREEIF(pMe->kind);
		MEMCPY(n_eCode,pMe->eCode,pMe->eventsu * sizeof(AEEEvent));
		FREEIF(pMe->eCode);
		MEMCPY(n_wParam,pMe->wParam,pMe->eventsu * sizeof(uint16));
		FREEIF(pMe->wParam);
		MEMCPY(n_dwParam,pMe->dwParam,pMe->eventsu * sizeof(uint32));
		FREEIF(pMe->dwParam);
		MEMCPY(n_func,pMe->func,pMe->eventsu * sizeof(PFNAEEEVENT));
		FREEIF(pMe->func);
		MEMCPY(n_pArg,pMe->pArg,pMe->eventsu * sizeof(void *));
		FREEIF(pMe->pArg);
	}

	//	新しい領域を転送
	pMe->eventsu	=	n_eventsu;
	pMe->kind	=	n_kind;
	pMe->eCode	=	n_eCode;
	pMe->wParam	=	n_wParam;
	pMe->dwParam	=	n_dwParam;
	pMe->func	=	n_func;
	pMe->pArg	=	n_pArg;

	//	新しい値を転送
	n_eventsu --;	//	配列の最後は、個数 -1
	pMe->kind[n_eventsu]		=	kind;
	pMe->eCode[n_eventsu]		=	eCode;
	pMe->wParam[n_eventsu]		=	wParam;
	pMe->dwParam[n_eventsu]		=	dwParam;
	pMe->func[n_eventsu]		=	func;
	pMe->pArg[n_eventsu]		=	pArg;

	return	0;
}

//===========================================//
//	関数名:IEVENTLIST_HandleEvent      //
//	内容 :イベントリストのイベント処理//
//===========================================//
boolean IEVENTLIST_HandleEvent(IEventList *pMe, AEEEvent eCode, 
                                   uint16 wParam, uint32 dwParam)
{
	int	i;

	//	引数チェック
	if ( pMe	==	NULL )
	{
		return	FALSE;
	}

	for(i = 0 ; i < pMe->eventsu ; i ++ )
	{
		switch(pMe->kind[i])
		{
		case	IEVENTLIST_KIND_ECODE:
			if	( eCode	==	pMe->eCode[i] )
			{
				return	(pMe->func[i])(pMe->pArg[i],
                                            eCode,wParam,dwParam);
			}
			break;
		case	IEVENTLIST_KIND_WPARAM:
			if (	( eCode	==	pMe->eCode[i] ) &&
				( wParam	==	pMe->wParam[i]) )
			{
				return	(pMe->func[i])(pMe->pArg[i],
                                               eCode,wParam,dwParam);
			}
			break;
		case	IEVENTLIST_KIND_DWPARAM:
			if (	( eCode	==	pMe->eCode[i] ) &&
				( wParam	==	pMe->wParam[i]) &&
				( dwParam	==	pMe->dwParam[i]) )
			{
				return	(pMe->func[i])(pMe->pArg[i],
                                               eCode,wParam,dwParam);
			}
			break;
		}
	}
	return FALSE;
}

(上記< > ¥ は本当は半角です)




 このシリーズの次回は、この説明をするか、それとも、呼び出す側(今回は呼ばれる側、この関数を使う側のこと)の話を書くか、考え中です。。

 では、今回はここまで。
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 仕様書からプログラムソース... | トップ | iアプリやJavaの画面にお... »
最新の画像もっと見る

ケータイ」カテゴリの最新記事