日本語 Compaq TCP/IP Services for OpenVMS
日本語機能の手引き


前へ 次へ 目次 索引



第 3 章
漢字フィルタ・プログラミング・ガイド

3.1 漢字フィルタ・プログラミングの概要

日本語 Compaq TCP/IP Services for OpenVMS は,FTP,TELNET,SMTP,リモート・プリントにおいて,漢字フィルタの機能が提供されています。シフト JIS 漢字, 7 ビット JIS 漢字(2 種類),および UJIS 漢字とDEC 漢字コードとの変換フィルタが標準で提供されています。上記以外の漢字コードと DEC 漢字コードとの変換フィルタも,ユーザが必要に応じて作成して利用することができます。

また,このフィルタは漢字コードの変換にとどまらず,より一般的なフィルタと考えることができます。本章の最後に示す UPCASE フィルタは,すべての小文字を大文字に変換するフィルタを作成して,利用する場合のプログラム例です。

作成した漢字フィルタ・ルーチンは,以下に示すセットアップを行うことにより,上記アプリケーションで使用することが可能になります。

3.1.1 フィルタの使用

作成したフィルタを使用するには次の作業を行ってください。

  1. フィルタ・ルーチンを TCPIP$フィルタ名_FSHR.EXE というファイル名で SYS$SHARE: ディレクトリに置くか,あるいは論理名 TCPIP$フィルタ名_FSHR で定義する。
  2. フィルタ・イメージを INSTALL ユーティリティで /OPEN を指定してインストールする。
  3. フィルタ・イメージのファイル保護を W:RE にする。

以下に詳細を示します。

作成したフィルタ・ルーチンを TCPIP$ フィルタ名 _FSHR.EXE というファイル名で SYS$SHARE: ディレクトリに置きます。ただし,論理名TCPIP$フィルタ名_FSHR を定義すれば,必ずしも SYS$SHARE: ディレクトリに置く必要はありません。サーバのフィルタ指定に論理名を使用する場合は,システム(/SYSTEM) 論理名の定義が必要です。システム(/SYSTEM) 論理名を定義する場合は,/EXEC も同時に指定してください。

漢字フィルタ共用イメージは, INSTALL ユーティリティで /OPEN を指定してインストールします。 SYS$SHARE: ディレクトリに標準で提供されているフィルタ共用イメージ TCPIP$ フィルタ名 _FSHR.EXE は,日本語 Compaq TCP/IP Services for OpenVMS 起動コマンド・プロシージャ (SYS$STARTUP:TCPIP$FILTER_STARTUP.COM)が自動的にインストールします。 SYS$SHARE: ディレクトリ以外にフィルタ共用イメージを置く場合には,論理名の定義を行い INSTALL ユーティリティで /OPEN を指定してインストールしてください。漢字フィルタ共用イメージのファイル保護を #W:RE#にすれば,あるユーザが作成したフィルタをすべてのユーザが使用できるようになります。

3.1.2 ANET+用に作成されたフィルタの使用

日本語 Compaq TCP/IP Services for OpenVMS 漢字フィルタ機能は, ANET+に提供されていた漢字フィルタ機能に基づいて実装されています。以下のようなコマンドにより,ANET+用に作成されたフィルタを,日本語 Compaq TCP/IP Services for OpenVMS においても,使用することができます。以下の例において,フィルタ名は ANET+用に使用する場合のフィルタの名称を指定します。

ANETP 用に作成されたフィルタを使用するには次の作業を行ってください。

  1. フィルタ・ルーチンを ANETP_フィルタ名_FSHR.EXE というファイル名で SYS$SHARE: ディレクトリに置くか,あるいは論理名 ANETP_フィルタ名_FSHR で定義する。
  2. フィルタ・イメージを INSTALL ユーティリティで /OPEN を指定してインストールする。
  3. フィルタ・イメージのファイル保護を W:RE にする

前述の TCPIP 漢字フィルタのセットアップの説明中において,
TCPIP$フィルタ名_FSHR.EXE は,ANETP_フィルタ名_FSHR.EXE と,
TCPIP$フィルタ名_FSHR は,ANETP_フィルタ名_FSHR と置き換わります。

TELNETクライアントの場合

     $ TELNET/ANETP/FILTER=フィルタ名

FTPクライアントの場合

      UNIX 形式のコマンドを用いる場合

        $ FTP/ANETP/FILTER=フィルタ名

        または

        FTP> filter [フィルタ名_ANETP]

      OpenVMS 形式のコマンドを用いる場合

        $ FTP/ANETP/FILTER=フィルタ名

        または

        FTP> set filter フィルタ名_ANETP

FTP サーバの場合

     ftp> quote "site filter フィルタ名_ANETP"

SMTPの場合

     $ DEFINE [/SYSTEM] TCPIP$SMTP_KANJI_FILTER フィルタ名_ANETP

リモート・プリントの場合

     TCPIP$PRINTCAP.DAT中のエントリでのフィルタ指定。

     :kf=フィルタ名_ANETP

PRINT コマンドでのフィルタ指定

     $ PRINT /PARAMETER=(FILTER=フィルタ名_ANETP)

3.2 漢字フィルタの設計

漢字フィルタは 2 つの要素から構成されています。コード変換を行うためのサブルーチン群と,それを呼び出す FTP,TELNET などの通信ユーティリティです。コード変換を行うサブルーチン群は共用イメージです。 SYS$SHARE:TCPIP$SJIS_FSHR.EXE は,DEC 漢字コードと SJIS 漢字コードの変換フィルタです。フィルタ共用イメージは,次に説明するフィルタ設定ルーチンと,以下の5つのフィルタ・ルーチン群を用意する必要があります。

表 3-1 :フィルタ・ルーチン群

表 3-1 フィルタ・ルーチン群
ルーチン名 内容
BEGIN_FILTER フィルタ・ストリーム初期化ルーチン
NTOH_FILTER 入力フィルタ・ルーチン
HTON_FILTER 出力フィルタ・ルーチン
RELEASE_FILTER バッファ資源解放ルーチン
END_FILTER フィルタ・ストリーム解放ルーチン

3.2.1 フィルタ設定ルーチン

FTP, TELNET などの通信ユーティリティは,各ユーティリティのコマンド行,または修飾子 /FILTER によりフィルタ名が指定されると,フィルタ名からフィルタ共用イメージのファイル名を作成します。たとえば FTP/FILTER=SJIS コマンドで FTP を起動すると, FTP は TCPIP$ フィルタ名 _FSHR.EXE という規則にしたがい, TCPIP$SJIS_FSHR.EXE を得ます。

次に通信ユーティリティは LIB$FIND_IMAGE_SYMBOL を呼び出し,共用イメージを起動し,tcpip_filter というユニバーサル・シンボルの値を得ます。すべてのフィルタ共用イメージは tcpip_filter というユニバーサル・シンボルを持たなければなりません。そしてこのユニバーサル・シンボルは,フィルタ設定ルーチンのエントリ・ポイントのアドレスとして使われます。

FTP に対して /FILTER=SJIS が指定されていると, FTP は tcpip_filter というユニバーサル・シンボルの値を解決し,サブルーチンとして呼び出します。このサブルーチンをフィルタ設定ルーチンと呼びます。フィルタ設定ルーチンを呼び出すことにより, 第 3.3 節 で説明する 5 つのフィルタ・ルーチン群のエントリ・ポイントが明らかになります。

3.2.2 フィルタ・ストリーム

フィルタ・ルーチン群はフィルタ・ストリームを管理しなければなりません。 FTP, TELNET などの通信ユーティリティは,フィルタ・ストリーム初期化ルーチン BEGIN_FILTER を呼び出して必要な数のフィルタ・ストリームを得ます。 BEGIN_FILTER ルーチンはフィルタ・ストリームの管理に必要なデータ構造の割り当て,初期化などを行った後,その識別子を呼び出し者に与えます。以後,入力/出力フィルタ・ルーチン,バッファ資源解放ルーチン,フィルタ・ストリーム解放ルーチンの呼び出しは,この識別子でフィルタ・ストリームを指定します。

フィルタ・ストリームは,変換されるデータの流れに対応するものです。フィルタ・ルーチンに変換のために渡されるデータ,それ自体で変換可能な完結したレコードではなく,変換されるべきデータの流れの一部が連続して渡されると考えなければなりません。

7 ビット JIS 漢字コードを DEC 漢字コードに変換する場合を考えてみます。 7 ビット JIS 漢字コード自体は ASCII コードと見分けがつかず, (いわゆる漢字 IN,漢字 OUT と呼ばれる) エスケープ・シーケンスにより文字集合を指示しています。もし,第 N 回目の JIS 漢字から DEC 漢字への変換ルーチンの呼び出しで漢字文字集合が指示されたら,第 N+1 回目の変換は,漢字文字集合が指示された状態から開始されなければなりません。このように,現在 JIS 漢字文字集合が指示されているのか,それとも ASCII 文字集合が指示されているのか,という状態をフィルタ・ストリームに記憶する必要があります。また,7 ビット JIS 漢字コードに限らず,変換されるべきデータが 2 バイト漢字コードの 1 バイト目で終了しているという場合もありえます。この場合は 2 バイト漢字コードの 1 バイト目をフィルタ・ストリームに記憶し,次の呼び出しで与えられたデータの先頭の 1 バイトと合わせて 2 バイト漢字コードとして変換しなければなりません。

フィルタ・ストリームはデータの流れに対応しますから, 1つのストリームで入力フィルタ・ルーチンと出力フィルタ・ルーチンが混合して呼び出されることはありません。入力フィルタ(ネットワークから読み込んだデータの変換)と出力フィルタ(ネットワークへ書き込むデータの変換)の両方を同時に必要とするときは2つのストリームが取得されます。

3.2.3 バッファ資源管理

FTP, TELNET などの通信ユーティリティは, BEGIN_FILTER ルーチンの呼び出し時に,あらかじめ確保すべきバッファ資源の数を指示します。バッファ資源とは,入力/出力フィルタ・ルーチンが変換結果を格納して呼び出し者に一時的に与えるバッファです。入力/出力フィルタの呼び出しのたびにこのバッファ資源が消費されます。通信ユーティリティは変換結果が必要でなくなると,バッファ資源解放ルーチンを呼び出し,フィルタ・ストリームにバッファ資源を返します。通信ユーティリティは BEGIN_FILTER で指定したバッファ資源の数の回数分は RELEASE_FILTER を呼び出さずに,連続して資源を消費する場合があります。

ただし,BEGIN_FILTER ルーチンに対してあらかじめ確保するバッファ資源の数1を指示した場合は,通信ユーティリティはバッファ資源解放ルーチンを呼び出しません。バッファ資源の数が 1 の場合は,入力/出力フィルタ・ルーチンの呼び出しで与えられたバッファ資源は,次の入力/出力フィルタ・ルーチンの呼び出しで自動的に解放されるものとして扱われます。

3.3 フィルタ・ルーチン

各フィルタ・ルーチンについて説明します。


TCPIP_FILTER (control-block)

フィルタ・ルーチン群のエントリ・ポイントを明らかにします。通信ユーティリティはフィルタ設定ルーチンを呼び出して 5 つのフィルタ・ルーチンのエントリ・ポイントのアドレスを得ます。

戻り値

VMS 用法: cond_value
データ型: longword (unsigned)
アクセス: write only
受け渡し方: by value


引数

control-block


VMS 用法:
データ型: record
アクセス: write only
受け渡し方: by reference



フィルタ・ルーチン群のアドレスを通信ユーティリティに対して明らかにするために使われる構造体です。次ページに control-block のデータ構造を示します。

図 3-1 :control-block のデータ構造

図 3-1 control-block のデータ構造


説明

FTP,TELNET などの通信ユーティリティは,フィルタを指定されると LIB$FIND_IMAGE_SYMBOL を使ってフィルタ共用イメージ TCPIP$ フィルタ名 _FSHR.EXE を起動し, tcpip_filter というユニバーサル・シンボルの値を得ます。フィルタ共用イメージは,tcpip_filter というユニバーサル・シンボルを持つフィルタ設定ルーチンを必ず用意しなければなりません。共用イメージの起動後,フィルタ設定ルーチンが呼び出されます。フィルタ設定ルーチンは,Control-block パラメータで渡された構造体に 5 つのフィルタ・ルーチンのエントリ・ポイントを書き込みます。以後フィルタをサポートする通信ユーティリティは control-block 内に書き込まれたサブルーチンを必要に応じて呼び出します。

FLINK,BLINK,SIZE,TYPE,FILL は通信ユーティリティが使用します。フィルタ・ルーチンは FLINK,BLINK,SIZE,TYPE,FILL の内容を変更できません。 BEGIN_FILTER フィールドにはフィルタ・ストリーム初期化ルーチンの, HTON_FILTER フィールドには出力フィルタ・ルーチンの,また,NTOH_FILTER フィールドには入力フィルタ・ルーチンのエントリ・ポイントのアドレスを書き込みます。 RELEASE_FILTER フィールドにはバッファ資源解放ルーチンの, END_FILTER フィールドにはフィルタ・ストリーム解放ルーチンのエントリ・ポイントのアドレスを書き込みます。

戻り値がサクセスの場合,フィルタが設定され,以後必要に応じてフィルタ・ストリーム初期化ルーチンが呼び出されます。戻り値がエラーの場合,フィルタは設定されません。


BEGIN_FILTER (stream, application, resource)

フィルタ・ストリームを生成,初期化し,識別子を呼び出し者に与えます。

戻り値

VMS 用法: cond_value
データ型: longword (unsigned)
アクセス: write only
受け渡し方: by value


引数

stream


VMS 用法:
データ型: longword (unsigned)
アクセス: write only
受け渡し方: by reference



フィルタ・ストリーム識別子。

application


VMS 用法:
データ型: longword (unsigned)
アクセス: read only
受け渡し方: by reference



フィルタ・ルーチンを呼び出す通信ユーティリティの種類を示します。現在,以下の値を規定しています。

表 3-2 :通信ユーティリティの種類と規定の値

表 3-2 通信ユーティリティの種類と規定の値
通信ユーティリティ 規定値
FTP 1
TELNET 2
SMTP 3
LPR 4

FTP, TELNET, SMTP, LPR の各通信ユーティリティはフィルタ・ストリーム初期化ルーチンを呼び出すとき,それぞれに割り当てられた番号を applicationパラメータとしてセットします。この番号はフィルタ・ルーチンのストリームに記憶するべきです。フィルタ・ルーチンはこの番号により上位通信ユーティリティが何であるか知ることができます。これは1つのフィルタ・ルーチンの中で,上位通信ユーティリティに依存する異なるフィルタ処理をしなければならない場合を予想しての準備です。

resource


VMS 用法:
データ型: longword integer (signed)
アクセス: read only
受け渡し方: by reference



フィルタ・ストリーム初期化時に確保するバッファ資源の数を指示します。


説明

フィルタ・ストリーム識別子は,以後,入力/出力フィルタ・ルーチン,バッファ資源解放ルーチン,フィルタ・ストリーム解放ルーチンを呼び出すとき,ストリームを識別するためにパラメータとして渡されます。フィルタ・ストリーム初期化ルーチンは,それが管理/識別できる形で,生成したストリームの識別子を呼び出し者に与えます。ストリーム識別子は 0 でない値でなければなりません。異なる 2 つのフィルタ・ストリームは異なる識別子を持たなければなりません。

バッファ資源の数は,フィルタ資源解放ルーチンを呼び出すことなく連続して入力/出力フィルタ・ルーチンを呼び出すことができる最大の回数を示します。入力/出力フィルタを呼び出すたびにバッファ資源は消費されます。入力/出力フィルタが変換結果を格納し,dst パラメータでサブルーチンの呼び出し者に与えるバッファは,その変換結果が不要となった時点でフィルタ・ストリームに返されます。通信ユーティリティはあらかじめ確保した資源数の回数以内で,フィルタ資源解放ルーチンを呼び出すことなく,入出力フィルタ・ルーチンを呼び出す場合があります。ただし,バッファ資源の数が 1 の場合,通信ユーティリティはフィルタ資源解放ルーチンを呼び出しません。資源の数が 1 の場合,つぎに入力/出力フィルタ・ルーチンが呼び出された時点で,前回の入力/出力フィルタ・ルーチンが与えたバッファ資源は解放されているものとみなします。

戻り値がサクセスの場合,以後必要に応じて入力/出力フィルタ・ルーチン,フィルタ資源解放ルーチンが呼び出されます。フィルタ・ストリームが不要になった時点でフィルタ・ストリーム解放ルーチンが呼び出されます。戻り値がエラーの場合,入力/出力フィルタ・ルーチンは呼び出されません。フィルタなしの状態になります。


前へ 次へ 目次 索引