ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

13.6.4 バイナリについて

バイナリを扱う場合のプログラムについて以下に示します。IDLファイルで定義したsequence<octet>型の定義は、生成されたヘッダファイル(IDLファイル名_apfw.h)に定義されています。ここでは、バイナリの型名をBinaryDataとして説明します。

IDLファイル定義例
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

  • 使用しないパラメタの場合
    NULLポインタとして渡されます。

  • 使用するパラメタの場合
    バイナリ領域のアドレスが渡されます。バイナリ領域はC言語実行基盤インタフェースで自動的に獲得、および解放されます。

OUT

NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    パラメタには何も設定せず、NULLポインタのまま返却します。

  • データを設定する場合
    バイナリ領域をapfw_c_alloc()で獲得し、val域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスをパラメタに設定して返却します。
    なお、獲得したバイナリ領域はC言語実行基盤インタフェースで自動的に解放されます。

INOUT

  • 使用しないパラメタの場合
    NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    渡されたパラメタがNULLポインタの場合、そのまま渡してください。
    渡されたパラメタがNULLポインタ以外の場合、val域をapfw_c_free()で解放、およびバイナリをapfw_c_free()で解放後、NULLポインタを渡してください。

  • 使用するパラメタの場合
    バイナリ領域のアドレスを値として持つ変数のアドレスが渡されます。バイナリ領域はC言語実行基盤インタフェースで自動的に獲得、および解放されますが、必要に応じてアプリケーションで解放することもできます。

  • データを設定する場合
    渡されたパラメタがNULLポインタの場合、バイナリ領域をapfw_c_alloc()で獲得、およびval域をapfw_c_alloc()で獲得して使用します。
    なお、獲得したバイナリ領域はC言語実行基盤インタフェースで自動的に解放されます。
    渡されたパラメタがNULLポインタ以外の場合、受け取ったデータ以下のデータを設定する場合にはval域を初期化してそのまま使用してください。また、受け取ったデータより大きいデータを設定する場合にはval域をapfw_c_free()で解放し、apfw_c_alloc()で再度領域獲得して使用してください。獲得した領域のアドレスはパラメタに設定して返却します。

復帰

  • データの設定を省略する場合
    関数の復帰値としてNULLを返却します。

  • データを設定する場合
    バイナリ領域をapfw_c_alloc()で獲得し、val域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスを関数の復帰値として返却します。
    なお、獲得したバイナリ領域はC言語実行基盤インタフェースで自動的に解放されます。

なお、バイナリデータは以下の構造をしています。

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 );
}