Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

C/C++ Sync Suite Companion601/6

← 5 章に戻る ↑トップへ 7 章に進む →

6 拡張テクノロジの使用

この章では、拡張マネージャと仮想ファイルシステム(VFS)マネージャを使ってデスクトップからハンドヘルドの拡張カードとアド-オン デバイス対してどのように処理を行うのかについて説明します。この章は以下の節に分かれています:

拡張サポート ^TOP^

Palm OS 4.0 からは、オプションのシステム拡張のセットが標準メカニズム - それにより、Palm OS アプリケーション、デスクトップ アプリケーション、コンジットはさまざまな Palm ハンドヘルドの拡張能力の利点を利用できます - を提供します。この能力はメモリとハンドヘルドの I/O を増やすだけでなく、他の Palm ハンドヘルドや Palm OS 以外の OS を実行しているデバイスとのデータの交換を容易にします。これらの他のデバイスには、デジタル カメラ、デジタル オーディオ プレイヤ、デスクトップ コンピュータ、ラップトップ コンピュータなどが含まれます。

この節は以下の内容をカバーします:

主記憶装置 対 補助記憶装置 ^TOP^

すべての Palm ハンドヘルドは主記憶装置 - 直接アクセス可能なメモリで、長期間の記憶と一時的な記憶の両方に使用されます - を持ちます。これは、不揮発のユーザ データとアプリケーションを保持するのに使用されるストレージ RAM と、一時割り当てを行うための作業領域として使用されるダイナミック RAM を含みます。

たいていのハンドヘルドでは、主記憶装置全体がハンドヘルド自体の内部にあります。しかしながら、Palm OS メモリ アーキテクチャはこのようにハンドヘルドを制限してはいません; ハンドヘルドは追加のストレージ RAM を受け入れるように設計することができます。Handspring によって開発されたいくつかの製品はそのように機能します; Springboard スロットに挿し込まれるメモリ モジュールは完全なアクセスが可能で、追加のストレージ RAM として Palm OS アプリケーションに表示されます。

デスクトップ、コンジットから主記憶 RAM にアクセスするには、HotSync 実施中に同期マネージャ API 呼び出しを行います(第 4 章 「クラシック同期マネージャ API の使用」 を参照してください)。

対照的に補助記憶装置は主にアド-オン不揮発性記憶装置となるように設計されています。ここの実装への制限はありませんが、たいていの補助記憶装置メディアは:

  • 望むときに拡張スロットに挿入、取り外しできます。
  • セキュア デジタル(SD)、MultiMediaCard(MMC)、CompactFlash、Sony の Memory Stick、その他のサード-パーティ標準に基づきます。
  • 1 度にデータに 1 ビット、バイト、ブロックでアクセスするシリアル インターフェイスを提供します。

コンジットは HotSync 実施中に主記憶装置に同期マネージャを通してアクセスします。しかしながら、コンジットは補助記憶装置にアクセスするために拡張マネージャと VFS マネージャを使用します。これらはできる限り広い範囲のシリアル拡張アーキテクチャをサポートするように設計されています。

デスクトップ アプリケーションやインストーラは常にインストール援助機能を使用してアプリケーションとデータベースをキューに追加して、次の HotSync 実施中にインストール コンジットがそれらをハンドヘルドの主記憶装置にインストールするようにしてきました。Palm OS バージョン 4.0 のプラットフォームでは、デスクトップ アプリケーションやインストーラはさらにインストール援助機能を使用してファイルをキューに追加して、インストール コンジットがそのファイルをデスクトップから拡張カードの補助記憶装置にコピーするようにすることもできます。同様に、ユーザ データ API は、デスクトップ アプリケーションとインストーラがデスクトップ上のハンドヘルド ユーザについての情報にアクセスすることを可能にします; さらに、いまやそれらはユーザのハンドヘルド上の拡張スロットについての情報にもアクセスすることができます。

インストール援助機能とユーザ データ API についての更なる情報は、「インストール援助機能 API の使用」「ユーザ データ API の使用」 を参照してください。

拡張スロット ^TOP^

多くの Palm ハンドヘルドで見つかる拡張スロットは製造業者次第でさまざまです。あるものは SD と MMC カードを受け付けるかもしれませんし、他のものは Memory Stick や CompactFlash を受け付けるかもしれません。ハンドヘルドが持つことができる拡張スロットの数には制限が無いことに注意してください。

使用される拡張テクノロジ次第で、与えられたハンドヘルドで使用可能な拡張カードはさまざまです。

  • 記憶カードは補助記憶装置を提供し、追加のアプリケーションやデータを保持したり、バックアップ メカニズムとしてのインスタンスのためといったある特定の目的のために使用することができます。
  • ROM カードは専用のアプリケーションとデータを保持します。
  • I/O カードはハンドヘルドの I/O 能力を拡張します。例えば、モデムは有線通信を提供できますし、Bluetooth トランシーバは無線通信を追加できます。
  • "Combo"(「複合」)カードは I/O 能力と共に追加のストレージまたは ROM の両方を提供します。

ユニバーサル コネクタ ^TOP^

より新しい Palm ハンドヘルドのいくつかは、ハンドヘルドを HotSync クレードルに接続させるユニバーサル コネクタを装備しているかもしれません。このコネクタは、ハンドヘルドをスナップ-オン I/O デバイスに接続させることにも使用することができます。このコネクタ専用の特別なスロット ドライバは、コネクタのシリアル部分(訳者: 原文は serial portion だが、serial port(シリアル ポート)の間違いでは?)を使ってハンドヘルドからアクセサリへの通信を可能にします。この「プラグ アンド プレイ」スロット ドライバはスロットの中にあるカードという周辺装置を表し、周辺装置が装着されたときにカード挿入通知を提供することもします。

ユニバーサル コネクタのスロット ドライバはスナップ-オン周辺装置をスロットの中のカードにするため、ハンドヘルド アプリケーションはそのような周辺装置を拡張カードとして扱うことができます。コンジットの観点から見ると、ユニバーサル コネクタは、HotSync クレードルによって使用されている場合物理的に使用不可なので、クレードル-ベースの HotSync 実施中はそのような周辺装置はアクセス不可です。しかしながら、HotSync 実施が無線接続 - 例えば、赤外線通信 - 経由である場合、コンジットはそのような周辺装置にアクセスすることができます。どうすればコンジットがカスタム ファイル システムや I/O デバイスにアクセスするためのカスタム呼び出しを行えるかについての説明は 「カスタム呼び出し」 を参照してください。

この章の残りの部分では、I/O カードが使用できる場合は常に「拡張カード」という言葉は「拡張カード」と「プラグ アンド プレイ周辺装置」の両方の意味になります。しかし、HotSync 実施がユニバーサル コネクタ経由ではない場合に限ります。

アーキテクチャの概要 ^TOP^

図 6.1 は Palm OS 拡張アーキテクチャを示しています。それは複数のファイル システムをサポートして、雑多の物理拡張メカニズムをサポートするのに十分なほどフレキシブルに設計されている一方で、アプリケーションと Palm OS の他の部分に首尾一貫した API のセットを提供します。

以下の節では Palm OS 拡張アーキテクチャの主要なコンポーネントについて説明します。以下のコンポーネントについて、ボトム アップで説明していきます:


図 6.1 Palm OS 拡張アーキテクチャ


スロット ドライバ ^TOP^

スロット ドライバはハンドヘルドの標準 Palm OS 共有ライブラリです。それはハードウェアへのアクセスをカプセル化して、拡張マネージャとオプションとしてファイル システム ライブラリに標準サービス セットを提供する特別なライブラリです。図 6.1 で描かれているように、ハンドヘルド アプリケーションもコンジットも通常はスロット ドライバと直接に相互作用しません。

各拡張スロットはそれに関連付けられたスロット ドライバを持ちます。スロットはハンドヘルドの拡張マネージャによって代入される固有のスロット参照番号によって識別されます。拡張カード自体は個々に番号を振られません; 通常、アプリケーションはカードが挿入されているスロットを参照します。しかしながら、スロットはある時点でカードを持つかもしれませんし、持たないかもしれません、さらに、アプリケーションが実行中にカードが挿入、取り外しされる可能性もあるということに注意してください。

ハンドヘルドの拡張マネージャはスロットをスロット参照番号によって識別します。これらのスロット参照番号は、スロット ドライバが拡張マネージャにロードされる順番次第で変更されるかもしれません。さらに、スロット参照番号は拡張マネージャ API 経由の HotSync 実施中はコンジットだけが使用可能です。それゆえ、HotSync マネージャは各 HotSync 実施の開始時にスロット ID をハンドヘルドのスロットに割り当て、それらをデスクトップのユーザ データ保存場所の対応するユーザのために保存します。

HotSync 実施中には使用されないユーザ データ API とインストール援助機能 API はスロットを識別するためにスロット参照番号の代わりにスロット ID を使用します。これらの API は単に最後の HotSync 実施中にデスクトップに保存された情報を返します。そのため、ユーザは HotSync 実施と次の HotSync 実施の間にハンドヘルドを変更または更新しているかもしれないので、この情報は次の HotSync 実施時までの間に不正確なものになっているかもしれません。

ファイル システム ^TOP^

Palm OS 拡張アーキテクチャは Palm OS のすべてのファイル システム実装のために共通インターフェイスを定義します。このインターフェイスは、名前を付けられたボリュームにあるファイルとディレクトリの両方をオープン、クローズ、読み込み、書き込み、削除する機能を含むファイル システムとの相互作用のための API の完全なセットから成り立ちます。これらのハンドヘルド API はほぼすべてデスクトップで利用可能であり、そのため、コンジットはハンドヘルド アプリケーションとほとんど同じようにファイル システムと相互作用することができます。

ファイル システムの実装はハンドヘルドの共有ライブラリとしてパッケージされています。それらは、VFAT, HFS, NFS などのある特定のタイプのファイル システムのサポートを追加するモジュール形式のプラグ-インです。Palm OS 拡張アーキテクチャは複数のファイル システム ライブラリがいずれかの時点でインストールされることを許可します。通常、VFAT ファイル システムの実装が提供されています。

VFAT はすべてのタイプのフラッシュ メモリの業界標準です。それはデスクトップと他のデバイスへのデータとアプリケーションの転送を容易にします。Palm OS ソフトウェア バージョン 4.0 以降に含まれる VFAT ファイル システム ライブラリは、元来、補助記憶装置メディア上の VFAT ファイル システムをサポートします。それは FAT ファイル システムと VFAT ファイル システムを認識、マウントすることができ、認識されていないメディアと壊れているメディアの再フォーマットを提供します。

VFAT ファイル システムは Unicode/UCS2 フォーマットで保存されたロング ファイル名を要求するため、標準 VFAT ファイル システム ライブラリは UCS2 と Shift-JIS (標準 Palm OS マルチ-バイト文字エンコード)間と UCS2 と Palm OS/Latin エンコード間の変換をサポートします。

VFS マネージャ ^TOP^

仮想ファイル システム(VFS)マネージャは、ハンドヘルド アプリケーションとデスクトップ コンジットに多くの異なるメディア タイプ上の多くの異なるファイル システムへのアクセスを提供する統一された API を提供します。それは基本的なファイル システムを抽象化して、それにより、アプリケーションとコンジットは使用する実際のファイル システムを考慮することなく書き込みを行うことができます。VFS マネージャはコンジットに HotSync 実施中のファイル、ディレクトリ、ボリュームを操作するための多くの API を提供します。


VFS マネージャ API と同期マネージャ API

VFS マネージャが C/C++ Sync Suite に追加されたことにより、コンジットが Palm ユーザ データを保存、取得することができる 2 つの別々の方法があります:

  • 同期マネージャはハンドヘルドの主記憶 RAM の中のリソース データベースとレコード データベースにアクセスします。それは効率的にハンドヘルドのデータ マネージャを呼び出します - データ マネージャは制限のあるダイナミック RAM の大部分と不揮発性 RAM をたいていのハンドヘルドにあるディスクの代わりに使用することを特に目的として設計されています。ハンドヘルド上の記憶装置のデータが必要とされるものデータのすべてであるとき、または、効率的なデータへのアクセスが最重要のとき、Palm OS ユーザ データを保存、取得するために同期マネージャを使用します。
  • VFS マネージャと拡張マネージャは特に補助記憶装置である拡張メモリの多くのタイプをサポートするために設計されています。VFS マネージャ API は多くのタイプの拡張メディア上にある多くの異なるタイプのファイル システムへの首尾一貫したインターフェイスを提供します。VFS マネージャ API を使用するコンジットは非常に幅広くさまざまなファイル システムをサポートすることができます。あなたのコンジットが拡張メディアに保存されているデータに読み書きを行う必要があるときは、VFS マネージャを使用します。

コンジットは与えられた各シチュエーションで適切な API を使用すべきです。外部メディアへのアクセスがまったく必要でないときはいつでも、ストレージ ヒープのストレージを効率的に管理する同期マネージャが使用されるべきです。相互運用性とファイル システム アクセスが必要なときは、VFS マネージャ API を使用します。しかしながら、VFS マネージャはデータにアクセスしているときすべての読み込み、書き込みをハンドヘルドのメモリにバッファリングするというオーバヘッドを発生させるので、この機能を特に必要とするコンジットだけが VFS マネージャを使用すべきであるということに注意してください。

同期マネージャについての更なる情報は、第 4 章 「クラシック同期マネージャ API の使用」 を参照してください。VFS マネージャによって提供される API の詳細は、C/C++ Sync Suite Reference第 10 章 「仮想ファイル システム マネージャ API」? を参照してください。

拡張マネージャ ^TOP^

拡張マネージャは、Palm ハンドヘルドのスロット ドライバを管理するソフトウェア レイヤです。サポートされる拡張カードのタイプには Memory Stick と SD カードがあります - それらだけに制限されるわけではありません。拡張マネージャはこれらの拡張カードを直接はサポートしません; そうではなく、低レベル スロット ドライバとファイル システム ライブラリの助けを受けてこれらのタイプのメディアをサポートするアーキテクチャとより高レベルの API 関数のセットを提供します。

ハンドヘルドの拡張マネージャは:

  • カードの挿入と取り外しの通知をブロードキャストします。
  • カードの挿入と取り外しを示すサウンドを鳴らします。
  • カードに存在するボリュームをマウント、アンマウントします。

コンジットに対して拡張マネージャ API は、HotSync 実施中にハンドヘルド上の拡張マネージャへのインターフェイスを提供します。このインターフェイスを通して、コンジットはスロットに拡張カードがあるのかどうかを決定し、それらのカードについての情報を取得することができます。

拡張マネージャによって提供される API の詳細は、C/C++ Sync Suite Reference第 9 章 「拡張マネージャ API」 を参照してください。

標準ディレクトリ ^TOP^

Palm OS によって提供されるユーザの体験は一般的なデスクトップ コンピュータよりもより単純で、より直感的なものです。この単純さのある部分は、Palm OS はユーザにファイル システムを提示しないという事実からくるものです。ユーザは複雑な一般的なファイル システムを理解する必要がありません; アプリケーションはボタンまたはアイコンを 1, 2 回タップすることで簡単に利用可能になり、それらのアプリケーションに関連付けられているデータは各アプリケーションを通してのみアクセス可能です。拡張カード上のファイル システムをサポートする一方でユーザ操作の単純さを維持することは、拡張カード上のディレクトリの標準セットにより可能になります。

表 6.1 はすべての「規格対応の」 Palm OS 補助記憶装置の標準ディレクトリ階層をリストにしています。すべての Palm OS 関連データは、効果的にプライベート名前空間をパーティション分けしながら、 /PALM ディレクトリ(または、PALM ディレクトリのサブディレクトリ)の中にあるべきです


表 6.1 標準ディレクトリ

ディレクトリ 説明
/ 補助記憶装置のルート。
/PALM Palm OS アプリケーションによって書き込まれる大部分のデータはこのディレクトリのサブディレクトリに存在します。start.prc/PALM 直下にあります。このオプションのファイルは、補助記憶装置がマウントされたときに、自動的に実行されます。さらに他のアプリケーションもこのディレクトリの中にあるかもしれません。
/PALM/Backup バックアップのために Palm OS によって予約されています。
/PALM/Programs その他のアプリケーションとデータの置き場所。
/PALM/Launcher 可視のランチャー アプリケーションのホーム。

これらの標準ディレクトリに加えて、VFS マネージャはデフォルト ディレクトリというコンセプトをサポートします; そのディレクトリにはある特定のタイプのデータが保存されます。更なる情報は、「ある特定のファイル タイプのためのデフォルト ディレクトリの決定」 を参照してください。

カードの挿入と取出 ^TOP^

拡張マネージャはいつでも拡張メディアの挿入と取り出しをサポートします。カードを挿入するとアプリケーションは切り替わるかもしれませんが、ハンドヘルドは挿入前と同様に走り続けます。ハンドヘルドをリセットする必要はありませんし、また、カードが挿入または取り外されたことを明示的に知らせる必要もありません。

WARNING!
ある特定の拡張カードの構成の仕方により、アプリケーションまたはコンジットが拡張カードに書き込みを行っている最中にユーザがそのカードを取り外した場合に、ある特定の稀な状況でそのカードはもはや使えなくなる、あるいは、再フォーマットが必要になるといったダメージを受けることがあります。アプリケーションとコンジットは可能な限りカードの明確なポイントにだけ書き込むべきです。しかしながら、アプリケーションとコンジットがカードから読み込みを行っている最中は、カードにダメージを与える恐れ無しにカードを取り外すことができます。

HotSync 実施中、あなたのコンジットがカードにアクセスしている最中にユーザがそのカードを取り外した場合、拡張マネージャ関数または VFS マネージャ関数は失敗します。PalmSource 社は、あなたのコンジットが常にすべての API 関数から返されるエラーをチェックし、HotSync ログにユーザにとって有用なメッセージを追加することを推奨します。

拡張カードのチェック ^TOP^

拡張カードを探す前に、あなたのコンジットはまず、拡張マネージャと VFS マネージャの存在を確かめることによって、ハンドヘルドが拡張をサポートしていることを確認すべきです。それから、マウントされたボリュームに対して問合せることができます。最後に、あなたのコンジットはカードの能力を確かめることを望むかもしれません; カードはメモリを持つのかどうか、I/O を持つのかどうか、など。以下の小節でこれらの各ステップについて説明します:

ハンドヘルド互換性の検証 ^TOP^

Palm ハンドヘルドには多くの異なるタイプがあり、将来そのタイプはさらに増えます。あるものは補助記憶装置をサポートするための拡張スロットを持ち、あるものは持ちません。補助記憶装置をサポートするためのハードウェアはオプションであり、あるタイプのハンドヘルドには存在するかもしれませんし、存在しないかもしれません。物理的な拡張能力を持たないハンドヘルドでは拡張マネージャと VFS マネージャは役に立たないため、それらはすべての Palm ハンドヘルドに存在するわけではないオプションのシステム拡張です。

ハンドヘルド コンフィグレーションとハンドヘルドにプラグ-インまたはスナップ-オン(訳者: 取り付ける?)することができるモジュールには非常に多くの種類があるため、コンジットはハンドヘルドが補助記憶装置をサポートするかどうか決定するときにそのハンドヘルドの製造者やモデルを検出しようとすべきではありません。その代わりに、基本 OS の存在と能力をチェックします。

ハンドヘルドの VFS マネージャと拡張マネージャは両方ともがオプションである別個のシステム拡張です。それらは両方とも Palm OS ソフトウェア バージョン 4.0 で導入された OS のその他の部分を使用します。

NOTE
あなたのコンジットは VFS マネージャと拡張マネージャの存在を両方ともチェックできるかもしれませんが、VFS マネージャは拡張マネージャに依存し、拡張マネージャ無しに存在しないという事実を利用することができます。それゆで、VFS マネージャが存在する場合、間違いなく拡張マネージャも存在すると見なすことができます。

それゆであなたのコンジットは、VFS マネージャまたは拡張マネージャのいずれかの API 関数を呼び出す前に、ハンドヘルドに VFS マネージャが存在しているかどうかをチェックしなければなりません。ここでは、ハンドヘルドに VFS マネージャが存在しているかどうかを検証するための 2 つの方法を提供します。


VFSSupport 関数の使用

デスクトップ VFS マネージャ API は、ハンドヘルドが拡張スロットを持つかどうか、いずれかのファイル システムが存在するかどうかを検証するための VFSSupport()|C/C++ Sync Suite Reference601/10 を提供します。

あなたが VFSSupport() を呼び出すと、それはハンドヘルドの拡張マネージャのバージョン - これは VFS マネージャ バージョン番号と等価です - を返すか、拡張スロットが存在しない場合は 0 を返します。それは 2 番目のパラメータにカードに存在するボリュームの数を返すか、カードにファイル システムが存在しないあるいはスロットにカードが入っていない場合は 0 を返します。

NOTE
VFSSupport() 関数はハンドヘルドが拡張スロットを持つかどうかを検証するための主要な方法です。この情報はすでにデスクトップ VFS マネージャによって取得されているため、あなたのコンジットが VFSSupport() を呼び出したときにハンドヘルドへの呼び出しは生じません - これは SyncReadFeature() を使用するよりも効率的です。


SyncReadFeature 関数の使用

同期マネージャ API は、ハンドヘルドに定義された機能セットが存在するかどうかを検証するための SyncReadFeature() を提供します。VFS マネージャのシステム機能のチェックを行うには、以下のようにします:

  • SyncReadFeature() を呼び出します。
  • 機能作成者に対して sysFileCVFSMgr を提供します。
  • 機能番号に対して vfsFtrIDVersion を提供します。

コード 6.1 は、VFS マネージャの存在とバージョンをチェックするためにどのように SyncReadFeature() を使用するのかを示しています。expectedVFSMgrVersionNum はあなたが予期している実際のバージョン番号で置き換えるべきです。


コード 6.1 VFS マネージャの存在を検証するための SyncReadFeature

UINT32 vfsMgrVersion;
long err;

err = SyncReadFeature(sysFileCVFSMgr, vfsFtrIDVersion, 
                      &vfsMgrVersion);
if(err){
    // The VFS Manager is not installed.
    //(VFS マネージャはインストールされていない)
       } 
  else {
    // Check the version number of the VFS Manager,
    // if necessary.
    //(必要があれば VFS マネージャのバージョン番号をチェックする)
    if(vfsMgrVersion == expectedVFSMgrVersionNum)
        // Everything is OK. (すべて OK)
}

例えもし、VFS マネージャの存在が拡張マネージャの存在を暗示していたとしても、以下のようにさらに拡張マネージャのシステム機能のチェックを行うことができます:

  • SyncReadFeature() を呼び出します。
  • 機能作成者に対して sysFileCExpansionMgr を提供します。
  • 機能番号に対して expFtrIDVersion を提供します。

コード 6.2 は、拡張マネージャの存在とバージョンをチェックするためにどのように SyncReadFeature() を使用するのかを示しています。expectedExpMgrVersionNum はあなたが予期している実際のバージョン番号で置き換えるべきです。


コード 6.2 拡張マネージャの存在を検証するための SyncReadFeature

UINT32 expMgrVersion;
long err;

err = SyncReadFeature(sysFileCExpansionMgr, expFtrIDVersion, 
                      &expMgrVersion);
if(err){
    // The Expansion Manager is not installed.
    //(拡張マネージャはインストールされていない))
       } 
  else {
    // Check version number of the Expansion Manager, 
    // if necessary.
    //(必要があれば拡張マネージャのバージョン番号をチェックする)
    if(expMgrVersion == expectedExpMgrVersionNum)
        // Everything is OK. (すべて OK)
}

マウントされたボリュームのチェック ^TOP^

コンジットは Palm OS がハンドヘルドに挿入またはスナップ-オンされ認識されたボリュームを自動的にマウントするということに依存します。それゆえ、コンジットは単純にマウントされたボリュームを列挙して、その 1 つを適当に選択することができます。コード 6.3 はそれをどのように行うかを示しています。


コード 6.3 マウントされたボリュームの列挙

WORD numVolumes = 0; 
WORD *pwVolRefNumList;

// The first call returns only the number of mounted volumes,
// not their reference numbers.
// 最初の呼び出しはマウントされているボリュームの数だけを返し、
// ボリュームの参照番号は返しません。
VFSVolumeEnumerate (&numVolumes, NULL); 
  if (numVolumes)
  {
    // Allocate buffer for volume reference list.
    // ボリュームの参照リストのためのバッファの割り当て。
    pwVolRefList = new WORD [numVolumes];
  if (pwVolRefList != NULL)
    {
      // Get the volume reference numbers.
      // ボリューム参照番号の取得。
    VFSVolumeEnumerate (&numVolumes, pwVolRefList);
    }
}

VFSVolumeEnumerate()|C/C++ Sync Suite Reference601/10 で取得されるボリューム参照番号は、多くのボリューム、ディレクトリ、ファイル操作で使用することができます。それらの操作についてはこの章の後半で説明します。

時々、コンジットは利用可能な補助記憶装置があるかどうかということ以上のことを知る必要に迫られます。それらのコンジットは、次の小節で説明するハンドヘルドの各スロットのチェックで始まる 2, 3 の追加のステップを必要とするかもしれません。

スロットの列挙 ^TOP^

あなたはどの拡張モジュールがハンドヘルドに取り付けられているかを決定する前に、まずそれらのモジュールがどのように取り付けられる可能性があるかを決定しなければなりません。拡張カードといくつかの I/O デバイスは物理スロットにプラグ-インされる可能性があり、スナップ-オン モジュールはハンドヘルドのユニバーサル コネクタを通して接続される可能性があります。それらが物理的にどのように接続されているかに関係なく、拡張マネージャはそれらを開発者に対してスロットとして表します。ExpSlotEnumerate() 関数は単純にそれらのスロットを列挙します。コード 6.4 はこの関数の使用例を示しています。


コード 6.4 ハンドヘルドの拡張スロットの列挙

WORD wSlotRefList[32]; // Buffer for slot reference numbers.
WORD wSlotRefCount;    // Number of entries allocated for list.
long retval;

// Allocate enough space for buffer.
wSlotRefCount = sizeof (wSlotRefList) / sizeof (wSlotRefList[0]);
retval = ExpSlotEnumerate(&wSlotRefCount, wSlotRefList, NULL);

ExpSlotEnumerate() によって返されるスロット参照番号の配列はすべてのスロットを一意に認識します。スロット参照番号は、スロットにカードまたはその他の拡張モジュールがあるかどうかといったスロットについての情報を取得するために、さまざまな拡張マネージャ関数に提供することができます。


スロットにカードが存在するかどうかのチェック

ExpCardPresent() 関数を使って与えられたスロットにカードが存在するかどうかを決定します。スロット参照番号が与えられるとこの関数は、スロットにカードがある場合は SYNCERR_NONE を返し、スロットにカードが無い場合や指定されたスロットに問題がある場合はエラーを返します。

カードの能力の決定 ^TOP^

ただ拡張カードがスロットに挿入されている、または、ハンドヘルドに接続されているということを知るだけでは十分ではありません; あなたのコンジットは、実行する必要がある操作がそのカードに対して互換性を持つことを保証するために、カードについての何らかの情報を得る必要があります。例えば、あなたのコンジットがカードにデータを書き込む必要がある場合、書き込みが許可されているかどうかを知ることが重要です。

あなたのコンジットが利用可能な能力はカードだけではなくスロット ドライバにも依存します。ハンドヘルド製造者は、拡張ハードウェアのある特定のクラスへの標準インターフェイスを定義するスロット ドライバを 1 つあるいはそれ以上提供します。カード、デバイス製造者はさらにそのカード特有のスロット ドライバを提供することを選択するかもしれませんし、ある特定のカードへのアクセスと制御のためにアプリケーションがスロット カスタム関数を登録された作成者コードを使用することを必要とするかもしれません。

スロット ドライバは標準能力セットのための拡張カード問合せに対して責任を持ちます。与えられた拡張カードのためのスロット ドライバが存在しているとき、あなたは ExpCardInfo() 関数を使って以下のことを決定できます:

  • 拡張カードの製造者の名前。
  • 拡張カードの名前
  • 「デバイス クラス」または拡張カードのタイプ。ここで返される値は「Ethernet」や「Backup」を含むかもしれません
  • シリアル番号などのデバイスの一意な識別子

ExpCardInfo() 関数が存在しているということがすべての拡張カードがそれらの能力をサポートしているということを暗示しているわけではないということに注意してください。それはただ、そのスロット ドライバはカードにアクセスして、見つけたものを拡張マネージャに報告することができるということを意味しているだけです。

ボリューム操作 ^TOP^

拡張カードがファイル システムをサポートする場合、VFS マネージャはあなたが多くの標準ボリューム操作を行うことを可能にします。現在どのボリュームがマウントされ利用可能なのかを決定するために VFSVolumeEnumerate()|C/C++ Sync Suite Reference601/10 を使用します。この関数 - 利用方法は 「マウントされたボリュームのチェック」 で示されています - ボリュームの参照番号のリストを返します。あなたはそのリストからボリューム参照番号を選択して、それをその後に続くボリューム操作に渡します。

NOTE
ボリューム参照番号は、ハンドヘルドが与えられたボリュームをマウントするたびに変更される可能性があります。あるボリュームを追跡し続けるには、そのボリュームの参照番号ではなくボリュームのラベルを保存しておきます。

ユーザがマウント可能なボリュームを持つカードをスロットに挿入すると、VFS マネージャは自動的にそのボリュームをマウントしようと試みます。コンジットはボリュームをマウントすることはできません。

ボリュームをフォーマットするには VFSVolumeFormat()|C/C++ Sync Suite Reference601/10 を使用します。カードがフォーマットされると、VFS マネージャは自動的にそのカードをマウントし、VFSVolumeFormat() が新しいボリューム参照番号を返してきます。

VFSVolumeGetLabel()|C/C++ Sync Suite Reference601/10VFSVolumeSetLabel()|C/C++ Sync Suite Reference601/10 関数はそれぞれボリューム ラベルを取得、セットします。ファイル システムは文字列の有効性を検証する責任を持つため、あなたは好きな値をボリューム ラベルにセットしようとすることができます。ファイル システムが与えられた名前をネイティブにサポートしない場合 VFS マネージャはロング ボリューム名をサポートするために使用される /VOLUME.NAM ファイルを作成し(更なる情報は 「ボリュームのネーミング」 を参照してください)、ファイル システムが提供された文字列をサポートしない場合あなたはエラーを受け取ります。(訳者: VFS マネージャが /VOLUME.NAM を作成する条件と、エラーが返される条件の違いが分からない・・・)

NOTE
たいていのコンジットは VFSVolumeSetLabel()|C/C++ Sync Suite Reference601/10 関数を呼び出すべきではありません。この関数はルート ディレクトリでファイルを作成、削除するかもしれず、それにより現在の VFSDirEntryEnumerate()|C/C++ Sync Suite Reference601/10 呼び出しのいずれかを無効にする可能性があります。

ボリュームについての追加情報は VFSVolumeSize()|C/C++ Sync Suite Reference601/10VFSVolumeInfo()|C/C++ Sync Suite Reference601/10 を使用することで取得できます。名前が暗示するように VFSVolumeSize() はボリュームのサイズ情報を返します。特に、それはボリュームの総バイト数と現在使用されているバイト数の両方を返します。VFSVolumeInfo() は以下のものを含むボリュームについてのさまざまな情報を返します:

  • そのボリュームは隠されているかどうか
  • そのボリュームは Read-only かどうか
  • そのボリュームはスロット ドライバでサポートされるかどうか、また、Palm OS Emulator でシミュレートされているかどうか
  • 基本ファイル システムのタイプと作成者
  • そのボリュームが関連付けされているスロットと、そのスロットを制御しているスロット ドライバの参照番号
  • SD, CompactFlash, Memory Stick などのそのボリュームが存在しているメディアのタイプ

上記のすべての情報が VolumeInfoType|C/C++ Sync Suite Reference601/10 構造体の内部にカプセル化されて返されます。ボリュームが隠されているかどうか、Read-only かどうかはさらにこの構造体の単一のフィールドの中にエンコードされています; このフィールドを形成するビットについては、C/C++ Sync Suite Reference「ボリューム属性」|C/C++ Sync Suite Reference601/10 を参照してください。

この節の残りでは以下のことについてカバーします:

隠されたボリューム ^TOP^

ボリューム属性に含まれるものに "hidden" ビット - vfsVolumeAttrHidden - があります。これは、カード上のボリュームが可視か隠されているかを示します。通常、隠されているボリュームは直接ユーザが利用することはできません; ランチャとカード情報アプリケーションは両方ともすべての隠されているボリュームを無視します。

ボリュームを隠すには、/PALM ディレクトリの中に HIDDEN.VOL という名前の空のファイルを作成するだけです。VFSVolumeInfo()|C/C++ Sync Suite Reference601/10 関数はこのファイルを探して、見つかった場合はそのボリュームの他の属性とともに vfsVolumeAttrHidden ビットを返します。

ボリュームのスロットへの一致 ^TOP^

たいていの場合、コンジットは ExpCardInfo() によって提供される拡張カードの特性を知る必要はありません。しばしば、VFSVolumeInfo()|C/C++ Sync Suite Reference601/10 によって提供される情報で十分です。しかしながら、ある特定のボリュームについてそれ以上に知る必要のあるアプリケーションもあります。例えば、カードの製造者やタイプが重要になるかもしれません。

VFSVolumeInfo() によって返される VolumeInfoType|C/C++ Sync Suite Reference601/10 構造体は、ExpCardInfo() に渡すことができる slotRefNum フィールドを含みます。これは、あなたがある特定のボリュームが存在しているカードについての特性情報を取得することを可能にします。

与えられた参照番号に対応するボリュームの情報を取得することはそれほど単純なことではありません。なぜなら、スロット参照番号を与えられてボリューム参照番号を返す関数は無いからです。しかしながら、ボリュームがスロット ベースならば、あなたはマウントされているボリュームを反復処理して、各ボリュームのスロット参照番号をチェックすることができます。(あるボリュームがスロット ベースかどうかを決定するには、slotRefNum によって指定されているボリュームにアクセスする前に VolumeInfoType 構造体の中の mountClasssysFileTSlotDriver にセットされているかどうかをチェックします。)

ボリュームのネーミング ^TOP^

ハンドヘルド ファイル システム ライブラリが異なると、サポートするボリューム名の最大長が異なり、文字セットの制限も異なります。ファイル システム ライブラリは与えられたボリューム名が有効かどうかを検証する責任があり、有効でない場合はエラーを返します。コンジット開発者の立場から見ると、ボリューム名は 255 文字までの長さで、印刷可能な文字はすべて含めることができます。

ファイル システム ライブラリはボリューム名を基本的なファイル システムが受け入れ可能なフォーマットに変換する責任があります。例えば、8.3 ネーミング規約はロング ボリューム名を変換するのに使用され、最初の 11 文字が有効で、非スペース文字が使用されます。この例で有効な文字は、A-Z, 0-9, $, %, ', -, _, @, ~, ', !, (, ), ^, #, & です。

ハンドヘルドの拡張カード上のボリュームのネーミングについての更なる情報は、Palm OS Programmer's Companion 参照してください。

ファイル操作 ^TOP^

共通ファイル操作 ^TOP^

表 6.2 で示されているように、VFS マネージャはデスクトップ コンピュータとそれよりも大きなコンピュータ システムでおなじみの標準ファイル操作のすべてを提供します。これらの関数はあなたの予想以上の機能を持っているため、その使用方法についての詳細はここでは扱いません。パラメータ、返り値、各関数の副作用については、C/C++ Sync Suite Reference第 10 章 「仮想ファイル システム マネージャ API」? の中の各関数の説明を参照してください。

これらの関数のいくつかはファイルとディレクトリの両方に適用され、他はファイルだけに対して機能するということに注意してください。


表 6.2 共通ファイル操作

関数 説明
FileOpen()|C/C++ Sync Suite Reference601/10 与えられたボリューム参照番号とファイル パスでファイルをオープンします。
FileClose()|C/C++ Sync Suite Reference601/10 オープンされているファイルをクローズします。
FileRead()|C/C++ Sync Suite Reference601/10 ファイルから指定されたバッファにデータを読み込みます。
FileWrite()|C/C++ Sync Suite Reference601/10 オープンされているファイルにデータを書き込みます。
FileSeek()|C/C++ Sync Suite Reference601/10 オープンされているファイル内で読み込みまたは書き込みを行う位置をセットします。
FileTell()|C/C++ Sync Suite Reference601/10 オープンされているファイル内のファイル ポインタの現在位置を取得します。
FileEOF()|C/C++ Sync Suite Reference601/10 オープンされているファイルのファイル終端状態 (原文: end-of-file) を取得します。
FileCreate()|C/C++ Sync Suite Reference601/10 与えられたボリューム参照番号とファイル パスでファイルを作成します。
FileDelete()|C/C++ Sync Suite Reference601/10 クローズされているファイルーを削除します。
FileRename()|C/C++ Sync Suite Reference601/10 クローズされているファイルをリネームします。
FileSize()|C/C++ Sync Suite Reference601/10 オープンされているファイルのサイズを取得します。
FileResize()|C/C++ Sync Suite Reference601/10 オープンされているファイルのサイズを変更します。
FileGetAttributes()|C/C++ Sync Suite Reference601/10 オープンされているファイルの属性 - hidden, Read-only, システム, アーカイブ ビットを含む - を取得します。属性フィールドを形成するビットについては C/C++ Sync Suite Reference「ファイルとディレクトリの属性」|C/C++ Sync Suite Reference601/10 を参照してください。
FileSetAttributes()|C/C++ Sync Suite Reference601/10 オープンされているファイルの属性 - hidden, Read-only, システム, アーカイブ ビットを含む - をセットします。
FileGetDate()|C/C++ Sync Suite Reference601/10 オープンされているファイルの作成日付、変更日付、最終アクセス日付を取得します。
FileSetDate()|C/C++ Sync Suite Reference601/10 オープンされているファイルの作成日付、変更日付、最終アクセス日付をセットします。

あるファイルがオープンされると、そのファイルは固有のファイル参照番号: FileRef|C/C++ Sync Suite Reference601/10 によって識別されます。オープンされているファイルに対して処理を行う関数はファイル参照を使用します。VFSFileOpen() などの他の関数は、ボリューム参照とボリューム内でファイルを識別するためのパスを必要とします。すべてのパスはボリュームから見て相対で、そのボリューム内では絶対です: VFS マネージャは「現在機能しているディレクトリ」(原文: "current working directory") という概念を持たないため、相対パス名はサポートされません。ディレクトリ セパレータ文字は正方向のスラッシュ: "/" です。指定されたボリュームのルート ディレクトリは "/" というパスによって指定されます。

ファイルのネーミング ^TOP^

ファイル システムが異なると、サポートするファイル名とパスの最大長が異なります。ファイル システム ライブラリは与えられたパスが有効かどうかを検証する責任があり、有効でない場合はエラーを返します。コンジット開発者の立場から見ると、ファイル名は 255 文字までの長さで、スペースとすべての文字セットの中の小文字を含むすべての標準文字を含めることができます。さらに以下の特別な文字を含めることができます:

  • $ % ' - _ @ ~ ' ! ( ) ^ # & + , ; = [ ]

ファイル システム ライブラリはファイル名とパスを基本的なファイル システムが受け入れ可能なフォーマットに変換する責任があります。例えば、8.3 ネーミング規約はロング ファイル名を変換するのに使用され、以下のガイドラインが使用されます:

  • 名前は最初の有効な 6 文字 - 最後のピリオドまでに現れる非スペース文字 - から作成されます。有効な文字は、A-Z, 0-9, $, %, ', -, _, @, ~, ', !, (, ), ^, #, & だけです。
  • 拡張子は最後のピリオドの後の最初の有効な 3 文字です。
  • 短縮されるファイル名がすでに存在しない場合、6 バイトの名前の最後に "~1" が付加されます。その後に続くその短縮ファイル名と同じファイル名を持つものは次の固有番号を持ちます。そのため、2 番目にその短縮ファイル名となるものは "~2" を付加されます。

拡張をサポートする Palm ハンドヘルドで提供される標準 VFAT ファイル システム ライブラリは、ロング ファイル名から FAT 適合名を作成するために上記の規則を使用します。

Palm OS データベースに対する処理 ^TOP^

拡張カードはしばしば Palm OS アプリケーションとデータを PRC と PDB フォーマットで保持するために使用されます。補助記憶メディアが Palm ハンドヘルドに接続される方法のために、拡張カードから直接アプリケーションを実行することはできず、コンジットはまずデータベースを VFS マネージャでメイン メモリに移動させずに同期マネージャを使ってそのデータベースを操作することもできません。しかしながら、VFS マネージャを使用するように作成されたコンジットは拡張カード上のファイルを直接操作することができます。

NOTE
可能であるときは常に PRC/PDB ファイルとデータベースに同じ名前を与えてください。PRC/PDB ファイル名がデータベース名と異なり、ユーザがあなたのデータベースをカードからハンドヘルドにコピーしてその後に他のカードにコピーした場合、ファイル名は変化するかもしれません。これは、データベースがハンドヘルドからカードにコピーされるとき、データベース名が使用されるためです。(訳者補足: PRC/PDB ファイルのファイル名はそれらに含まれるデータベースと同じ名前にすべきということだと思われる。)


拡張カードとの Palm OS データベースのやりとり

VFSExportDatabaseToFil()|C/C++ Sync Suite Reference601/10 関数はデータベースをハンドヘルド上でのそのデータベースの内部フォーマットから等価な PRC または PDB ファイル フォーマットに変換して、それを拡張カードに移します。VFSImportDatabaseFromFile()|C/C++ Sync Suite Reference601/10 関数は逆のことをします; この関数は .prc または .pdf ファイルを主記憶メモリに移して、そのファイルを Palm OS によって使用される内部フォーマットに返還します。Palm OS データベースをメイン メモリと拡張カード間で移動させるときにこれらの関数を使用します。

VFSExportDatabaseToFile()VFSImportDatabaseFromFile() ルーチンは基本命令であり、データベースのサイズと移動で使用されるメカニズムしだいで時間がかかる可能性があります。

重要
これらのインポート、エキスポート関数はスキーマ データベースに対しては機能しません。

ディレクトリ操作 ^TOP^

あなたがディレクトリでの操作で使用するおなじみの操作はすべて VFS マネージャによってサポートされます; これらは 「共通ディレクトリ操作」 でリスト アップされています。ある共通操作 - 与えられたディレクトリ内にあるファイルを決定する - は、「ディレクトリ内のファイルの列挙」 でいくらか詳細にカバーされています。Palm OS を実行していないデバイスとのデータの交換を改善するために、拡張カードの製造者はある特定のファイル タイプに対してデフォルト ディレクトリを指定しています。与えられたファイル タイプのデフォルト ディレクトリを決定、セットする方法については、「ある特定のファイル タイプのためのデフォルト ディレクトリの決定」 で説明しています。

この節では以下のことについてカバーします:

ディレクトリ パス ^TOP^

すべてのパスはボリュームから見て相対であり、そのボリューム内では絶対です: VFS マネージャは「現在機能しているディレクトリ」(原文: "current working directory") という概念を持たないため、相対パス名はサポートされません。ディレクトリ セパレータ文字は正方向のスラッシュ: "/" です。指定されたボリュームのルート ディレクトリは "/" というパスによって指定されます。

ファイル名とディレクトリ名で使用する有効な文字についての詳細は 「ファイルのネーミング」 を参照してください。

共通ディレクトリ操作 ^TOP^

表 6.3 で示されているように、VFS マネージャはデスクトップ コンピュータとそれよりも大きなコンピュータ システムでおなじみの標準ディレクトリ操作のすべてを提供します。これらの関数はあなたの予想以上の機能を持っているため、その使用方法についての詳細はここでは扱いません。パラメータ、返り値、各関数の副作用については、C/C++ Sync Suite Reference第 10 章 「仮想ファイル システム マネージャ API」? の中の各関数の説明を参照してください。

これらの関数の大半はディレクトリと同様にファイルにも適用されるということに注意してください。


表 6.3 共通ディレクトリ操作

関数 説明
DirCreate() 新しいディレクトリを作成します。
FileDelete() 与えられたパスでディレクトリを削除します。
FileRename() ディレクトリをリネームします。
FileOpen() 指定されたディレクトリをオープンします。
FileClose() 指定されたディレクトリをクローズします。
FileGetAttributes() オープンされているディレクトリの属性 - hidden, Read-only, システム, アーカイブ ビット を含む - を取得します。属性フィールドを形成するビットについては、C/C++ Sync Suite Reference を参照してください。
FileSetAttributes() オープンされているディレクトリの属性 - hidden, Read-only, システム, アーカイブ ビットを含む - をセットします。
FileGetDate() オープンされているディレクトリの作成日付、変更日付、最終アクセス日付を取得します。
FileSetDate() オープンされているディレクトリの作成日付、変更日付、最終アクセス日付をセットします。

ディレクトリ内のファイルの列挙 ^TOP^

あるディレクトリ内のファイルの列挙は VFSDirEntryEnumerate()|C/C++ Sync Suite Reference601/10 関数によって行われます。コード 6.5 はこの関数の使用例を示しています。volRefNum は以下のコードに先立って宣言、初期化されていなければなりません。


コード 6.5 ディレクトリの内容の列挙

// Open the directory and iterate through the files in it.
// volRefNum must have already been defined.
FileRef dirRef;

err = VFSFileOpen (volRefNum, "/", vfsModeRead, &dirRef);
if(err == errNone) {
  // Iterate through all the files in the open directory
  UInt32 fileIterator;
  FileInfoType fileInfo;
  char *fileName = new char[256];   // Should check for err.

  fileInfo.nameP = fileName;        // Point to local buffer.
  fileInfo.nameBufLen = sizeof(fileName);
  fileIterator = expIteratorStart;
  while (fileIterator != expIteratorStop) {
    // Get the next file
    err = VFSDirEntryEnumerate(dirRef, &fileIterator,
                                &fileInfo);
    if(err == errNone) {
      // Process the file here.
    }
  } else {
    // Handle directory open error here.
  }
  delete [] fileName;
}

ループしている最中の各ループで、VFSDirEntryEnumerate()FileInfoType|C/C++ Sync Suite Reference601/10 を目下列挙されているファイルに一致するようにセットします。あなたがファイル名を欲しいと思う場合、FileInfoType に容量を割り当てるだけでは十分ではありません; あなたはさらにファイル名のためのバッファを割り当て、そのバッファへの適切なポインタを FileInfoType 構造体の中にセットし、そのバッファの長さを指定しなければなりません。FileInfoType 内でカプセル化されている他の唯一の情報はファイルの属性なので、たいていのコンジットはファイル名も知りたいと望みます。

ある特定のファイル タイプのためのデフォルト ディレクトリの決定 ^TOP^

「標準ディレクトリ」で説明したように、Palm OS の拡張能力は MIME タイプやファイル拡張子を特定のディレクトリ名にマップするメカニズムを含みます。このメカニズムはスロット ドライバで特有です; ある画像は Memory Stick の "/Images" ディレクトリに保存されるかも知れず、また MMC カードでは "/DCIM" ディレクトリに保存されるかもしれません。VFS マネージャは、あなたのコンジットが与えられたファイル拡張子または MIME タイプに対するある特定のボリュームでのデフォルト ディレクトリを取得することを可能にする関数を含みます; ハンドヘルド アプリケーションとは異なり、コンジットはそれら自体のデフォルト ディレクトリを登録、登録解除することはできません。

VFSGetDefaultDirectory()|C/C++ Sync Suite Reference601/10 関数はボリューム参照とファイル拡張子または MIME タイプを保持している文字列を受け取り、対応するデフォルト ディレクトリへのフル パスを保持している文字列を返します。ファイル タイプを指定するとき、"image/jpeg", "text/plain", "audio/basic" などのMIME メディア タイプ/サブタイプのペアか、".jpeg" などのファイル拡張子のどちらかを提供します。そのような他の VFS マネージャ関数の大半と同様に、あなたはあらかじめ返されるパスを保持するためのバッファを割り当てておかなければなりません。そのバッファへのポインタとともにそのバッファの長さを提供します。返り時には、その長さはパスの実際の長さを示すように更新され、その長さは元々指定されていたバッファの長さを超えることはありません。

与えられたファイル タイプのための登録されるデフォルト ディレクトリは "root" デフォルト ディレクトリとなることが意図されています。与えられたデフォルト ディレクトリが 1 つまたは複数のサブディレクトリを持つ場合、コンジットはさらにそれらのサブディレクトリでも適合するタイプのファイルを探すべきです。

VFSGetDefaultDirectory() は、あなたがある特定のファイル拡張子に関連付けられたディレクトリを決定することを可能にします。しかしながら、デフォルト ディレクトリにマップされているファイル拡張子すべてのリストを取得する方法はありません。

初期化時に登録されるデフォルトのディレクトリ ^TOP^

VFS マネージャは 表 6.4 のファイル タイプを expMediaType_Any メディア タイプ下に登録します。与えられたメディア タイプのデフォルト ディレクトリがスロット ドライバによって登録されていない場合、VFSGetDefaultDirectory()|C/C++ Sync Suite Reference601/10 はこのメディア タイプに対して登録されているデフォルト ディレクトリを使用します。


表 6.4 デフォルト ディレクトリ登録

ファイル タイプ パス
.prc /PALM/Launcher/
.pdb /PALM/Launcher/
.pqa /PALM/Launcher/
application/vnd.palm /PALM/Launcher/
.jpg /DCIM/
.jpeg /DCIM/
image/jpeg /DCIM/
.gif /DCIM/
image/gif /DCIM/
.qt /DCIM/
.mov /DCIM/
video/quicktime /DCIM/
.avi /DCIM/
video/x-msvideo /DCIM/
.mpg /DCIM/
.mpeg /DCIM/
video/mpeg /DCIM/
.mp3 /AUDIO/
.wav /AUDIO/
audio/x-wav /AUDIO/

PalmSource 社によって提供される SD スロット ドライバは 表 6.5 のファイル タイプを登録します。なぜなら、このスロット ドライバはこれらのファイル タイプに対する適切は指定を行うためです。


表 6.5 SD スロット ドライバによって登録されるディレクトリ

ファイル タイプ パス
.jpg /DCIM/
.jpeg /DCIM/
image/jpeg /DCIM/
.qt /DCIM/
.mov /DCIM/
video/quicktime /DCIM/
.avi /DCIM/
video/x-msvideo /DCIM/

この SD スロット ドライバによって登録されるディレクトリはすべて VFS マネージャによって行われるデフォルトの登録の複写ですが、SD の仕様ではそれらを明示的にインクルードするためそれらのディレクトリは SD メディア タイプ下にも登録されます。

Memory Stick などの異なるメディア タイプをサポートする他の Palm ハンドヘルド製造者によって作成されたスロット ドライバは、それらのメディアの仕様に合ったデフォルト ディレクトリを登録します。これらの登録のいくつかのケースは expMediaType_Any メディア タイプ登録をオーバライドするかもしれませんし、いくつかのケースは expMediaType_Any メディア タイプ登録に以前は登録されていなかったファイル タイプを追加するかもしれません。

これらの登録はアプリケーション開発者を手助けすることを意図しています。しかしながら、あなたはそれらに従う必要は必ずしもありません。あなたはそれらの登録を無視することもできますが、それらに従うことによってアプリケーションと他のデバイス間の相互運用性を高めることができます。例えば、メディアの仕様に従うデジタル カメラは画像を画像のフォーマットとメディア タイプに適合する登録ディレクトリ (またはそのサブディレクトリ) に保存します。フォーマットのための登録ディレクトリを参照することによって、ハンドヘルドの画像ビューア アプリケーションはカード全体を検索することなしに簡単に画像を見つけることができます。さらに、これらの登録は異なる開発者がファイル タイプ指定に対して異なるパスをハード コードすることを防ぐのに役立ちます。それゆえ、あるユーザが 2 つの異なる画像ビューア アプリケーションを持っている場合、両方ともが同じ場所を参照して同じ画像セットを見つけます。

初期化時にこれらのファイル タイプを登録することは、デフォルトのカード インストール コンジット (CardInst.dll) がこれらのタイプのファイルを拡張カードに転送することを可能にします。HotSync の間に、登録されたタイプのファイルは直接カード上の指定されたディレクトリに置かれます。

カスタム呼び出し ^TOP^

ファイル システムを認識する機能は、VFS マネージャと拡張マネージャに含まれる API ではカバーされないかもしれません。VFS マネージャは、単に開発者に基本的なファイル システムへのアクセスを提供するために存在する関数を含みます。この関数 - VFSCustomControl()|C/C++ Sync Suite Reference601/10 は登録されているクリエイタ ID と実行される操作を特定するセレクタをとります。VFSCustomControl() はある特定のファイル システムに指定された操作を実行するようリクエストするか、必要な操作に応じることができるファイル システムの場所を見つけるために現在登録されているすべてのファイル システムを反復処理を行うことができます。

パラメータは単一の VFSCustomControl() パラメータを通してファイル システムのカスタム関数に渡されます。このパラメータ - pDataBuf - は void * として宣言されているため、あなたはいずれのタイプの構造体へのポインタでも渡すことができます。2 番目のパラメータ - valueLenP - は、あなたが pDataBuf の長さを指定することを許可します。これらの値は単にファイル システムに渡されるものであり、これらは実際は基本的なファイル システムしだいであるということに注意してください。更なる情報は、C/C++ Sync Suite ReferenceVFSCustomControl()|C/C++ Sync Suite Reference601/10 の説明を参照してください。

VFSCustomControl() は、ある特定のファイル システムによって提供される非標準の機能にアクセスすることを可能にするために設計されているため、ファイル システムが提供するすべてのカスタム関数のリストは、そのファイル システムとともに提供されるドキュメントを参照してください。

この節の残りでは、「カスタム I/O」 について説明します。

カスタム I/O ^TOP^

拡張マネージャと VFS マネージャが補助記憶装置のための高レベル OS サポートを提供する一方、それらは raw (低レベル、未加工の) インターフェイス以上のものをカスタム I/O アプリケーションに提供しようとはしません。拡張メカニズムのすべての使用方法を予測することは不可能なため、拡張マネージャと VFS マネージャは単にカスタム ハードウェアの事項から逃れようとするだけです。

拡張マネージャは挿入と取り外し通知を提供し、ドライバのロードとアンロードを行うことができます。他の一切のことはアプリケーション開発者に責任があります。PalmSource 社は、Palm OS ライセンシによって拡張可能な共通拡張スロット ドライバ API を定義しています。この API は、拡張マネージャ、VFS マネージャ、ファイル システム ライブラリが必要とすることすべてをサポートするために設計されています。しかしながら、I/O デバイスと通信する必要のあるコンジットは提供される API 以上のものを必要とするかもしれません。そのようなコンジットは可能であればどこででもスロット カスタム呼び出し - これは拡張スロット ドライバへの直接アクセスを提供します - を使用すべきです。スロット ドライバとスロット カスタム呼び出しについての更なる情報は、ライセンシに提供される開発者用ドキュメントを参照してください。ある特定の I/O デバイスによって使用可能になる関数とそれらの関数にアクセスする方法についてのドキュメントに関しては、その I/O デバイスの製造者にコンタクトをとってください。

NOTE
カスタム I/O デバイスが HotSync クレドルと同じコネクタ経由でハンドヘルドと接続する場合、当然そのカスタム I/O デバイスはクレドル ベース HotSync の最中はアクセスできません。しかしながら、HotSync がワイヤレス接続 - 例えば赤外線接続 - の場合、コンジットはそのようなデバイスにアクセスすることができます。

デバッグ ^TOP^

Palm OS シミュレータは VFS マネージャの拡張能力をサポートします。シミュレータはホスト ファイル システム上のディレクトリをボリュームとして仮想ファイル システムに提供します。あなたはこのディレクトリをあなたのホスト システムに実装させ、ボリューム マウントをシミュレートすることができます。シミュレートされている拡張カードの内容への変更はホスト上のディレクトリを調べることによって検証することができます。

Palm OS シミュレータのコンフィグレーションと操作についての更なる情報は、Palm OS Cobalt Simulator Guide or Testing with Palm OS Garnet Simulator を参照してください。シミュレータでの HotSync の実行についての情報は、Conduit Development Utilities Guide第 8 章 「Palm OS シミュレータとの同期」? を参照してください。(訳者: 訳者の自作ドキュメント 「Palm OS Simulator での HotSync 使用のための設定」? も参照してください。)

拡張マネージャと VFS マネージャの要約 ^TOP^

← 5 章に戻る ↑トップへ 7 章に進む →