XATMIインタフェースの通信では,1回のサービス要求でまとまったデータを送信できるように,C言語の場合は構造体,COBOL言語の場合はレコードを送受信のデータに使えます。このデータを,C言語の場合は型付きバッファ(タイプトバッファ),COBOL言語の場合は型付きレコード(タイプトレコード)といいます。
通信データの型は,タイプ(type)とサブタイプ(subtype)から構成されます。UAPで使う通信データの型は,UAPを作成するときにスタブのソースファイル(XATMIインタフェース定義)で指定します。XATMIインタフェース定義については,マニュアル「OpenTP1 プログラム作成リファレンス」の該当する言語編を参照してください。
XATMIインタフェースで規定するデータ型の呼称です。それぞれのタイプには次の特長があります。
それぞれのタイプで使える範囲のデータを要素に持つ,構造体またはレコードを示す名称です。
タイプで使えるデータ型については,「5.1.6(3) タイプで使えるデータ型の一覧」を参照してください。
型付きバッファまたは型付きレコードを使うと,C言語の場合は構造体で,COBOL言語の場合はレコードでデータをやり取りできます。また,関数のフラグの設定によって,設定した受信用のデータ型と異なるタイプやサブタイプ,異なる大きさのデータでも受信できます。ただし,UAPで扱える通信データの型は,UAPにXATMIインタフェース定義で事前に定義した値と一致していることが前提です。
型付きバッファを使うときは,XATMIインタフェース定義(サーバUAP用)にタイプ,サブタイプ,およびデータ型を指定します。XATMIインタフェース定義ファイルからスタブを生成して,スタブのオブジェクトファイルをサーバUAPにリンケージすると,該当する型付きバッファを使えるようになります。XATMIインタフェース定義については,マニュアル「OpenTP1 プログラム作成リファレンス」の該当する言語編を参照してください。
通信プロトコルにOSI TPを使ってOpenTP1以外のシステムと通信する場合でも,通信相手システムで型付きバッファおよび型付きレコードを認識できるように変換して送信できます。
タイプで使えるデータ型の一覧を次の表に示します。識別子とはXATMIインタフェース定義に記述するデータ型を示し,C言語のデータ型およびCOBOL言語のデータとは実際にスタブに定義される型付きバッファおよび型付きレコードを示します。OpenTP1以外のシステムと通信するためにデータ型を変換する場合は,変換する識別子をXATMIインタフェース定義に指定します。
表5-4 タイプで使えるデータ型の一覧
タイプ | 識別子 | C言語のデータ型 | COBOL言語の データ型 | 通信プロトコル | 備考 | |
---|---|---|---|---|---|---|
TCP/IP | OSI TP | |||||
X_OCTET | -※1 | -※1 | -※1 | ○ | ○ | なし |
X_COMMON | short a | short a | PIC S9(9) COMP-5 | ○ | ○ | なし |
short a[n] | short a[n] | PIC S9(9) COMP-5 OCCURS n TIMES | ○ | ○ | なし | |
long a | long a | PIC S9(9) COMP-5 | ○ | ○ | なし | |
long a[n] | long a[n] | PIC S9(9) COMP-5 OCCURS n TIMES | ○ | ○ | なし | |
char a※2 | char a | PIC X | ○ | ○ | 無変換配列 | |
octet a | char a | PIC X | ○ | ○ | 無変換配列 | |
tchar a | char a | PIC X | - | ○ | 変換配列 | |
char a[n]※2 | char a[n] | PIC X(n) | ○ | ○ | 無変換配列 | |
octet a[n] | char a[n] | PIC X(n) | ○ | ○ | 無変換配列 | |
tchar a[n] | char a[n] | PIC X(n) | - | ○ | 変換配列 | |
X_C_TYPE | short a | short a | - | ○ | × | なし |
short a[n] | short a[n] | - | ○ | × | なし | |
long a | DCLONG a | - | ○ | × | なし | |
long a[n] | DCLONG a[n] | - | ○ | × | なし | |
int4 a | DCLONG a | - | ○ | × | なし | |
int4 a[n] | DCLONG a[n] | - | ○ | × | なし | |
char a ※2 | char a | - | ○ | × | なし | |
octet a | char a | - | ○ | × | なし | |
tchar a | char a | - | ○ | × | なし | |
char a[n]※2 | char a[n] | - | ○ | × | なし | |
octet a[n] | char a[n] | - | ○ | × | なし | |
tchar a[n] | char a[n] | - | ○ | × | なし | |
float a | float a | - | ○ | × | なし | |
float a[n] | float a[n] | - | ○ | × | なし | |
double a | double a | - | ○ | × | なし | |
double a[n] | double a[n] | - | ○ | × | なし | |
octet a[n][n] | char a[n][n] | - | ○ | × | なし | |
tchar a[n][n] | char a[n][n] | - | ○ | × | なし | |
str a[n] | char a[n] | - | ○ | × | なし | |
str a[n][n] | char a[n][n] | - | ○ | × | なし | |
tstr a[n] | char a[n] | - | ○ | × | なし | |
tstr a[n][n] | char a[n][n] | - | ○ | × | なし |
XATMIインタフェースの関数で通信データを操作する方法について説明します。通信データを操作できるAPIは,C言語でだけ使えます。COBOL言語の場合は,通信データを操作するためのAPIはありません。
型付きバッファを確保する場合は,タイプとサブタイプの値を設定したtpalloc()をUAPから呼び出します。tpalloc()で確保した領域は,NULLでクリアされます。
型付きバッファの長さを大きくする場合は,tprealloc()を使います。tprealloc()で使えるバッファ型は,X_OCTETだけです。それ以外のバッファ型を指定した場合は,エラーリターンします。変更後のバッファ長が短い場合は,バッファに入り切らない分は切り捨てられます。逆に,変更後のバッファ長が長い場合は,余った部分がNULLクリアされます。
再確保に失敗すると,変更前のバッファ型も無効になります。
確保した領域を解放する場合は,tpfree()を使います。引数には型付きバッファへのポインタを設定します。型付きバッファのポインタでない値を設定した場合は,無視されます。
バッファのタイプなどの情報を取得する場合は,tptypes()を使います。
型付きバッファを操作する関数は,Cライブラリのmalloc(),realloc(),free()と一緒には使わないでください(例えば,tpalloc()で割り当てたバッファは,free()で解放しないでください)。確保した型付きバッファに対して,free()を呼び出した場合の動作は保証しません。
X_OCTET型の型付きバッファを使う場合は,ほかの型のバッファを使う場合と次に示す点で異なります。