
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <mos.h>
#include <guidbg.h>
#include <mtl.h>
#include <eintm.h>
#include <mtlein.h>
#include "eindd.h"

/* ---------------------------------------------------------------- */
/*	kobj で示されるアプリに filename をプール領域に転送し、			*/
/*	poolId を生成する												*/
/*																	*/
/*	ret :	NOERR		正常終了									*/
/* ---------------------------------------------------------------- */
int		EINDD_sendPoolListMenu( int targetId , int listMenuId , int *poolId )
{
	char	*poolPtr ;
	int		ret ;

	if ( *poolId )	// 以前作ったプールが存在する
	{
		MMI_CallMessage(MMI_GetApliId(), GM_STACKDATA, FALSE, *poolId ) ;
	}

	ret = ILLEGAL_FUNCTION ;

	poolPtr = EINDD_setupPoolListMenu( listMenuId ) ;
	if ( poolPtr != NULL )
	{
		// プールへのデータ入力要求(POOL_REAL型なので
		// プール側に"CB"型のデータ全体が確保される)
		*poolId = MMI_CallMessage( MMI_GetApliId() ,
						 GM_STACKDATA , TRUE , (int)poolPtr ) ;

		// 設定用データ領域の解放
		TL_free( poolPtr ) ;		poolPtr = NULL ;

		if ( *poolId > NOERR )
		{
			// 既存のEXGに対してプールデータを送信する
			MMI_CallMessage( targetId , GM_SENDDATA , targetId , *poolId ) ;
		}

		ret = NOERR ;
	}

	return ret ;
}

/* ---------------------------------------------------------------- */
/*	char	*EINDD_setupPoolListMenu( int listMenuId )				*/
/*																	*/
/*	リストメニューで選択されている項目をプール領域に作成する		*/
/*																	*/
/*	retPtr :	!= NULL		正常終了								*/
/*	retPtr :	   NULL		プール領域に作成できなかった			*/
/* ---------------------------------------------------------------- */
char	*EINDD_setupPoolListMenu( int listMenuId )
{
	// CB アクセスに必要なヘッダ形式
	typedef struct _CB_EINTAG
	{
		CB_TAG_LONG		Main ;
		CB_TAG			Sub ;
		ushort			SubId ;
		CB_TAG			Tag ;
	} CB_EINTAG ;

	char		*retPtr , *ptr , str[16] ;
	POOLDATA	*poolData ;
	uchar		*addrec, *cb , *einBlock ;
	size_t		hdrSize ,			// プールヘッダサイズ
				cbSize ,			// CB 型全体のサイズ
				textRecSize ,		// テキストレコードのサイズ
				mosRecSize ,		// マウス位置レコードのサイズ
				textSize = 128 ,	// テキスト本体のサイズ
				mosSize  = 4 ;		// マウス位置本体のサイズ
	int			i , selectNum , ret , blockNum ;
	LISTITEML40	*plitem ;
	int			maxRow , maxColum , allNum , x , y , btn ;
	POINT		pt ;

	retPtr = NULL ;		// 復帰値のデフォルト
	selectNum = 0 ;		// リストメニュー選択数の初期化

	// リストメニューの状態を取得
	MMI_SendMessage( listMenuId , MM_GETLMENUPTR , 3 ,
								&plitem , &maxRow , &maxColum ) ;
	allNum = maxRow * maxColum ;
	for ( i = 0 ; i <= allNum - 1 ; i++ )
	{
		// 選択されている数を取得
		if ( plitem[i].selectFlag )		selectNum++ ;
	}

	// 離されたマウスの座標を取得
	MOS_rdpos( &btn , &x , &y ) ;
	pt.x = (short)x ;
	pt.y = (short)y ;

	// ブロックの数 ( テキストブロック + 1 )
	blockNum = 2 ;

	// EIN(TM) テキストレコードの大きさ
	textRecSize = sizeof(CB_EINTAG) + sizeof(CB_TAG) + textSize ;
	textRecSize *= selectNum ;

	// EIN(TM) マウス位置レコードの大きさ
	mosRecSize = sizeof(CB_EINTAG) + sizeof(CB_TAG) + mosSize ;

	// CB 型データ全体の大きさ
	cbSize = PCB_DEF_SIZE					// CB ヘッダ
			+ PCB_MREC_SIZE * blockNum		// ブロックヘッダ
			+ textRecSize					// テキストレコード
			+ mosRecSize ;					// マウス位置レコード

	// プールデータヘッダ用領域の大きさ
	hdrSize = sizeof(POOLDATA) ;

	// メモリ獲得時に一定のメモリ(1024*16)だけ残しておくため
	// チェックする。残せなかったらリターン
	if ( ( TL_checkMemory(1)*4096 ) < ( 1024*16 + hdrSize + cbSize ) )
	{
		return NULL ;
	}

	ptr = TL_malloc( hdrSize + cbSize ) ;	// CB 用のメモリを獲得
	if ( ptr == NULL )
	{
		return NULL ;
	}
	memset( ptr , 0 , hdrSize + cbSize ) ;	// 領域の初期化

	// 確保したメモリの先頭をプールデータヘッダ用、残りを CB 領域に使用する
	poolData = (POOLDATA *)ptr ;
	cb = (uchar *)( ptr + hdrSize ) ;

	// プールヘッダの設定
	MMI_CallMessage( MMI_GetApliId() , GM_QUERYID , QM_FILENAME , (int)str ) ;
	strcpy( (char *)&(poolData->Creator) , str ) ;			// ﾃﾞｰﾀ本体編集者
	strcpy( (char *)&(poolData->Owner)   , str ) ;			// ﾌﾟｰﾙﾃﾞｰﾀ作成者
	strcpy( (char *)&(poolData->Type)    , POOL_STR_CB ) ;	// ﾃﾞｰﾀ型
	poolData->apliId = MMI_GetApliId() ;					// ﾌﾟｰﾙﾃﾞｰﾀ作成者
															// ｱﾌﾟﾘｹｰｼｮﾝID
	poolData->Kind = POOL_REAL ;							// ﾃﾞｰﾀ種別
	poolData->dPtr = (void *)cb ;							// ﾃﾞｰﾀ本体ﾎﾟｲﾝﾀ
	poolData->dSize = cbSize ;								// ﾃﾞｰﾀｻｲｽﾞ

	// CB 領域を初期化する
	ret = POL_cbInit( cb , blockNum , cbSize , 0 ) ;
	if ( ret )
	{
		// 初期化できなかったらリターン
		TL_free( ptr ) ;		ptr = NULL ;
		return NULL ;
	}

	// CB 領域にテキストブロックを登録する
	ret = POL_cbAddBlock( cb , PCBF_TEXT ,
							textRecSize + mosRecSize , &einBlock ) ;
	if ( ret == NOERR )
	{
		for ( i = 0 ; i <= allNum - 1 ; i++ )
		{
			if ( plitem[i].selectFlag )
			{
				// EIN(TM) テキストレコードを追加する
				POL_cbAddRec( einBlock , PCBF_EINTEXTKIND ,
												0 , 2 , &addrec ) ;
				*(ushort *)addrec = 0 ;

				POL_cbAddRec( einBlock , PCBF_EINTEXTFILE ,
											0 , textSize , &addrec ) ;
				strcpy( (char *)addrec , plitem[i].string ) ;

				retPtr = ptr ;
			}
		}

		// EIN(TM) マウス位置レコードを追加する
		POL_cbAddRec( einBlock , PCBF_EINMOSPOSKIND , 0 , 2 , &addrec ) ;
		*(ushort *)addrec = 0 ;

		POL_cbAddRec( einBlock , PCBF_EINMOSPOSDATA , 0 , mosSize , &addrec ) ;
		*(uint *)addrec = *(uint *)&pt ;
	}

	if ( retPtr == NULL )
	{
		TL_free( ptr ) ;
		ptr = NULL ;
	}

	return retPtr ;
}

