共通デスクトップ環境 ToolTalk メッセージの概要

第 2 章 ToolTalk メッセージの使用方法


注 -

この章のコーディング例は、CoEd という名前の ToolTalk デモ・プログラムの一部です。このプログラムのヘッダ・ファイルと .c ファイルに ToolTalk 関連のコードを組み込む方法を示すソースコードのリストについては、付録 B 「CoEd デモンストレーション・プログラム」 を参照してください。


ToolTalk 機能のアプリケーションへの通知

アプリケーションは、ToolTalk サービスとメッセージ・ツールキットが提供する相互運用機能を利用する前に、ToolTalk ライブラリとツールキットがある場所を認識しておく必要があります。

メッセージ・ツールキットの使用と ToolTalk コマンドの組み込み

ToolTalk サービスを使用するために、アプリケーションは ToolTalk API から ToolTalk 関数を呼び出します。メッセージ・ツールキットは、ToolTalk サービスへの登録、メッセージ・パターンの作成、メッセージの送信、メッセージの受信、およびメッセージ情報のチェックを行うための関数を提供します。ToolTalk サービスとツールキットを使用できるようにアプリケーションを変更するには、適切なヘッダ・ファイルをアプリケーションの .h ファイルに組み込まなければなりません。

#include <Tt/tt_c.h>		   // ToolTalk Header File 
#include <Tt/tttk.h>		   // Messaging Toolkit Header file

アプリケーションは、その .c ファイルにある新規の ToolTalk コマンドについても認識しておく必要があります。この情報はアプリケーションの .h ファイルにも格納してください。

例 2-1 は、CoEditor.h ファイルにヘッダ・ファイル情報を組み込む方法を示しています。


例 2-1 メッセージ情報の組み込み

#ifndef CoEditor_h 
#define CoEditor_h	

#include <X11/Intrinsic.h> 
#include <Tt/tt_c.h>				// ToolTalk Header 
#include <Tt/tttk.h>				// Messaging Toolkit Header

ToolTalk ライブラリの使用

アプリケーションが ToolTalk ライブラリを使用するように、アプリケーションの makefile を変更する必要があります。このためには、次のように -ltt オプションを追加します。

LOCAL_LIBRARIES = -ltt $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)

コーディングを開始する前に

メッセージ・ツールキット機能をアプリケーションに組み込む前に、アプリケーションのツールが他のツールと一緒に動作する方法を決定する必要があります。考慮すべき基本的な内容は以下のとおりです。

  1. これらのツールはどのように同時に動作するか

  2. これらのツールはどのようなオペレーションを実行できるか

  3. 他のツールにどのようなオペレーションを実行するように要求できるか

  4. 他のツールを配信対象にできるこれらのツールはどのようなイベントを生成するか (これらのツールはどの型のメッセージを送信するか)

  5. 他のツールによって生成されたイベントの中でこれらのツールの配信対象となるイベントはどれか (これらのツールはどの型のメッセージを受信するか)

これらの質問に的確に答えるには、イベントとオペレーションの間の違いと、ToolTalk サービスがお互いに関連のあるメッセージを処理する方法を理解する必要があります。

イベントとオペレーションとの違い

イベントは、何か起きたことを通知するものです。イベントは、簡単に言えばニュース速報です。送信側のプロセスは、他のプロセスがイベントが起きたことを聞くかどうかと、アクションがイベントの結果として起こるかどうかについて正式な予想を持っていません。プロセスが ToolTalk サービスを使用して、配信対象のプロセスにイベントが発生したことを知らせる場合、通知を送信します。送信側プロセスは応答を期待しないため、イベントは失敗できません。

オペレーションは、問い合わせまたはアクションです。要求側プロセスは、オペレーションが実行されるように問い合わせまたは要求を行います。要求側プロセスは結果が返されることを予想し、問い合わせまたはアクションのステータスを通知するように要求します。プロセスが ToolTalk サービスを使用して、他のツールにオペレーションを実行するように依頼する場合、要求を送信します。ToolTalk サービスは配信対象のプロセスに要求を配信し、送信側プロセスに要求のステータスを通知します。

通知の送信

アプリケーションが ToolTalk の通知を送信する場合、応答は受信せず、ツールがその通知に注意を払うかどうかについて通知を受けることもありません。通知をイベントの発生に応じて正確なレポートにすることが重要です。

たとえば、ツールがデスクトップ・サービス・メッセージの Modified を送信する場合、聞き手側のツールを指定の方法で反応させることができます。しかしツールは、他のツールがそのメッセージに反応するかどうか気にしたり、通知を受ける必要はありません。次のイベントをレポートするだけです。

THE_USER_HAS_MADE_CHANGES_TO_THIS.

要求の送信

アプリケーションが ToolTalk の要求を送信する場合、1 つのツールが指示されたオペレーションを実行する、または問い合わせに答え、応答メッセージを返すことを期待します。たとえば、ツールがデスクトップ・サービス・メッセージの Get_Modified を送信する場合、メッセージが配信され、アクションが実行されたという通知が期待できます。ToolTalk サービスでは必ず、プロセスの受信によって応答が返されるか、送信側に要求の失敗が通知されます。

次の 3 つの方法で要求を識別できます。

  1. 異常終了できるツールによって要求されるオペレーションを識別する

  2. 他のツール用に実行できるオペレーションを識別する

  3. 他のツールに実行させるオペレーションを識別する

これらのオペレーションを識別するための良い方法は、ツールが実行するまたは実行を完了したイベントとオペレーションの順序について概説するシナリオを開発することです。

シナリオの開発

シナリオは、ツールが実行および実行を完了したイベントとオペレーションの順序について概説しています。たとえば、次のシナリオは、ToolTalk デモ・プログラム CoEd が実行および実行を完了したイベントについて概説しています。

  1. ファイル・マネージャのドキュメント・アイコンをダブルクリックします。

    ファイルをエディタで開きます。エディタを実行中でない場合はシステムによって起動されます。

    ドキュメントに対して別のツールが保留中のテキストに変更を行うと、その別のツールが変更したテキストを保存するか、最後に保存されたバージョンのドキュメントに戻るか尋ねられます。

  2. テキストを挿入します。

  3. ドキュメントを保存します。

    別のツールがそのドキュメントに保留中の変更点を持っている場合、ドキュメントを変更するか尋ねられます。

  4. エディタを終了します。

    テキストに保存されていない変更がある場合、ファイルを終了する前にその変更を保存するか、破棄するか尋ねられます。

シナリオがいったん実行されると、基本的な質問に答えることができます。

ツールを同時に動作させる方法

これらのツールはどのようなオペレーションを実行できるか

他のツールにどのようなオペレーションを実行するように要求できるか

他のツールを配信対象にできるこれらのツールはどのようなイベントを生成するか

他のツールによって生成されたイベントの中でこれらのツールの配信対象となるイベントはどれか

通信用アプリケーションの準備

ToolTalk サービスは、アプリケーション統合用の完全な関数セットを提供します。ToolTalk メッセージ・ツールキットが提供する機能を使用して、アプリケーションは ToolTalk 準拠の他のアプリケーションと「通信」できます。この節では、同じプロトコルに基づく他の ToolTalk 対応アプリケーションと通信できるように、アプリケーションに組み込む必要がある ToolTalk 関数の追加方法について説明します。

ptype ファイルの作成

ToolTalk 型機構は、ToolTalk サービス・ルート・メッセージに役立つように設計されています。ツールが ptype を宣言すると、そこにリストされているメッセージ・パターンが自動的に登録されます。ToolTalk サービスは、受信するメッセージとこれらの登録されたパターンを一致させます。これらの静的メッセージ・パターンは、ツールが ToolTalk サービスとの通信を終了するまで有効です。

ToolTalk 型データベースは、本リリースに付いているツール用の ptype をすでにインストールしてあります。次のようにして、ToolTalk 型データベースからインストールされた ptype のリストを取り出すことができます。

% tt_type_comp -d user|system|network -P

ptype の名前は、ソース形式で出力されます。

他のツールすべて (つまり、本リリースには含まれていないツール) に対して、最初に ptype ファイルを作成してアプリケーションの ptype を定義し、ToolTalk 型コンパイラ tt_type_comp で、ptype をコンパイルする必要があります。ptype を定義するには、次の情報をファイルに入れる必要があります。

ptype ファイルを作成するには、どのテキスト・エディタ (viemacsdtpad など) でも使用できます。例 2-2 は、CoEd アプリケーション用の ptype ファイルからの一部分です。


例 2-2 CoEd ptype ファイル

ptype DT_CoEd {         /* Process type identifier */
    start "CoEd";       /* Start string */
    handle:             /* Receiving process */
    /*
     * Display ISO_Latin_1
     */
    session     Display(  in  ISO_Latin_1 contents) => start opnum = 1;
                                                            /* Signature */
        /* NOTE: A signature is divided
         * into two parts by the => as follows:
         * Part 1 specifies how the message is to be matched;
         * Part 2 specifies what is to be taken when 
         * a match occurs.
         */

}

ptype ファイルを作成したら、ptype をインストールします。このためには、ToolTalk 型コンパイラを実行します。コマンド行に次のように入力してください。

% tt_type_comp CoEd.ptype

CoEd.ptype は、CoEd ptype ファイル名です。

現在のセッションにおける既存の ptype に対するテスト

ToolTalk サービスは、指定の ptype がすでに現在のセッションに登録されているかどうか、テストする単純関数を提供します。

// Test for existing ptype registered in current session
tt_ptype_exists(const char *ptid)

ptid は登録用にテストするセッションの識別子です。

コンパイルされた ptype ファイルと現在実行中の ttsession のマージ

ToolTalk サービスは、コンパイルされた ToolTalk 型ファイルを現在実行中の ttsession にマージする関数を提供します。

// Merge new compiled ptypes into currently running ttsession
tt_session_types_load(current_session, compiled_types_file)

上記の current_session は、現在のデフォルトの ToolTalk セッションです。compiled_types_file はコンパイルされた ToolTalk 型ファイル名です。この関数は、新しい型を追加し、同じ名前の既存の型と置換します。その他の既存の型は変更されません。

各 ToolTalk 対応アプリケーションが実行する必要があるタスク

各 ToolTalk 対応アプリケーションが実行する必要があるタスクは多数あります。たとえば次のとおりです。

この節では、これらのタスクを実行できるようにアプリケーションに組み込む必要がある ToolTalk のコーディング例を取り上げます。


注 -

この節で使用されているコーディングの一部分は、CoEd.C ファイルから引用しています。このファイルには、アプリケーションが実行しなければならない一般コマンドが入っています。このコマンドは、特定のアプリケーションに固有のものではありません。詳細なソースコードについては、付録 B 「CoEd デモンストレーション・プログラム」 を参照してください。


ツールキットの初期化

アプリケーションはツールキットを初期化し、ToolTalk の初期セッションに登録する必要があります。そのためには、最初にプロセス識別子 (procid) を取得します。次のコーディングの一部分は、procid の取得方法とツールキットの初期化方法を示します。

// Obtain process identifier
   int myTtFd;
// Initialize toolkit and create a ToolTalk communication endpoint
   char *myProcID = ttdt_open( &myTtFd, ToolName, "SunSoft", "%I", 1 );

注意 - 注意 -

アプリケーションは、他の呼び出しが行われる前に必ず ttdt_open を呼び出さなければなりません。そうしない場合、エラーが発生します。


ToolTalk セッションへの参加とメッセージ・パターンの登録

アプリケーションはメッセージを受信する前に、ToolTalk セッションに参加し、一致するメッセージ・パターンを登録する必要があります。

// Join a ToolTalk session and register patterns and default callbacks
    sessPats = ttdt_session_join( 0, 0, session_shell, this, 1 );

イベント・ループへの ToolTalk サービスの追加

アプリケーションは、ToolTalk サービスをそのイベント・ループに追加することも行わなければなりません。

// Process ToolTalk events for Xt Clients
    XtAppAddInput( myContext, myTtFd, (XtPointer)XtInputReadMask, 
                   tk_Xt_input_handler, myProcID );

ToolTalk 対応エディタ・アプリケーションが実行する必要があるタスク

前述の 「各 ToolTalk 対応アプリケーションが実行する必要があるタスク」で説明しているタスクの他に、ToolTalk 対応エディタ・アプリケーションは次のタスクも実行する必要があります。

この節では、これらの追加タスクを実行できるようにエディタ・アプリケーションに組み込む必要がある ToolTalk のコーディング例を取り上げます。


注 -

この節で使用しているコーディングの一部分は、CoEditor.C ファイルから引用しています。このファイルには、エディタ・アプリケーション用の特定コマンドが入っています。詳細なソースコードについては、付録 B 「CoEd デモンストレーション・プログラム」 を参照してください。


メディア・ロード・パターン・コールバックの記述

ToolTalk 関数を組み込むためにエディタ・アプリケーションをコーディングする前に、実行しなければならない手順が 1 つあります。この手順は、メディア・ロード・パターン・コールバック・ルーチンを記述する必要があるということです。たとえば、次のようになります。

Tt_message
CoEditor::loadISOLatin1_(
   Tt_message         msg,
   void               *pWidget,
   Ttttk_op           op,
   Tt_status          diagnosis,
   unsigned char      *contents,
   int                len,
   char               *file,
   char               *docname
)

このコールバックは、実行時にメディア・ロード関数に渡されます。

ptype の宣言

型情報は (アプリケーションのインストール時に) 1 回だけしか指定されないので、アプリケーションを起動するたびにその ptype を宣言する必要があります。

メディア・ロード・パターン・コールバックのパス

前述したメディア・ロード・パターン・コールバック・ルーチンは実行時に渡されます。コールバックは、アプリケーションがセッションに参加するときに登録されます。ツールが要求を処理することにすると、コールバック・メッセージが送信されます。ファイルが参加する、あるいはメッセージが無視される場合にも、コールバック・メッセージは送信されます。

// Join the session and register patterns and callbacks 
sessPats = ttdt_session_join( 0, 0, session_shell, this, 1 );        

// Accept responsibility to handle a request
    _contractPats = ttdt_message_accept(msg, CoEditor::_contractCB_, 
                                        shell, this, 1, 1 ); 

// Optional task: Join a file (Can be called recursively)
    if (_filePats == 0) {_filePats = ttdt_file_join( _file, TT_SCOPE_NONE, 1,
                                                     CoEditor::_fileCB_, this );
    }        

// Fail a message 
tttk_message_fail( msg, TT_DESKTOP_ENODATA, 0, 1 );

要求完了時の応答

アプリケーションはオペレーションの要求を完了した後、送信側アプリケーションに応答しなければなりません。次のメッセージは、テキストの編集された内容を送信側に返します。

// Reply to media load pattern callback 
// with edited contents of text 
ttmedia_load_reply( _contract, (unsigned char *)contents, len, 1 );

ToolTalk 対応エディタ・アプリケーションが実行できるオプションのタスク

前述の 「ToolTalk 対応エディタ・アプリケーションが実行する必要があるタスク」で説明しているタスクの他に、エディタ・アプリケーションはその他のオプションのタスクも実行できます。オプションのタスクには、他のエディタとの調整を取るためにデスクトップ・ファイル・インタフェースを使用するものなどがあります。この節では、これらのオプションのタスクを実行できるようにエディタ・アプリケーションに組み込む必要がある ToolTalk のコーディング例をいくつか取り上げています。


注 -

この節で使用しているコーディングの一部分は、CoEditor.C ファイルから引用しています。このファイルには、エディタ・アプリケーション用の特定コマンドが入っています。詳細なソースコードについては、付録 B 「CoEd デモンストレーション・プログラム」 を参照してください。


変更、復元、または保存オペレーションの要求

次のコーディングの一部分は、保留中の変更があるかどうかファイルに尋ねているものです。

// Does the file have any changes pending?
_modifiedByOther = ttdt_Get_Modified( _contract, _file, TT_BOTH,
                                      10 * timeOutFactor );

次のコーディングの一部分は、ファイルを最後のバージョンの内容に復元します。

// Revert file to last version 
status = ttdt_Revert(_contract, _file, TT_BOTH, 10 * timeOutFactor );

次のコーディングの一部分は、ファイルに対して保留中の変更を保存します。

// Save pending changes 
status = ttdt_Save( _contract, _file, TT_BOTH, 10 * timeOutFactor );

ファイルの変更、復元、または保存時の通知

次のコーディングの一部分は、アプリケーションがファイルに対して保留中の変更を持っていることを配信対象のツールに通知します。

// File has been modified 
ttdt_file_event( _contract, TTDT_MODIFIED, _filePats, 1 );

次のコーディングの一部分は、アプリケーションがファイルを最後に保存されたバージョンの内容に復元してあることを配信対象のツールに通知します。

// File has been reverted to last version 
ttdt_file_event( _contract, TTDT_REVERTED, _filePats, 1 );

次のコーディングの一部分は、アプリケーションがファイルに対して保留中の変更を保存してあることを配信対象のツールに通知します。

// File has been saved 
ttdt_file_event( _contract, TTDT_SAVED, _filePats, 1 );

ファイルの終了

次のコーディングの一部分は、ファイルに関する ToolTalk イベントの配信対象を登録解除し、パターンを破棄します。

// Unregister interest in ToolTalk events and destroy patterns 
status = ttdt_file_quit( _filePats, 1 );
        _filePats = 0;