Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/7-6
7-6 拡張カードのチェック
拡張カードを探す前に、プログラムはまずハンドヘルドが拡張をサポートしているかどうかを確認するべきです。そのためには、拡張マネージャとVFSマネージャの存在をチェックします。マウントされたボリュームを問合せることができるのはその後です。最終的には、プログラムはカードの機能を突きとめたいかもしれません。つまり、メモリなのか、I/O なのか、などです。以下のセクションでは、これらのステップを順に説明します。
ハンドヘルドの互換性検査
Palm OSのハンドヘルドには多くの種類があり、将来もっと増えるでしょう。セカンダリストレージをサポートする拡張スロットを有するものもあれば、そうでないものもあります。 セカンダリストレージをサポートするためのハードウェアはオプションで、ハンドヘルドによってあったりなかったりします。物理的な拡張機構を備えていないハンドヘルドでは使用されることがないため、拡張マネージャやVFSマネージャは全てのPalmハンドヘルドに搭載されるとは限らないオプションのシステム拡張になります。
ハンドヘルドの設定、およびハンドヘルドに挿入あるいは装着されるモジュールに対する最大限の柔軟性のために、アプリケーションはセカンダリストレージがサポートされているかどうかを確認する目的でハンドヘルドのメーカーやモデル名を取得するべきではありません。そのかわり、動作しているオペレーティングシステムの存在と機能をチェックします。
VFSマネージャと拡張マネージャはともにオプションであり、独立したシステム拡張です。これらはともに、Palm OS 4.0 からオペレーティングシステムの一部として利用されています。そのため、拡張マネージャやVFSマネージャに依存するアプリケーションの実行を最大限可能にするためには、ハンドヘルドが以下のすべての条件を満たしている必要があります。
- Palm OS 4.0 で動作していること(注2)
- 拡張マネージャが存在していること
- VFS マネージャが存在していること
- 注2
- Palm OS 3.5 で動作する Sony の CLIE ハンドヘルドは、拡張マネージャとVFSマネージャを備えています。これらのマネージャの Sony バージョンは、Palm OS 4.0 に含まれるものとバイナリ互換性があります。
付録 B の“互換性ガイド”では、以下の各フィーチャの存在を確認する方法について詳細に説明しています。
- 「Palm OS 4.0 新フィーチャセット」では、ハンドヘルドが Palm OS 4.0 で動作しているかどうかを確認する方法を説明しています。
- 「拡張マネージャフィーチャセット」では、拡張マネージャの存在をチェックする方法を説明しています。
- 「VFSマネージャフィーチャセット」では、VFS マネージャの存在をチェックする方法を説明しています。
訳注:原著でも明記されていませんが、上記の付録 B は 全て「Palm OS Programmer's API Reference」に 含まれています。
プログラムで上記の全てが存在することをチェックすることもできますが、VFSマネージャが拡張マネージャに依存しており、単独では存在しえないという事実を利用することもできます。そのため、VFSマネージャが存在していれば、拡張マネージャもまた存在しているという判断をしても問題ありません。
マウントされたボリュームのチェック
多くのアプリケーションが、ハンドヘルドにストレージを追加する拡張機能に依存しています。セカンダリストレージモジュールの物理的な特徴に関心のないアプリケーションや、どのスロットにモジュールが挿入されたかを知る必要のないアプリケーションであれば、ハンドヘルドに挿入あるいは装着されたボリュームを Palm OS が認識して自動的にマウントするという動作に依存することができます。従って、多くのアプリケーションは単純にマウントされているボリュームを列挙し、適切なものを選択できます。以下のコードはその方法を示しています。
リスト 7.1 マウントされているボリュームの列挙
UInt16 volRefNum; UInt32 volIterator = vfsIteratorStart; while (volIterator != vfsIteratorStop) { err = VFSVolumeEnumerate(&volRefNum, &volIterator); if (err == errNone) { // Do something with the volRefNum } else { // handle error... possibly by // breaking out of the loop } }
VFSVolumeEnumerate から取得したボリューム参照番号は、ボリューム、ディレクトリ、およびファイルに対するいくつもの操作で使用することができます。これらの操作については、この章の後ろの方で説明します。
時として、アプリケーションはセカンダリストレージが利用できるかどうかだけでなく、もっと多くの情報を必要とする場合があります。そのようなアプリケーションでは、ハンドヘルドのスロットを順チェックすることから始めて、いくつかのステップを踏む必要があります。
スロットの列挙
Palm OSハンドヘルドにどのような拡張モジュールが装着されたのかを調べる前に、まずどのように拡張モジュールが装着されたのかを調べる必要があります。拡張カードや I/O デバイスは、物理スロットに挿入できますし、スナップオンモジュールはユニバーサルコネクタに接続できます。それらが物理的にどう接続されたかに関係なく、拡張マネージャはこれらをスロットとして開発者に提示します。スロットの列挙は ExpSlotEnumerate 関数があるため簡単です。以下にこの関数の使い方を示します。
リスト 7.2 ハンドヘルドの拡張スロットの反復
UInt16 slotRefNum; UInt32 slotIterator = expIteratorStart; while (slotIterator != expIteratorStop) { // Get the slotRefNum for the next slot err = ExpSlotEnumerate(&slotRefNum, &slotIterator); if(err == errNone) { // perform slot-specific processing here } else { // handle error... possibly by // breaking out of the loop }
ExpSlotEnumerate 関数が返すスロット参照番号は、そのスロットを一意に識別します。このスロット参照番号は様々な拡張マネージャ関数―― 例えばスロットに入っているのがカードなのかその他の拡張モジュールなのかを調べる関数 ――に使用できます。
スロット内のカードのチェック
指定されたスロットにカードがあるかどうかのチェックには ExpCardPresent 関数を使用します。スロット参照番号を渡すと、この関数は指定されたスロットにカードがあれば errNone を返します。カードがないか、そのスロットになんらかの問題があればエラーを返します。
カードの機能の確認
拡張カードがスロットに挿入された、あるいはハンドヘルドに装着されたことがわかっただけでは不十分です。アプリケーションはそのカードについて、行なうべき処理と互換性があるかどうかを確認する必要があります。例えば、アプリケーションがカードにデータを書き込む必要がある場合、書き込みが許可されているかどうかは重要です。
アプリケーションが利用できる機能は、カードだけでなく、スロットドライバにも依存します。ハンドヘルドメーカーは特定の種類の拡張ハードウェアに関する標準インタフェイスを定義する1つ以上のスロットドライバを提供します。カードやデバイスのメーカーはカード特有のスロットドライバを提供することもできますし、カードを制御するためのスロットカスタムコントロール関数と登録済みのクリエータコードを使うようアプリケーションに要求することもできます。
スロットドライバは、拡張カードに対して標準的な機能を問い合わせる責任を持ちます。拡張カードに対応するスロットドライバがあれば、ExpCardInfo 関数を使って以下のことを確認できます。
- 拡張カードのメーカー名。
- 拡張カードの名前。
- “デバイスクラス”または拡張カードの種類。返される値には“イーサネット”や“バックアップ”が含まれるかもしれません。
- シリアル番号など、デバイスの一意な識別子。
- カードが読み書きの両方をサポートするか、読み取り専用か。
- カードが単純なシリアルインタフェイスをサポートするか。
ExpCardInfo 関数の存在は、全ての拡張カードがこれらの機能をサポートすることを示唆するものではありません。スロットドライバがカードにアクセスして確認結果を拡張マネージャに報告することができる、ということに過ぎません。