5.4.1 例: バッファ・タイプの確認

この項のコード例は、サービスがTPSVCINFO構造体で定義されたデータ・バッファにアクセスして、tptypes()関数を使用して型を判別する方法を示します。(このプロセスは、2-16ページの「バッファ・タイプの確認」で説明しています。)このサービスでは、バッファの領域を再割り当てするかどうかを確認するために、バッファの最大サイズもチェックされます。

このサンプル・コードは、Oracle Tuxedoソフトウェアで提供される銀行業務アプリケーションのABALサービスから引用したものです。これは、aud VIEWまたはFMLのいずれかのバッファとしてリクエストを受け入れるサービスをコーディングする方法を示しています。メッセージ・タイプの確認が失敗した場合、エラー・メッセージの文字列と該当の戻りコードが戻され、成功した場合は、バッファ・タイプに合致したコードのセグメントが実行されます。tpreturn()関数の詳細は、5-16ページの「サービス・ルーチンの終了」を参照してください。

バッファ・タイプの確認のリスト

#define TMTYPERR 1 /* return code indicating tptypes failed */
#define INVALMTY 2 /* return code indicating invalid message type */

void
ABAL(transb)
TPSVCINFO *transb;

{
    struct aud *transv; /* view message */
    FBFR *transf; /* fielded buffer message */
    int repc; /* tpgetrply return code */
    char typ[TMTYPELEN+1], subtyp[TMSTYPELEN+1]; /* type, subtype of message */
    char *retstr; /* return string if tptypes fails */

/* find out what type of buffer sent */
   if (tptypes((char *)transb->data, typ, subtyp) == -1) {
      retstr=tpalloc("STRING", NULL, 100);
      (void)sprintf(retstr,
       "Message garbled; tptypes cannot tell what type message\n");
        tpreturn(TPFAIL, TMTYPERR, retstr, 100, 0);
   }
/* Determine method of processing service request based on type */
   if (strcmp(typ, "FML") == 0) {
      transf = (FBFR *)transb->data;
... code to do abal service for fielded buffer ...
tpreturn succeeds and sends FML buffer in reply 
}
else if (strcmp(typ, "VIEW") == 0 && strcmp(subtyp, "aud") == 0) {
    transv = (struct aud *)transb->data;
... code to do abal service for aud struct ...
tpreturn succeeds and sends aud view buffer in reply
 }
 else {
    retstr=tpalloc("STRING", NULL, 100);
    (void)sprintf(retstr,
    "Message garbled; is neither FML buffer nor aud view\n");
     tpreturn(TPFAIL, INVALMTY, retstr, 100, 0);
  }
}