シリーズ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; } |
(上記< > ¥ は本当は半角です)
このシリーズの次回は、この説明をするか、それとも、呼び出す側(今回は呼ばれる側、この関数を使う側のこと)の話を書くか、考え中です。。
では、今回はここまで。