高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1188

Packages in Mac OS 9


目次

オーバービュ

パッケージフラグについて

ルート階層のエイリアスファイル

パッケージの主要ファイル

その他のサポートファイルについて

Open Document イベントのオプションパラメータ

パッケージの互換性に関する注意

このテクニカルノートは Mac OS 9 で Finder が新たにサポートするパッケージ機能の実装方法について解説します。このテクニカルノートの内容をもとにすれば、デベロッパは Mac OS 9 用のパッケージを作成することができます。Mac OS 9 パッケージは Finder でわかりやすいユーザインタフェースを提供すると同時に、アプリケーションが必要とする各種サポートファイルをユーザが誤って変更できない利点もあります。

このテクニカルノートに記述されている Mac OS 9 パッケージの仕様に加えて、Mac OS X パッケージの仕様を今後公開する予定です。デベロッパは Mac OS X パッケージの仕様が公開された時点で Mac OS 9 と Mac OS X の両方をターゲットとしたパッケージを作成することができるようになります。



オーバービュ

Mac OS 9 パッケージは決して複雑なものではありません。簡単に定義すると、Mac OS 9 パッケージとは“パッケージフラグ”が“入”となっていて、ルート階層に一つのエイリアスが存在するフォルダのことです。典型的なパッケージは1つのアプリケーションとサブディレクトリに入ったサポートファイルから成り立ちます。パッケージは上記の条件さえ守れば、中のサブディレクトリ構造や名称は制限がありません。図1では“SimplePlot”と言う典型的なパッケージを紹介します。



Figure 1

図1 典型的なパッケージディレクトリ構造



Mac OS 9 ではパッケージの条件は少ないですが、図1でも記されているように、Finder フラグが“入”になっていることとパッケージディレクトリのルート階層に一つの相対的エイリアスが存在することが必須です。

トップに戻る



パッケージフラグについて

パッケージを包含するフォルダは frFlags の13番目のビット(13番目のビットはファイルの hasBundle ビットに相当します)が“入”となっています。ファイルの場合、13番目のビットは“バンドルビット”と呼ばれ、そのファイルが Finder でアイコンを表示するための 'BNDL' リソースを持っていることを示します。Finder の 'BNDL' リソースについては Inside Macintosh: Macintosh Toolbox EssentialsFinder Interface の章をご覧下さい。

Mac OS 9 では、パッケージフラグが“入”となっているフォルダはすべてパッケージとして認識されます。パッケージフラグが“入”で、しかもルート階層にエイリアスが1つだけ存在するフォルダは Finder でパッケージとして扱われます。

システムクラッシュやソフトウェアが問題を起こした後に、パッケージではないにも関わらず、フォルダのパッケージビットが稀に“入”となってしまうことが考えられます。このようなフォルダは Finder で壊れているパッケージとして扱われ、種類は“パッケージ”、アイコンは白紙の書類として表れます。この問題は Mac OS 9 インストール CD に含まれている Package First Aid ユーティリティを使用することで解決できます。

トップに戻る



ルート階層のエイリアスファイル

パッケージのフォルダはルート階層にエイリアスファイルを1つだけ持ちます。このエイリアスはパッケージのディレクトリ構造内のどれかのファイルを参照します。エイリアスはパッケージが異なるボリュームにコピーされた場合でも有効にするために、相対的パスで指定します。このテクニカルノートでは、ルート階層のエイリアスが参照するファイルを“主要ファイル”と呼びます。

互換性に関する注意
図1の例では、ルート階層のエイリアスはアプリケーションを指していますが、パッケージの主要ファイルがアプリケーションである必要はありません。書類パッケージ、ライブラリパッケージなど、様々なパッケージを作成することができます。しかし、Mac OS 9 のパッケージ機能は主にアプリケーション向けとして開発されました。

Finder ウインドウ内に表れるパッケージの属性は主要ファイルの属性よって決まります。Finder は主要ファイルの 'BNDL''FREF'、アイコンリソースがいかにもパッケージ自体に含まれているような動作をします。

例えば、Finder でファイルをパッケージアイコンの上にドラッグした場合、そのパッケージの主要ファイルの上にドラッグした時とまったく同じように動作をします。仮に図1の SimplePlot が 'BNDL' リソースで 'PLOT' 形式のファイルが開けることを指定するとします。その場合、

  1. Finder は 'PLOT' 形式のファイルを SimplePlot パッケージにドロップすることを許します。また、ドラッグ中はアイコンが正しくハイライトされます。

  2. ユーザが 'PLOT' 形式のファイルを SimplePlot パッケージにドロップすれば、SimplePlot アプリケーションが既に起動していなければ、Finder は SimplePlot アプリケーションを起動させ、“Open Documents”Apple イベントを送信して、ドロップされたファイルを開きます。

パッケージに必要な相対的エイリアスファイルは2つの作成方法があります。1つは手動で Finder の“エイリアスを作る”コマンドを利用する方法です。2つ目は下記サンプルコードのように Resource Manager や Alias Manager を使用する方法です。



/* MakeRelativeAliasFile は targetFile を参照するエイリアスファイルを
   aliasDest に作成します。エイリアスは相対的パスで指定されます。 */
    
OSErr MakeRelativeAliasFile (FSSpec *targetFile, FSSpec *aliasDest) {
    FInfo fndrInfo;
    AliasHandle theAlias;
    Boolean fileCreated;
    short rsrc;
    OSErr err;
        /* ローカル変数の準備 */
    theAlias = NULL;
    fileCreated = false;
    rsrc = -1;
        /* エイリアスファイルのファイル情報の準備 */
    err = FSpGetFInfo (targetFile, &fndrInfo);
    if (err != noErr) goto bail;
    if (fndrInfo.fdType == 'APPL')
        fndrInfo.fdType = kApplicationAliasType;
    fndrInfo.fdFlags = kIsAlias; /* inited フラグを“オフ”にする */
        /* 新しいファイルを作成します */
    FSpCreateResFile (aliasDest, 'TEMP', 'TEMP', smSystemScript);
    if ((err = ResError ()) != noErr) goto bail;
    fileCreated = true;
        /* 新しいファイルのファイル情報を指定します */
    err = FSpSetFInfo (aliasDest, &fndrInfo);
    if (err != noErr) goto bail;
        /* 相対的エイリアスレコードの作成 */
    err = NewAlias (aliasDest, targetFile, &theAlias);
    if (err != noErr) goto bail;
        /* リソースの保存 */
    rsrc = FSpOpenResFile (aliasDest, fsRdWrPerm);
    if (rsrc == -1) { err = ResError (); goto bail; }
    UseResFile (rsrc);
    AddResource ((Handle) theAlias, rAliasType, 0, aliasDest->name);
    if ((err = ResError ()) != noErr) goto bail;
    theAlias = NULL;
    CloseResFile (rsrc);
    rsrc = -1;
    if ((err = ResError ()) != noErr) goto bail;
        /* 完了 */
    return noErr;
bail:
    if (rsrc != -1) CloseResFile(rsrc);
    if (fileCreated) FSpDelete(aliasDest);
    if (theAlias != NULL) DisposeHandle((Handle) theAlias);
    return err;
}

相対的パスでエイリアスを作成するサンプルコード


パッケージを自動的に生成する仕組みに興味のあるデベロッパは上記プログラムを参照して下さい。Finder の“エイリアスを作る”コマンドや AppleScript による作成方法もありますが、NewAlias を直接呼び出す利点は、エイリアスの作成方法や相対的パスの関連ファイルを具体的に指定することができることです。


互換性に関する注意
Finder の“エイリアスを作る”コマンドや上記サンプルコードに従ってエイリアスファイルを作成する際は、ファイル共有機能を必ず停止させて下さい。ファイル共有が働いていると、サーバ名などを含む絶対的パスのエイリアスが作成されてしまう恐れがあります。パッケージ用のエイリアスファイルを作成する前にファイル共有機能を“オフ”にして下さい。

トップに戻る



パッケージの主要ファイル

Finder のウインドウ内では、パッケージはいかにもファイルまたはアプリケーションであるかのような降るまいをします。また、パッケージアイコンの属性は主要ファイルから引き継がれます。図2のように、主要ファイルはルート階層にあるエイリアスファイルが参照するファイルのことです。



Figure 2

図2 パッケージの主要ファイル



例えば、主要ファイルがアプリケーションの場合、パッケージはアプリケーションのような降るまいをします。主要ファイルが書類の場合、パッケージは書類のような降るまいをします。パッケージの目に見える属性の多くは主要ファイルから引き継がれます。パッケージが主要ファイルから受け継ぐ属性は以下の通りです。

  • パッケージのアイコン

  • パッケージの種類(アプリケーションや書類など)

  • Finder で“情報を見る”を選んだ時の情報(ただし、パッケージの容量はパッケージの中に含まれているすべての項目の合計となります。また、パッケージの中に含まれている項目の数は表示されません。)

  • ドラッグ & ドロップ情報

  • kIsStationerykHasCustomIcon Finder フラグは主要ファイル側の設定が使用されます。他の Finder フラグ(kIsInvisiblekNameLockedkHasBeenInitedkHasBundlekColor)はパッケージフォルダ側の設定が使用されます。

以下の2点は主要ファイルから受け継ぎません。

  • パッケージの容量は主要ファイル単体の容量ではなく、パッケージフォルダ内のすべての項目の合計となります。

  • パッケージの名称と主要ファイルの名称は必ずしも一致しません。ユーザは主要ファイルに影響を与えることなく、パッケージの名称を自由に編集することができます。

アプリケーションパッケージ(主要ファイルがアプリケーションであるパッケージ)は通常のアプリケーションと同じように Finder でドラッグ & ドロップ操作に応じます。ドラッグ & ドロップの動作はパッケージの主要ファイルによって決まり、ドロップを受け付けた場合は適切な Apple イベントが主要ファイルに送信されます。

トップに戻る



その他のサポートファイルについて

パッケージの最も重要な機能は数々のサポートファイルをアプリケーションと一緒に扱うことにあります。デベロッパはパッケージを作ることで、アプリケーションが必要とするファイルをグループ化し、そのアプリケーションを Finder で扱いやすくします。また、アプリケーションの必要とするファイルを誤って削除したり、移動させてしまう心配もありません。

互換性に関する注意
現在システムフォルダにサポートファイルをインストールしているデベロッパは Mac OS 9 でアプリケーションと一緒にパッケージ化することをお勧めします。

パッケージはサポートファイルやライブラリなど、複雑なディレクトリ階層や多数のファイルを含むことができます。また、1つのパッケージの中に複数の補助的な役割のアプリケーションが存在することも考えれらます。図1ではアプリケーションの使用するライブラリ、AppleScript ファイル、ヘルプファイルなど、数々のサポートファイルがあることがわかります。

トップに戻る



Open Document イベントのオプションパラメータ

アプリケーションパッケージは 'odoc' Apple イベントを受け取る時に、'fdpl'(Finder package document list)と言うキーのオプションパラメータが追加される場合があります。このパラメータはパッケージの中にあるファイルを開く時に追加されるものです。パッケージの中のファイルは以下のように開かれることがあります。

  • ユーザが Mac OS 9 以前でパッケージを開き、パッケージ内のファイルのエイリアスを作成し、パッケージの外に置いて、Mac OS 9 に移行してからそのエイリアスを開こうとした場合。

  • 他のアプリケーションが Finder に対して、パッケージ内のファイルを開くよう Apple イベントを送信した場合。

  • パッケージ内のファイルを参照するエイリアスが他のアプリケーションにドロップされた時。この場合、ドロップの対象となったアプリケーションではなく、パッケージのアプリケーションが起動され、エイリアスの参照するファイルが 'fdpl' として Open Document Apple イベントの形で送信されます。

いずれの場合も、Finder は通常と異なった方法で選択項目を開きます。Finder は開く項目を 'fpdl' パラメータとして、Open Document Apple イベントの形でパッケージのアプリケーションに送信します。'fpdl' パラメータはファイルエイリアスのリストですが、この構造は keyDirectObject と同じです。'fpdl'keyDirectObject の唯一の違いは、'fpdl' がパッケージフォルダ内のファイルやフォルダを参照することです。

Open Document イベントハンドラはイベントパラメータを以下の3通りの組み合わせで対応する必要があります。

  • 'fpdl' パラメータの存在しない Open Document イベント。

  • keyDirectObject の書類リストは空であるが、'fpdl' パラメータが書類リストを含む場合の Open Document イベント。

  • keyDirectObject が書類リストを含み、'fpdl' パラメータも書類リストを含む場合の Open Document イベント。

主要アプリケーションの Open Document イベントハンドラは常に 'fpdl' オプションパラメータをチェックし、存在する場合は適切に処理する必要があります。最低でも、開こうとしているファイルがパッケージ内のものである都度をエラーとしてユーザに通知する必要があります。場合によっては他の処理が適切かもしれません。例えば、'fpdl' パラメータがパッケージ内のヘルプファイルを参照している場合、そのヘルプファイルを開くことが適切かもしれません。

トップに戻る



パッケージの互換性に関する注意

Mac OS 9 ではパッケージを共有することができません。

StandardFile ダイアログ類はパッケージに対応していません。その結果、ユーザはパッケージの中身が見えたり、パッケージ内部へ書類を保存することができます。Navigation Services はパッケージに対応していますので、具体的にパッケージの内容を見せるための指定をしないかぎり、ユーザはパッケージの中をのぞくことはできません。

トップに戻る




更新: 1999年10月11日