動的メッセージ方式は、アプリケーションプログラムの実行中にメッセージパターン情報を提供するという方法です。まず、メッセージパターンを作成して、ToolTalk サービスに登録します。ToolTalk サービスがメッセージとパターンを照合するときに呼び出すコールバックルーチンを、動的メッセージパターンに追加できます。
動的メッセージパターンを作成し登録するためには、新しいパターンオブジェクトを割り当て、適切な情報を書き込んでから登録します。パターンが必要なくなった (つまり、そのパターンに一致するメッセージを対象としなくなった) 場合は、パターンを登録解除するか削除します。必要に応じて、動的メッセージパターンを登録および登録解除できます。
動的メッセージパターンの作成、登録、および登録解除に使用される ToolTalk 関数を表 9-1 に示します。
表 9-1 メッセージパターンの作成、更新、および削除用の関数
ToolTalk 関数 |
機能 |
---|---|
tt_pattern_create(void) |
パターンの作成 |
tt_pattern_arg_add(Tt_pattern p, Tt_mode n, const char *vtype, const char *value) |
文字列引数の追加 |
tt_pattern_barg_add(Tt_pattern m, Tt_mode n, const char *vtype, const unsigned char *value, int len) |
バイト配列引数の追加 |
tt_pattern_iarg_add(Tt_pattern m, Tt_mode n, const char *vtype, int value) |
整数引数の追加 |
tt_pattern_xarg_add(Tt_pattern m, Tt_mode n, const char *vtype, xdrproc_t xdr_proc, void *value) |
バイト配列に xdr 引数を追加 |
tt_pattern_bcontext_add(Tt_pattern p, const char *slotname, const unsigned char *value, int length); |
バイト配列コンテキストの追加 |
tt_pattern_context_add(Tt_pattern p, const char *slotname, const char *value); |
文字列コンテキストの追加 |
tt_pattern_icontext_add(Tt_pattern p, const char *slotname, int value); |
整数コンテキストの追加 |
tt_pattern_address_add(Tt_pattern p, Tt_address d) |
アドレスの追加 |
tt_pattern_callback_add(Tt_pattern p, Tt_message_callback_action f) |
メッセージコールバックの追加 |
tt_pattern_category_set(Tt_pattern p, Tt_category c) |
カテゴリの設定 |
tt_pattern_class_add(Tt_pattern p, Tt_class c) |
クラスの追加 |
tt_pattern_disposition_add(Tt_pattern p, Tt_disposition r) |
処置の追加 |
tt_pattern_file_add(Tt_pattern p, const char *file) |
ファイルの追加 |
tt_pattern_object_add(Tt_pattern p, const char *objid) |
オブジェクトの追加 |
tt_pattern_op_add(Tt_pattern p, const char *opname) |
操作の追加 |
tt_pattern_opnum_add(Tt_pattern p, int opnum) |
操作番号の追加 |
tt_pattern_otype_add(Tt_pattern p, const char *otype) |
オブジェクト型の追加 |
tt_pattern_scope_add(Tt_pattern p, Tt_scope s) |
配信範囲の追加 |
tt_pattern_sender_add(Tt_pattern p, const char *procid) |
送信側プロセス識別子の追加 |
tt_pattern_sender_ptype_add(Tt_pattern p, const char *ptid) |
送信側プロセス型の追加 |
tt_pattern_session_add(Tt_pattern p, const char *sessid) |
セッション識別子の追加 |
tt_pattern_state_add(Tt_pattern p, Tt_state s) |
状態の追加 |
tt_pattern_user_set(Tt_pattern p, int key, void *v) |
ユーザーの設定 |
tt_pattern_register(Tt_pattern p) |
パターンの登録 |
tt_pattern_unregister(Tt_pattern p) |
パターンの登録解除 |
tt_pattern_destroy(Tt_pattern p) |
メッセージパターンの削除 |
tt_pattern_create を除くすべての関数が返す型は、Tt_status です。tt_pattern_create は、Tt_pattern を返します。
メッセージパターンを作成するには、tt_pattern_create 関数を使用します。この関数を使用して、新しいパターンオブジェクトのハンドルまたは隠されたポインタを入手できます。後続の呼び出しでは、このハンドルを使用してパターンを参照できます。
パターン情報を書き込むには、tt_pattern_attribute_add および tt_pattern_attribute_set 呼び出しを使用します。パターンに追加する各属性に複数の値を指定できます。パターンの値のどれか 1 つがメッセージの値に一致すれば、パターン属性はメッセージ属性に一致します。属性の値が指定されていない場合、ToolTalk サービスは任意の値を一致させるものと仮定します。すでに設定されているために値を 1 つだけ持つ属性もあります。
コールバックルーチンをユーザーのパターンに追加するには、tt_pattern_callback_add 関数を使用します。
コールバックは、登録したのと逆の順序で呼び出されます (つまり、最後に追加したコールバックが最初に呼び出されます)。
ToolTalk サービスがメッセージを照合する場合、コールバックルーチンを自動的に呼び出してメッセージを検査し、適切な処置を行います。パターンに一致するメッセージは、コールバックとともに配信されると、コールバックルーチンを介して処理されます。ルーチンが終了すると、TT_CALLBACK_PROCESSED
を返し、操作に使用された API オブジェクトは解放されます。その後、tt_message_destroy を使用してメッセージを削除します。それによって、メッセージが使用していた記憶領域が解放されます。次にコード例を示します。
Tt_callback_action sample_msg_callback(Tt_message m, Tt_pattern p) { ... process the reply msg ... tt_message_destroy(m); return TT_CALLBACK_PROCESSED; } |
完成したパターンを登録するには、tt_pattern_register() 関数を使用します。パターンを登録してから、処理の対象とするセッションまたはファイルを結合します。
次のコード例では、パターンを作成して登録しています。
アプリケーションプログラムが、削除したパターンに一致する配信済みメッセージを検索していない場合 (たとえば、メッセージが待ち行列に入れられた場合)、ToolTalk サービスは、それらのメッセージを削除しません。
メッセージパターンを削除するには、tt_pattern_destroy() 関数を使用します。この関数は最初にパターンを登録解除し、その後パターンオブジェクトを削除します。
パターンオブジェクトを削除せずに、メッセージパターンに一致するメッセージの受信を停止するには、tt_pattern_unregister() を使用してパターンを登録解除します。
tt_close を呼び出すと、ToolTalk サービスは、すべてのメッセージパターンオブジェクトを自動的に登録解除して削除します。
現在、処理の対象とするセッションまたはファイルによってメッセージパターンを更新するには、セッションまたはファイルを結合します。
セッションを結合するとき、ToolTalk サービスは、sessid によってメッセージパターンを更新します。たとえば、ptype を宣言する場合、あるいは TT_SESSION
または TT_FILE_IN_SESSION
を指定したメッセージパターンを登録する場合は、tt_session_join を使用してデフォルトセッションを結合します。次のコード例は、デフォルトセッションを結合する方法を示しています。
/* * Join the default session */ tt_session_join(tt_default_session()); |
表 9-2 は、処理の対象とするセッションを結合する場合に使用する ToolTalk 関数を示しています。
表 9-2 デフォルトセッションを結合するための ToolTalk 関数
返される型 |
ToolTalk 関数 |
機能 |
---|---|---|
char * |
tt_default_session(void) |
デフォルトセッションの ID を返す |
Tt_status |
tt_default_session_set(const char *sessid) |
デフォルトセッションを設定する |
char * |
tt_initial_session(void) |
初期セッションの ID を返す |
Tt_status |
tt_session_join(const char *sessid) |
このセッションを結合する |
Tt_status |
tt_session_quit(const char *sessid) |
セッションを終了する |
パターンが更新されてしまうと、結合したセッションを配信範囲としたメッセージを受信します。
あらかじめセッションを結合しており、ptype または新しいメッセージパターンを登録した場合、新しいパターンに一致するメッセージを受信するためには、再び同じセッションまたは新しいセッションを結合してパターンを更新しなければなりません。
デフォルトセッションを参照するメッセージを受信する必要がなくなった場合は、tt_session_quit() 関数を使用します。この関数は、セッションに配信範囲指定されたメッセージパターンから sessid を削除します。
複数のセッションを結合する場合、ユーザーは要求とポイントツーポイントメッセージに対する応答を自動的に受け取りますが、新しいセッションを明示的に結合しないかぎり通知を受け取ることはありません。次のコード例は、複数のセッションを結合する方法を示します。
tt_default_session_set(new_session_identifier); tt_open(); tt_session_join(new_session); |
複数のセッションを効果的に使用するには、ユーザーが、対象とするセッションのセッション ID を格納しなければなりません。このセッションは、tt_open を使用して新しいセッションを開始する前に、tt_default_session_set
にこれらの識別子を渡すためのものです。つまり、ユーザーは、システム上のファイルに値 (ttsession が環境変数 _SUN_TT_SESSION
に格納する値) を配置する必要があり、これによって他の
ToolTalk クライアントがそのファイルに含まれるセッション ID の値にアクセスでき、その値を使用して非デフォルトセッションを開始できます。たとえばユーザーは、セッション
ID を「明らかに認識されている」ファイルに格納し、その後ファイル範囲指定のメッセージ (このファイルを示す) を、適切なパターンを登録したすべてのクライアントへ送信できます。その場合クライアントは、配信先ファイルを開始する情報を得て、そこから
1 つ以上のセッション ID を読み取ります。そしてこれらのセッション ID (tt_open を伴う) を使用して、非デフォルトセッションを開始します。これに代わる方法としては、たとえば、ネームサービスまたは第三者データベースを使用してセッション
ID を通知するなどの手段があります。
ttsession セッション ID が、どのように格納されて対象とするクライアントに渡されるかは、ToolTalk プロトコルの範囲を越えており、システムのアーキテクチャに基づいて決定されなければなりません。
ファイルを結合する場合、ToolTalk サービスは、ファイルに配信範囲指定されたメッセージパターンにファイル名を自動的に追加します。たとえば、プロセス型を宣言する、あるいは TT_FILE
または TT_FILE_IN_SESSION
を指定したメッセージパターンを登録する場合、tt_file_join() 関数を使用して処理の対象とするファイルを結合します。表 9-3 は、特定の処理対象のファイルを示すために使用する ToolTalk 関数を示しています。
返される型 |
ToolTalk 関数 |
機能 |
---|---|---|
char * |
tt_default_file(void) |
デフォルトファイルを結合する |
Tt_status |
tt_default_file_set(const char *docid) |
デフォルトファイルを設定する |
Tt_status |
tt_file_join(const char *filepath) |
このファイルを結合する |
Tt_status |
tt_file_quit(const char *filepath) |
ファイルを終了する |
ファイルを参照するメッセージを受信する必要がなくなった場合、tt_file_quit() 関数を使用して、ファイルに配信範囲指定したメッセージパターンからファイル名を削除します。