バイナリを扱う場合のプログラムについて以下に示します。IDLファイルで定義したsequence<octet>型の定義は、生成されたヘッダファイル(IDLファイル名_apfw.h)に定義されています。ここでは、バイナリの型名をBinaryDataとして説明します。
typedef sequence<octet> BinaryData; module apfwmod { interface apfwinf { BinaryData server_apl( in BinaryData param_in, /* INパラメタ */ out BinaryData param_out, /* OUTパラメタ */ inout BinaryData param_inout /* INOUTパラメタ */ ); }; }; |
BinaryData* server_apl( BinaryData *param_in, /* INパラメタ */ BinaryData **param_out, /* OUTパラメタ */ BinaryData **param_inout, /* INOUTパラメタ */ int *rtn, /* 処理結果情報 */ apfwExcept *apfw_env ); /* 例外情報 */ |
パラメタ | アプリケーション連携実行基盤から | アプリケーション連携実行基盤へ |
---|---|---|
IN |
| - |
| ||
OUT | NULLポインタを値として持つ変数のアドレスが渡されます。 |
|
| ||
INOUT |
|
|
|
| |
復帰 | - |
|
|
なお、バイナリデータは以下の構造をしています。
typedef struct { unsigned int arealen; /* データ領域長 */ unsigned int vallen; /* データ長 */ unsigned char *val; /* データ領域へのアドレス */ } バイナリ型の定義名; |
データ領域長には、データ領域の領域長を設定してください。
データ長には、データ領域に設定したデータの長さを設定します。データ長には、データ領域長を超える長さを設定しないでください。
データ領域へのアドレスには、apfw_c_alloc関数で獲得した領域を設定してください。
#include "apfwcom.h" #include "apfw_cdr_lib.h" #include "XXXXXX.h" /* 実行基盤インタフェース生成ツールより生成されるヘッダファイル */ BinaryData* server_apl( BinaryData *param_in, /* INパラメタ */ BinaryData **param_out, /* OUTパラメタ */ BinaryData **param_inout, /* INOUTパラメタ */ int *rtn, /* 処理結果情報 */ apfwExcept *apfw_env ) /* 例外情報 */ { BinaryData *apfw_result = NULL; /* アプリケーションの復帰値 */ int i; /* OUTパラメタ */ *param_out = apfw_c_alloc(sizeof(BinaryData)); if( *param_out == NULL){ *rtn = APFW_RTN_ERROR; /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */ apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */ return( NULL ); } (*param_out)->arealen = (*param_out)->vallen = 10; (*param_out)->val = apfw_c_alloc(sizeof(unsigned char)*((*param_out)->arealen)); if( (*param_out)->val == NULL ){ *rtn = APFW_RTN_ERROR; /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */ apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */ return( NULL ); } for(i=0;i<10;i++){ (*param_out)->val[i] = 0x22; } /* INOUTパラメタ */ if( *param_inout != NULL ){ apfw_c_free((*param_inout)->val); } else{ *param_inout = apfw_c_alloc(sizeof(BinaryData)); if(*param_inout == NULL){ *rtn = APFW_RTN_ERROR; /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */ apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */ return( NULL ); } } (*param_inout)->arealen = (*param_inout)->vallen = 10; (*param_inout)->val = apfw_c_alloc(sizeof(unsigned char)*((*param_inout)->arealen)); if((*param_inout)->val == NULL ){ *rtn = APFW_RTN_ERROR; /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */ apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */ return( NULL ); } for(i=0;i<10;i++){ (*param_inout)->val[i] = 0x33; } /* 復帰情報 */ apfw_result = apfw_c_alloc(sizeof(BinaryData)); if( apfw_result == NULL ){ *rtn = APFW_RTN_ERROR; /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */ apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */ return( NULL ); } apfw_result->arealen = apfw_result->vallen = 10; apfw_result->val = apfw_c_alloc(sizeof(unsigned char)*apfw_result->arealen); if( apfw_result->val == NULL ){ *rtn = APFW_RTN_ERROR; /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */ apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */ return( NULL ); } for( i =0; i < 10; i++ ){ apfw_result->val[i] = 0x01; } *rtn = APFW_RTN_COMMIT; /* 処理結果情報に正常(APFW_RTN_COMMIT)を設定 */ return( apfw_result ); } |