/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

	【機能概要】	: Java言語アプリ用・共有メモリアクセスSR（JNIラッパー）
					  実際の共有メモリアクセスの実装は GG_SHM0011 であり、本アプリは
					  Java言語とC++言語のインターフェース部分を実装している

	【作成日】		: 2021.04.23

	【呼出形式1】	: ShmStaticTable.SHM0001 (
						  byte[] in							# 各パラメータを入力（パラメータ例は以下、\nコード区切り）
															# テーブルID / 検索ID / key1 / value1 / key2 / value2 ･･･
					  )
	【戻り値1】		: int									# データ取得件数。但し、マイナス値はエラーコード

	【呼出形式2】	: ShmStaticTable.SHM0001getData (
						  byte[] out						# 返却データ格納領域を指定（各行は\n区切り）
															# １行目:項目名（\t区切り）、２行目以降:データ値（\t区切り）
					  )
	【戻り値2】		: void									# なし

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

#include <string.h>
#include <stdio.h>
#include <sys/syscall.h>

#include "GG_SHMCOM.h"

#include "com_galaxygoby_ShmStaticTable.h"

int  GG_SHM0011_logic( int prmNum, char Prm[][ GG_SHM0001_MaxPrmLen ] ) ;
void GG_SHM0011_getData ( char *arrOut ) ;

/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	共有メモリデータ検索処理
	GG_SHM0011_logic（C++言語）を呼び出して、共有メモリデータの検索を行う。
	Javaから受信したbyteデータをchar配列に分離して呼び出しを実行。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

JNIEXPORT jint JNICALL Java_com_galaxygoby_ShmStaticTable_SHM0001
(JNIEnv *env, jobject obj, jbyteArray in ) {

	int		prmNum ;								// パラメータ数
	char	Prm [ GG_SHM0001_MaxPrmNum ][ GG_SHM0001_MaxPrmLen ] ;	// パラメータ
	char	*savepoint ;							// strtok_r用savepoint
	char    szLogFileTmpPath [ MAX_PATH ] ;			// XMLファイル名
	char    g_szLogFilePath  [ MAX_PATH ] ;			// ログファイル名
	char    szAccessDate [ 30 ] ;					// YYYY-MM-DD HH:MM:SS.mmmmmm

	int		ThreadId = (int)syscall(SYS_gettid) ;	// スレッドIDの取得

	// ログ出力場所の決定
	getEnvString ( szLogFileTmpPath , "GG_LogFileName"
		, GG_SHM0011_LOGPATH , sizeof(szLogFileTmpPath) );
	getLocalTimeString ( g_szLogFilePath , sizeof(g_szLogFilePath) , szLogFileTmpPath ) ;

	jbyte* arrIn  = env->GetByteArrayElements(in,NULL);		// jbyteArray型→jbyte型に変換
	int nSize = env->GetArrayLength(in);					// データ長取得
	arrIn[nSize-1] = '\0' ;									// ストッパー設定

	/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		strtok_rを使用して、Javaの入力パラメータ（\n区切り）をGG_SHM0011_logic用の
		パラメータ形式（int prmNum, char Prm[]）に変換
	_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

	char *tp ;
	for ( prmNum = 1 ;; prmNum++ ) {
		if ( prmNum == 1 ) {
			tp = strtok_r ( (char *)arrIn , "\n" , &savepoint ) ;
		} else {
			tp = strtok_r ( NULL , "\n" , &savepoint ) ;
		}
		if ( tp != NULL ) {
			strcpy ( Prm[prmNum] , tp ) ;
			getLocalTimeString ( szAccessDate , sizeof(szAccessDate), "%Y/%m/%d %H:%M:%S.%U" ) ;
			GG_MsgOut ( g_szLogFilePath , 9
				, "(%05d) **** ( %s ) **** 入力パラメータ Prm[%d] = [%s] ****"
				, ThreadId , szAccessDate , prmNum , Prm[prmNum] ) ;
		} else {
			prmNum -- ;
			break ;
		}
	}

	// ログ出力
	getLocalTimeString ( szAccessDate , sizeof(szAccessDate), "%Y/%m/%d %H:%M:%S.%U" ) ;
	GG_MsgOut ( g_szLogFilePath , 9
		, "(%05d) **** ( %s ) **** 入力パラメータ数 prmNum = [ %d ]"
		, ThreadId , szAccessDate , prmNum ) ;
	
	int ret = GG_SHM0011_logic( prmNum, Prm ) ;			// 共有メモリ検索処理を実行

	env->ReleaseByteArrayElements(in,  arrIn,  0);		// arrIn を解放

	return ( ret ) ;									// 取得データ長を返却
}

/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	共有メモリデータ取得処理
	GG_SHM0011_getData（C++言語）を呼び出して、共有メモリデータの取得を行う。
	GG_SHM0011_logic（C++言語）で検索データ長が決定しているので、上位のJavaアプリ
	が用意した領域（out）に取得データを返却する
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */

JNIEXPORT void JNICALL Java_com_galaxygoby_ShmStaticTable_SHM0001getData
(JNIEnv *env, jobject obj, jbyteArray out ) {

	jbyte* arrOut = env->GetByteArrayElements(out,NULL);

	GG_SHM0011_getData ( (char *)arrOut ) ;
/*
	getEnvString ( szLogFileTmpPath , "GG_LogFileName"
		, GG_SHM0011_LOGPATH , sizeof(szLogFileTmpPath) );
	getLocalTimeString ( g_szLogFilePath , sizeof(g_szLogFilePath) , szLogFileTmpPath ) ;
	getLocalTimeString ( szAccessDate , sizeof(szAccessDate), "%Y/%m/%d %H:%M:%S.%U" ) ;
	GG_MsgOut ( g_szLogFilePath , 9
		, "(%05d) **** ( %s ) **** 出力パラメータ out=[%s] ****"
		, ThreadId , szAccessDate , (char *)arrOut ) ;
*/
	env->ReleaseByteArrayElements(out, arrOut, 0);			// arrOutの解放
}
