ToolTalk ユーザーズガイド

オブジェクト仕様の管理

ToolTalk サービスでは、オブジェクト仕様の検査、比較、照会、および移動を行う関数を提供しています。表 12-2 に、オブジェクト仕様を管理するために使用する ToolTalk 関数を示します。

表 12-2 オブジェクト仕様を管理する関数

返される型 

ToolTalk 関数 

説明 

char *

tt_spec_file(const char *objid)

仕様があるファイル名 

char *

tt_spec_type(const char *objid)

仕様のオブジェクト型 

char *

tt_spec_prop(const char *objid, const char *propname, int i)

(ゼロから数えて)「i」番目のプロパティ値を文字列として検索する 

int

tt_spec_prop_count(const char *objid, const char *propname)

このプロパティ名での値の数 

Tt_status

tt_spec_bprop(const char *objid, const char *propname, int i, unsigned char **value, int *length)

このプロパティ名でのバイト配列の値の数 

char *

tt_spec_propname(const char *objid, int i)

「i 番目」のプロパティ名 

int

tt_spec_propnames_count(const char *objid)

この仕様のプロパティ数 

char *

tt_objid_objkey(const char *objid)

仕様 ID に固有のキー 

Tt_status

tt_file_objects_query(const char *filepath, Tt_filter_function filter, void *context, void *accumulator)

オブジェクト仕様用のデータベースを照会する 

int

tt_objid_equal(const char *objid1, const char *objid2)

2 つの仕様 ID が等しいかどうかを検査する 

char *

tt_spec_move(const char *objid, const char *newfilepath)

オブジェクト仕様を新しいファイルに移動する 

仕様情報の検査

指定された ToolTalk 関数によって、次の仕様情報を検査できます。

オブジェクト仕様の比較

2 つの objid を比較するには、tt_objid_equal を使用します。tt_objid_equal は、1 つの objid が他の objid に対する転送ポインタの場合でも 1 を返します。

ファイル内の特定の仕様の照会

ファイル内の特定の仕様を照会するためにフィルタ関数を作成し、対象とする仕様を取得します。

tt_file_objects_query を使って、指定されたファイル内のすべてのオブジェクトを見つけます。ToolTalk サービスは、各オブジェクトを見つけるとフィルタ関数を呼び出し、そのオブジェクトの objid とアプリケーションが与えた 2 つのポインタをそのフィルタ関数に渡します。フィルタ関数は演算をいくつか行い、Tt_filter_action の値 (TT_FILTER_CONTINUE または TT_FILTER_STOP) を返します。これは照会を続行するか、検出を終了してすぐに復帰するかを示します。

例 12-1 は、仕様リストの取得方法を示します。


例 12-1 仕様リストの取得

/*
 * Called to update the scrolling list of objects for a file. Uses
 * tt_file_objects_query to find all the ToolTalk objects.
 */
int
cntl_update_obj_panel()
{
       static int list_item = 0;
	char *file;
	int i;

	cntl_objid = (char *)0;

	for (i = list_item; i >= 0; i--) {
		xv_set(cntl_ui_olist, PANEL_LIST_DELETE, i, NULL);
	}

	list_item = 0;
	file = (char *)xv_get(cntl_ui_file_field, PANEL_VALUE);
	if (tt_file_objects_query(file,
                                     (Tt_filter_function)cntl_gather_specs,
                                   &list_item, NULL) != TT_OK) {
		xv_set(cntl_ui_base_window, FRAME_LEFT_FOOTER,
		       "Couldn't query objects for file", NULL);
		return 0;
	}

	return 1;
}


tt_file_objects_query 関数内では、アプリケーションは、オブジェクトをスクロールリストに挿入するフィルタ関数 cntl_gather_specs を呼び出します。例 12-2 に objid の挿入方法を示します。


例 12-2 objid の挿入

/*
 * Function to insert the objid given into the scrolling lists of objects
 * for a file. Used inside tt_file_objects_query as it iterates through
 * all the ToolTalk objects in a file.
 */
Tt_filter_action
cntl_gather_specs(objid, list_count, acc)
     char *objid;
     void *list_count;
     void *acc;
{
	int *i = (int *)list_count;

	xv_set(cntl_ui_olist, PANEL_LIST_INSERT, *i,
	       PANEL_LIST_STRING, *i, objid,
	       NULL);

	*i = (*i + 1);

	/* continue processing */
	return TT_FILTER_CONTINUE;
}


オブジェクト仕様の移動

objid には、仕様情報が格納された特定のファイルシステムを指すポインタが入っています。仕様によって記述されたオブジェクトと同じように仕様情報を利用できるようにするため、ToolTalk サービスは仕様情報をそのオブジェクトと同じファイルシステムに格納します。そのため、オブジェクトが移動すると、仕様も移動しなければなりません。

tt_spec_move を使用して、オブジェクトが 1 つのファイルから別のファイルにいつ移動したか (たとえば、カット&ペースト操作などで) を ToolTalk サービスに知らせます。

プロセスが古い objid にメッセージを送信する場合 (つまり、転送ポインタを持つ objid)、tt_message_send は特殊な状態コード TT_WRN_STALE_OBJID を返し、メッセージ内のオブジェクト属性を新しい場所の同じオブジェクトを指す新しい objid と置き換えます。


注 -

オブジェクトを参照する内部データ構造体は、すべて新しい objid に更新してください。