バイナリを扱う場合のプログラムについて以下に示します。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 );
} |