Solaris 共通デスクトップ環境 プログラマーズ・ガイド

第 9 章 データ型データベースのアクセス

この章では、データ型関数とデータ型データベースの使い方について説明します。

要約

データ型により、従来の UNIX ファイル・システムによって提供される機能を越えて、ファイルとデータの属性が拡張されます。これらの拡張は、アイコン名、記述、アクションなどの属性から成っており、ファイルがデータ上で実行できます。この情報は、DATA_ATTRIBUTES テーブル (またはデータベース) に名前と値の対として格納されます。デスクトップは、次のパラグラフで説明する特定の DATA_ATTRIBUTES のセットを使用します。DATA_ATTRIBUTES テーブルは、将来およびアプリケーション固有の成長のために拡張可能ですが、他のアプリケーションでは追加をチェックできないので、このテーブルを拡張することは推奨しません。

データを、特定のファイルまたは DATA_CRITERIA テーブルのデータ・エントリに一致させます。DATA_CRITERIA テーブルのエントリは、具体性が高いものから具体性が低いものへ降順で並べられます。たとえば、/usr/lib/lib* は /usr/* よりも具体的なので、/usr/* より前に置かれます。ファイルまたはデータの型の検査が要求されると、このテーブルが始めから順にチェックされ、ファイルまたはデータから与えられた情報を使用して最も一致するものが検索されます。情報に一致するエントリが見つかると、DATA_ATTRIBUTES_NAME を使用して、正しい DATA_ATTRIBUTES エントリが検索されます。

アプリケーションがデスクトップと同じ方法でデータ・オブジェクト (ファイルまたはデータ・バッファ) をユーザに提示するようにする場合は、DtDts* API を使用して、データ・オブジェクトの表示方法とデータ・オブジェクトの操作方法を指定します。たとえば、アプリケーションは、ICON 属性に対して DtDtsDataTypeToAttributeValue() 関数を呼び出すことによって、データ・オブジェクトを表すアイコンを判断できます。

ライブラリとヘッダ・ファイル

データ型を使用するには、libDtSvc ライブラリをリンクしてください。アクションは、通常はデータ型情報と一緒に読み込まれます。アクションは、libXm ライブラリと libX11 ライブラリのリンクを必要とします。ヘッダ・ファイルは、Dt/Dts.h と Dt/Dt.h です。

デモ・プログラム

データ型データベースの使用例が入っているデモ・プログラムが、/usr/dt/examples/dtdts/datatypes/datatyping.c にあります。

データの基準とデータの属性

データ型検査は、次の 2 つの部分から成ります。

データ基準の属性は、次のとおりです (アルファベット順)。

データの基準を使用頻度が高いものから順に表 9-1 に示します。

表 9-1 データの基準 (使用頻度順)

基準 

説明 

使用例 

DATA_ATTRIBUTES_NAME

このデータ型の名前。この値は、データ属性テーブルの中の record_name です。

POSTSCRIPT 

NAME_PATTERN

このデータに一致するファイル名を記述するシェル・パターン照合表現。デフォルトは空の文字列で、照合の際にファイル名のパターンを無視することを意味します。 

*.ps

CONTENT

ファイル・ユーティリティが使用し、マジック・ファイルの開始、型、および値のフィールドとして解釈される 3 つの値。詳細は、file(1) のマニュアル・ページを参照してください。デフォルトは空のフィールドで、照合の際に内容を無視することを意味します。一致する型の例としては、文字列、バイト、ショート、ロング、およびファイル名があります。

0 string !%

MODE

stat 構造体のモード・フィールドに一致する 0 〜 4 文字の文字列。詳細は、stat(2) のマニュアル・ページを参照してください。最初の文字は、次のとおりです。

 

d は、ディレクトリに一致します。

s は、ソケットに一致します。

l は、シンボリック・リンクに一致します。

f は、通常ファイルに一致します。

b は、ブロック・ファイルに一致します。

c は、文字型特殊ファイルに一致します。

f&!x

 

 

 

次の文字は、最初または後続の文字にできます。 

 

r は、ユーザ、グループ、またはその他の読み取り権ビットが設定されたファイルに一致します。

w は、ユーザ、グループ、またはその他の書き込み権ビットが設定されたファイルに一致します。

x は、ユーザ、グループ、またはその他の実行あるいはディレクトリ検索のアクセス権ビットが設定されているファイルに一致します。

 

 

 

たとえば、frw の MODE フィールドは、読み取り可能または書き込み可能な通常ファイルに一致します。x は、実行可能なビットまたは検索ビットが設定されたファイルに一致します。

デフォルトは空のフィールドで、照合の際にモードを無視することを意味します。 

 

PATH_PATTERN

このデータに一致する絶対パス名を記述するシェル・パターン照合式。デフォルトは空の文字列で、照合の際にパス・パターンを無視することを意味します。 

*/mysubdir /*

LINK_NAME

dtdtsfile(4) のマニュアル・ページを参照してください。

LINK_PATH

dtdtsfile(4) のマニュアル・ページを参照してください。

データ型の一般的な属性のいくつかをアルファベット順に示します。

これらのデータの属性を使用頻度が高い順に表 9-2 に示します。

表 9-2 データの属性 (使用頻度順)

基準 

説明 

使用例 

DESCRIPTION

人間が読める形式で書かれたデータの説明。このフィールドが NULL か、データ属性レコードに含まれていない場合は、データ属性名が使用されます。

This is a PostScript page description. 

ICON

このデータに対して使用されるアイコン名。このフィールドが NULL か、データ属性レコードに含まれていない場合は、標準のアイコンが使用されます。アイコンの命名の詳細は、dtdtsfile(4) のマニュアルページを参照してください。

Dtps

PROPERTIES

このデータの属性を示すキーワード。有効な値は、見える場合と見えない場合があります。このフィールドが NULL か、データ属性レコードに含まれていない場合は、可視属性とみなされます。これは、ファイルをユーザから完全に隠したい場合に使用します。

invisible

ACTIONS

このデータに対して実行できるアクションのリスト。このリストは、この型のオブジェクトに対してユーザに提示されるアクションのアクション・テーブル内の名前を参照します。このフィールドが NULL か、データ属性レコードに含まれていない場合は、どのアクションも使用できません。

Open,Print

NAME_TEMPLATE フィールド

 

この型のデータの新規ファイル作成に使用される文字列。文字列は、ファイル名と共に 1 つの引き数として sprintf(3) に渡されます。デフォルトは空です。このフィールドをデータ抽出条件テーブルの NAME_PATTERN フィールドと比較してみてください。テンプレートは %s.c など、特定のファイルを作成するために使用されますが、パターンは *.c などのファイルを検索するために使用されます。

%s.ps

IS_EXECUTABLE フィールド

このデータ型をアプリケーションとして実行できることをユーザに知らせる文字列論理値。IS_EXECUTABLE に true が設定されている場合 (DtDtsIsTrue() 参照)、データは実行可能です。このフィールドが NULL かデータ属性レコードに含まれていない、または true に設定されていない場合は、データは実行可能ではないとみなされます。

true 

MOVE_TO_ACTION

オブジェクトが現在のオブジェクトに移動されるときに実行されるアクション名 

FILESYSTEM_MOVE

COPY_TO_ACTION

オブジェクトが現在のオブジェクトにコピーされるときに実行されるアクション名 

FILESYSTEM_COPY

LINK_TO_ACTION

オブジェクトが現在のオブジェクトにリンクされるときに実行されるアクション名 

FILESYSTEM_LINK

IS_TEXT

このデータ型がテキスト・エディタまたはテキスト・ウィジェットでの操作 (表示または編集) に適していることをユーザに知らせる文字列論理値。データが本来はテキストである場合や、ユーザに対してテキスト形式で表示される場合、IS_TEXT フィールドには true が設定されます (DtDtsIsTrue() 参照)。その基準は、データが人間の言語から成るものか、手動で生成および管理されているか、テキスト・エディタでの表示と編集が可能か、構造体と書式の情報をまったく (あるいはごくわずかしか) ないかどうかという点から決定されます。

詳細な例については、表 9-3 を参照してください。

 

IS_TEXT フィールドが true の場合、データはアプリケーションから直接表示できます。すなわち、アプリケーションは XmText などのテキスト編集ウィジェットにデータを直接読み込むことができます。

 

MEDIA フィールド

MEDIA ネーム・スペース名は、データそのものの形式について記述します。MEDIA 名は、ICCCM 選択ターゲットとして使用され、データ型レコードの MEDIA フィールドで名前が付けられ、ToolTalk メディア交換メッセージの型パラメータの中で使用されます。

 

MEDIA ネーム・スペースは、ICCCM によって定義された選択ターゲット・アトムのネーム・スペースのサブセットです。データ書式を指定する選択ターゲットは、すべて有効な MEDIA 名です。有効な MEDIA 名は選択ターゲットとして直接使用できます。データ書式ではなく、選択の属性 (たとえば、LIST_LENGTH) や発生する副作用 (たとえば、DELETE) を指定する選択ターゲットもあります。これらの属性選択ターゲットは、MEDIA ネーム・スペースの一部ではありません。

POSTSCRIPT

MIME_TYPE

MEDIA は、デスクトップ内部にあり、データ型を表す一意の名前です。ただし、外部の他の命名組織もネーム・スペースを設定しています。MIME RFC で述べられている Multipurpose Internet Message Extensions (MIME)は、そのような外部登録の 1 つであり、デスクトップ・メール・プログラムのための標準的なネーム・スペースです。

application/postscript

X400_TYPE

X.400 型は、構造は MEDIA 型に似ていますが、異なる規則を使用して書式化され、異なる命名組織を持ちます。

1 2 840 113556 3 2 850

INSTANCE_ICON フィールド

データのインスタンスのために使用されるアイコン名で、通常は %name%.icon などの値 (dtdtsfile(4) のマニュアル・ページの「バグ」も参照)。INSTANCE_ICON が設定されている場合は、アプリケーションは ICON の代わりに使用しなければなりません。このフィールドが NULL か、データ属性レコードに含まれていない場合は、ICON フィールドが使用されます。

/myicondir/%name%.bm

DATA_HOST

DATA_HOST 属性は、*.dt ファイルのデータ属性テーブルに追加できるフィールドではありませんが、テーブルから属性を読み込むアプリケーションに返すことができます。データ型検査サービスはこの属性を自動的に追加して、データ型の読み込み元のホスト・システムを示します。このフィールドが NULL か、データ属性レコードに含まれていない場合、データ型はローカル・システムから読み込まれています。

 

IS_TEXT フィールドは、MIME_RFC で述べられている MIME コンテント・タイプである MIME_TYPE フィールドのテキスト属性とは異なります。MIME コンテント・タイプから、データがテキスト文字とバイト値のどちらで作成されているかがわかります。データがテキスト文字で作成され、データに text/* というラベルが付けられている場合、IS_TEXT フィールドはテキスト形式でユーザに表示するのに適したデータかどうかを判別します。

さまざまな MIME_TYPE属性での IS_TEXTの使用例を表 9-3 に示します。

表 9-3 IS_TEXT 属性の例

説明と MIME_TYPE 属性 

IS_TEXT 値 

ASCII でコード化された人間の言語 (MIME_TYPE text/plain)

IS_TEXT true

*EUC、JIS、Unicode、または ISO ラテン文字セットにコード化された人間の言語 (MIME-TYPE text/plain; charset=XXX)

IS_TEXT true

カレンダ・アポイント (MIME_TYPE text/plain)

IS_TEXT false

ハイパーテキスト・マークアップ言語 (HTML) (MIME_TYPE text/html)

IS_TEXT true

PostScript (MIME_TYPE application/postscript)

IS_TEXT false

C プログラム・ソース (C_SRC) (MIME_TYPE text/plain)

IS_TEXT true

ビットマップとピックスマップ (XBM と XPM) (MIME_TYPE text/plain)

IS_TEXT false

デスクトップ・アプリケーション・ビルド・サービスのためのプロジェクトまたはモジュール・ファイル (MIME_TYPE text/plain)

IS_TEXT false

シェル・スクリプト (MIME_TYPE text/plain)

IS_TEXT false

uuencode(1) によって生成されたコード化テキスト (MIME_TYPE text/plain)

IS_TEXT false

*MIME_TYPE text/plain

IS_TEXT false

データ型属性の詳細は、dtdtsfile(4) のマニュアル・ページを参照してください。

データ型関数

データ・オブジェクトの属性を調べるには、まずオブジェクトの型を判断し、その型の適切な属性値を求めなければなりません。データベースにデータ情報を問い合わせるための関数を表 9-4 に示します。セクション 3 にこれらの関数のマニュアル・ページがあります。詳細は、該当するマニュアル・ページを参照してください。

表 9-4 データ型データベース問い合わせ関数

関数 

説明 

DtDtsBufferToAttributeList()

指定バッファのデータ属性のリストを検索します。 

DtDtsBufferToAttributeValue()

指定バッファのデータ属性を検索します。 

DtDtsBufferToDataType()

指定バッファのデータ型名を検索します。 

DtDtsDataToDataType()

指定データ・セットのデータ型を検索します。 

DtDtsDataTypeIsAction()

結果として保存されたディレクトリのデータ型を返します。 

DtDtsDataTypeNames()

使用可能なデータ型のリストを検索します。 

DtDtsDataTypeToAttributeList()

指定データ属性名の属性リストを検索します。 

DtDtsDataTypeToAttributeValue()

指定データ属性名の属性値を検索します。 

DtDtsFileToAttributeList()

指定ファイルのデータ属性のリストを検索します。 

DtDtsFileToAttributeValue()

指定ファイルのデータ属性値を検索します。 

DtDtsFileToDataType()

指定ファイルのデータ型を検索します。 

DtDtsFindAttribute()

属性 name が value に一致するデータ型のリストを検索します。

DtDtsFreeAttributeList()

指定属性リストのメモリを解放します。 

DtDtsFreeAttributeValue()

指定属性値のメモリを解放します。 

DtDtsFreeDataType()

指定データ型名のアプリケーション・メモリを解放します。 

DtDtsFreeDataTypeNames()

DtDtsDataTypeNames() または DtDtsFindAttribute() を呼び出して作成されたメモリを解放します。

DtDtsIsTrue()

文字列を論理値に変換する簡易関数 

DtDtsRelease()

一般的には再読み込みの準備として、データ型データベース情報の読み込みを解除します。 

DtDtsSetDataType()

指定されたディレクトリのデータ型を設定します。 

DtsLoadDataTypes()

データ型関数のためにデータベース・フィールドを初期化し、読み込みます。アクションまたはアクション型を使用する必要がなく、パフォーマンスを向上させたい場合は、DtDbLoad() の代わりに使用します。アクションを使用する必要がある場合は DtDbLoad() を使用します。

データ型を検査して属性を検索するには、簡易、中間、拡張の 3 つの方法があります。

簡易データ型検査

データ型を検査するための最も簡単な方法は、次の関数を使用することです。

これらの関数を使用すると、ファイルの型が検査され、単一の属性またはリスト全体が検索されます。システム・コールが行われ、データ型の検査と属性の検索が行われます。次の関数は、中間データ型検査関数を呼び出します。

バッファは、読み取り権/書き込み権を持つ通常ファイルに一致するモードを持つと想定されます。読み取り専用バッファの型の検査については、「拡張データ型検査」を参照してください。

中間データ型検査

データの型を検査して属性を検索する場合、プロセスのデータ型検査部分は、パフォーマンスの点で最もコストがかかります。データ型の検査を 2 番目の方法で行うと、データ型検査のための関数と属性検索のための関数を切り離すことによって、パフォーマンスを改善できます。中間データ型検査には、次の関数を使用します。

アプリケーションが複数の属性値を問い合わせる場合には、これらの関数を使用します。これらの関数を使用すると、オブジェクトの型が検査され、その型を使用して属性リストから 1 つ以上の属性を検索します。

データ型検査と属性の検索を行うには、中間データ型関数を使用するようにしてください。これらの関数は、拡張データ型関数を呼び出し、バッファについて簡易データ型検査と同様に想定します。

拡張データ型検査

拡張データ型検査では、システム・コール、データ型、さらには属性検索も別々に行われます。拡張データ型検査では、あらかじめ初期化されてデータ型関数の一部としては含まれない既存のシステム・コールからのデータを使用するので、コード化が複雑になります。拡張データ型検査には、次の関数を使用してください。

DtDtsDataToDataType()

読み取り専用バッファの型を検査するには、st_mode フィールドが S_IFREG | S_IROTH |S_IRGRP | S_IRUSR に設定された stat 構造体が渡されなければなりません。

アクションであるデータ型 (DtDtsDataTypeIsAction)

データベースが読み込まれるとアクションの検査ができるようになるため、データベースの各アクションに対して合成データ型が生成されます。これらのデータ型は、次の 2 つの追加の属性を持つことができます。

ドロップ領域としてのオブジェクトの登録

アプリケーションがデータ型を定義する場合は、次の手順に従ってプログラマが意図したドラッグ & ドロップ動作のすべてが提供されているか確認してください。

  1. アプリケーションの中で、データ型を定義する必要があるかどうかを指定します。

  2. 定義する各データ型について、関連するオブジェクトをドロップ領域にするかどうかを指定します。

  3. ドロップ領域として登録する各オブジェクトについて、どの操作 (移動、コピー、またはリンク) を定義するかを指定します。

  4. 各オブジェクトに対して有効なドロップ操作について、適切なドロップ・アクションを定義します (MOVE_TO_ACTION、COPY_TO_ACTION、および LINK_TO_ACTION 属性を設定してください)。

アプリケーションがデータ・オブジェクトのアイコンを表示する場合、それらのアイコンをドロップ領域としてサポートしなければならないこともあります。その場合、MOVE_TO_ACTION、COPY_TO_ACTION、または LINK_TO_ACTION 属性を問い合わせて、それらのデータ・オブジェクトのドロップ動作を指定する必要があります。対応する属性値が NULL でない場合だけ、オブジェクトはドロップ操作をサポートしなければなりません。3 つの属性すべてが NULL の値を持つ場合、オブジェクトはドロップ領域として登録されません。データ型が定義されているオブジェクトの属性を最低 1 つでも設定すると、アプリケーションはそのオブジェクトをドロップ領域として登録できます。

ユーザがオブジェクトをドロップ領域にドラッグすると、アプリケーションはドロップを行うためにどのジェスチャ (すなわち、どのドラッグ操作) が使用されたかを判断します。ドラッグ操作とドロップ領域のデータ型に基づいて、アプリケーションはデータ型データベースからドロップ属性を検索します。次に、DtActionInvoke を呼び出して、次の 2 つの規則によってパラメータを判断します。

  1. ユーザがオブジェクト A と B をオブジェクト C 上にドロップした場合は、C、A、B を args として DtActionInvoke を呼び出します。action は、C の MOVE_TO_ACTION、COPY_TO_ACTION、LINK_TO_ACTION のいずれかの値です。オブジェクト C がアクションの場合、args リストは C を含みません。また、action は C です。

ファイル・マネージャとそのディレクトリおよびフォルダ・オブジェクトは、デスクトップが移動、コピー、およびリンクされたドロップ属性を使用する方法を示す例となります。ユーザは、オブジェクト (ファイル) をディレクトリ・フォルダへドラッグ & ドロップできます。ファイル・マネージャは、フォルダ・オブジェクトに対して、MOVE_TO_ACTION、COPY_TO_ACTION、および LINK_TO_ACTION アクションを定義します。これらのアクションは、適切なファイル・システムの移動、コピー、およびリンクのためのシステム関数を実行します。

MOVE_TO_ACTION、COPY_TO_ACTION、および LINK_TO_ACTION 属性の定義の例については、/usr/dt/appconfig/types/C/dtfile.dt を参照してください。ドラッグ & ドロップの使用方法の詳細は、第 5 章「ドラッグ & ドロップとの統合」を参照してください。

データ型データベースの使用例

この節では、データ型検査のコード例を示します。このコード例は、/usr/dt/examples/dtdts/datatyping.c にあります。このサンプル・コードは、渡された各ファイルのデータ型、アイコン名、およびサポートされるアクションを示します。dtaction クライアントを使用して、サポートされているアクションをファイルで実行することもできます。datatyping の使い方は、次のとおりです。

datatyping file1 [file2 ...] 
#include <Xm/Form.h> 
#include <Xm/Text.h> 
#include <Dt/Dts.h> 

#define ApplicationClass "DtDatatyping"  

static Widget text;  

static void DisplayTypeInfo(int, char**);  

int main(int argc, char **argv) 
{
     XtAppContext appContext;
     Widget toplevel, form;
     Arg args[20];
     int n;

     toplevel = XtAppInitialize(&appContext, ApplicationClass,
 	  NULL, 0,
         argc, argv, NULL, NULL, 0);

     if (argc == 1) {
         printf("%s: No files specified.¥n", argv[0]);
         exit(1);
     }

     form = XmCreateForm(toplevel, "form", NULL, 0);
     XtManageChild(form);
     n = 0;
     XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
     XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
     XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
     XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
     XtSetArg(args[n], XmNeditable, False); n++;
     XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
     XtSetArg(args[n], XmNrows, 25); n++;
     XtSetArg(args[n], XmNcolumns, 90); n++;
     text = XmCreateScrolledText(form, "text", args, n);
     XtManageChild(text);

     XtRealizeWidget(toplevel);
 	  if (DtAppInitialize(appContext, XtDisplay(toplevel), toplevel, argv[0],
                                                 ApplicationClass) == False) {
         printf("%s: Couldn't initialize Dt¥n", argv[0]);
         exit(1);
     }

     DtDbLoad();

     DisplayTypeInfo(argc, argv); 

     XtAppMainLoop(appContext); 
}  

static void DisplayTypeInfo(int argc, char **argv) 
{
     char *file;
     char *datatype;
     char *icon;
     char *actions;
     char str[100];
     int i;

     sprintf(str, "%-30s¥t%-10s¥t%-8s¥t%-20s¥n",
                 "File",
                 "DataType",
                 "Icon",
                 "Actions");
     XmTextInsert(text, XmTextGetLastPosition(text), str);

     sprintf(str, "%-30s¥t%-10s¥t%-8s¥t%-20s¥n",
                 "-------------------",
                 "--------",
                 "----",
                 "-------");
     XmTextInsert(text, XmTextGetLastPosition(text), str);

      for(i=1; i < argc; i++) {
         char *file = argv[i];

         /* find out the Dts data type */
         datatype = DtDtsFileToDataType(file);

         if(datatype) {
             /* find the icon attribute for the data type */
             icon = DtDtsDataTypeToAttributeValue(datatype,
				 		 DtDTS_DA_ICON, file);
         }

  	 /*  Directly find the action attribute for a file */

          actions = DtDtsFileToAttributeValue(file,
 			 DtDTS_DA_ACTION_LIST);
          sprintf(str, "%-30s¥t%-10s¥t%-8s¥t%s¥n",
                         file,
                         datatype?datatype:"unknown",
                        icon?icon:"unknown",
                         actions?actions:"unknown");
         XmTextInsert(text, XmTextGetLastPosition(text), str);

         /* Free the space allocated by Dts */

         DtDtsFreeAttributeValue(icon);
         DtDtsFreeAttributeValue(actions);
         DtDtsFreeDataType(datatype);     
}