Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/6-2
6-2 リソースマネージャ
アプリケーションはデータマネージャに似た、チャンクの取得と保存に便利なリソースマネージャを利用することができます。リソースマネージャは一意なリソースタイプとリソースIDで各データチャンクをタグ付けする機能を持っています。これらのタグ付けされたチャンクはリソースと呼ばれ、リソースデータベースに保存されます。リソースデータベースは通常のデータベースとほぼ同じ構造ですが、リソースレコードあたり2バイトのわずかなストレージオーバーヘッドがあります。実際、リソースマネージャは概念的な理由のみから抽出されたデータマネージャ関数のサブセット以上のものではありません。
リソースは通常、画像やフォント、ダイアログレイアウトなど、アプリケーションのユーザーインターフェース要素を格納するために使用されます。アプリケーションの構築にはこれらのリソースを作成して実際の実行コードにマージする作業が含まれます。Palm OS の環境では、アプリケーションは実際にはシンプルなリソースデータベースであり、1つ以上のコードリソースとして保存された実行コードと、その他のリソースタイプで同じデータベースに保存された画像などのデータが含まれています。
アプリケーションはプリファレンスやウィンドウ位置、状態情報などの取得や保存にもリソースマネージャが便利であることに気付くかもしれません。これらのプリファレンスは別のリソースデータベースに保存することができます。
このセクションではリソースマネージャの使い方を説明します。以下のトピックがあります。
- リソースデータベースヘッダの構造
- リソースマネージャの使用
- リソースマネージャ関数
訳注:上記のように3つのトピックが列挙されていますが、 原著では3つ目の「リソースマネージャ関数」は [[4 節|Palm OS Programmer's Companion Volume I/6-3]]にリンクされています。
リソースデータベースヘッダの構造
リソースデータベースヘッダは、いくつかの一般的なデータベース情報とデータベース内のリソースのリストで構成されています。ヘッダの最初の部分は通常のデータベースヘッダと同じ構造になっています。リソースデータベースヘッダは attributes フィールドの dmHdrAttrResDB ビットの状態によって通常のデータベースヘッダと区別されます。
- IMPORTANT
- リソースデータベースヘッダの構造は将来変更される可能性があります。リソースデータベースを使用する場合は API を使用して下さい。
- name フィールドはリソースデータベースの名前を保持しています。
- attributes フィールドはデータベースのフラグを保持しており、dmHdrAttrResDB ビットは常にセットされています。
- データベース内のリソースが削除、追加、あるいは変更されるたびにインクリメントされる modificationNumber フィールド。これにより、アプリケーションは共有リソースデータベースが他のプロセスによって変更されたことを素早く検出できます。
- appInfoID と sortInfoID フィールドは通常リソースデータベースでは必要ありませんが、普通のデータベースと構造を同じにするために含まれています。アプリケーションは必要に応じて自由な目的にこれらのフィールドを使用できます。
- type と crerator フィールドは、そのデータベースを作成したアプリケーションが定義した 4 バイトのデータベースタイプとクリエータ情報を保持します。
- numResources フィールドはヘッダに保存されているリソース情報エントリの数を保持します。ほとんどの場合、これはリソースの数を表します。ただし、全リソース情報エントリがヘッダに収まらない場合、次のリソース情報エントリのセットを格納する resourceList のチャンクIDが nextResourceList に格納されます。
ヘッダ内の 10 バイトのリソース情報エントリは、それぞれがリソースタイプ、リソース ID、およびリソースデータを含むメモリマネージャチャンクのローカル ID を保持しています。
リソースマネージャの使用
通常のレコードベースのデータベースを作成するのに使用した関数を使って、リソースデータベースの作成、削除、オープン、クローズを行うことができます(“データマネージャの使用”を参照)。これにはデータマネージャの全てのデータベースレベル(レコードレベルではありません)の関数が含まれます。例えば DmCreateDatabase、DmDeleteDatabase、DmDatabaseInfo などです。
DmCreateDatabase を使って新しいデータベースを作成する際、作成されたデータベースの種類( レコードかリソースか )は resDB パラメータの値に依存します。このパラメータがセットされている場合、リソースデータベースが作成され、データベースヘッダの attributes フィールドに dmHdrAttrResDB ビットがセットされます。データベースヘッダ ID を使って DmDatabaseInfo をコールし、返される attributes フィールドの値の dmHdrAttrResDB ビットを検査することでそのデータベースの種類を確認することができます。
リソースデータベースがオープンされると、アプリケーションはリソースマネージャのリソースベースのアクセス関数を使用してデータベースのリソースを取得あるいは操作できます。一般に、アプリケーションは DmGetResource 関数と DmReleaseResource 関数を使用します。
DmGetResource は、指定されたタイプと ID に合致するリソースのハンドルを返します。この関数は全てのオープンされているリソースデータベースから指定されたタイプと ID を持つリソースを検索し、そのハンドルを返します。検索は最後にオープンされたデータベースから開始されます。全てのオープンされているデータベースではなく最後にオープンされたデータベースだけを検索するには、DmGet1Resource 関数をコールします。
アプリケーションがリソースデータの読み書きを終了したら、すぐに DmReleaseResource をコールします。リソースをリサイズするには、DmResizeResource をコールします。この関数はリソースのハンドルを受け取り、それを必要なら同一カード内の別のヒープに再アロケートします。この関数はリソースのハンドルを返しますが、リサイズのために別のヒープに移動する必要があった場合、ハンドルが変更されている場合があります。
その他のリソースマネージャ関数は、通常ほとんどのアプリケーションでは必要ありません。これには、リソースの属性を取得・設定する関数、リソースを別のデータベースに移動する関数、リソースをインデックス指定で取得する関数、および新しいリソースを作成する関数などが含まれます。これらの関数のほとんどはパフォーマンスの最適化のためにリソースをインデックスで指定します。リソースをインデックスで指定する場合、リソースが所属しているリソースデータベースの DmOpenRef 値を併せて指定する必要があります。タイプと ID、またはポインタを指定して全てのオープンされているリソースデータベースからリソースを検索するには DmSearchResource 関数をコールします。
オープンされているリソースデータベースの最上位の DmOpenRef を取得するには、パラメータの DmOpenRef 値に NULL を指定して DmNextOpenResDatabase をコールします。後続するそれぞれのデータベースの DmOpenRef 値を取得するには、直前の DmOpenRef 値を指定して繰り返し DmNextOpenResDatabase 関数をコールします。
特定のリソースデータベースのアクセスポインタを指定することにより、DmFindResource を使って指定されたタイプと ID を持つリソースのインデックスを取得できます。DmFindResourceType を使えば、与えられたタイプを持つ全てのリソースのインデックスを取得できます。インデックスからリソースハンドルを取得するには、DmGetResourceIndex をコールします。
データベースにどれだけのリソースが含まれているかを取得するには、DmNumResources をコールします。タイプと ID を含むリソースの属性を取得・設定するには、DmResourceInfo と DmSetResourceInfo をコールします。既存のデータチャンクを新しいリソースとしてリソースデータベースに追加するには DmAttachResource をコールします。データベースからリソースを取り外すには DmDetachResource をコールします。
新しいリソースを作成するには、DmNewResource をコールして希望のサイズ、タイプ、ID を渡します。リソースを削除するには DmRemoveResource をコールします。リソースの削除により、そのデータチャンクは破棄され、データベースヘッダからはエントリが削除されます。