[[← 1 節に戻る|Palm OS Programmer's Companion Volume II/7-1]] [[↑7 章トップへ|Palm OS Programmer's Companion Volume II/7]] [[3 節に進む →|Palm OS Programmer's Companion Volume II/7-3]] ---- !!! 7-2 インターネットライブラリ   インターネットライブラリは、World Wide Web ドキュメントへの容易なアクセスをアプリケーションに提供します。インターネットライブラリは、基本的なネットワークアクセスにはネットライブラリを使用します。また、http や https のような高レベルインターネットプロトコルにソケット的なAPIを提供するという、ネットライブラリのソケットコンセプトの頂点にあります。 インターネットライブラリを使って、たった 3 コール( {{span style='color:blue;font-family:monospace;',INetLibSockClose}} )でアプリケーションは Web ページにアクセスすることができます。インターネットライブラリは、より良いコントロールを必要とするアプリケーションのために、より進んだ API も提供します。 :注:このセクションの情報は、Palm VII デバイスの Palm OS バージョン 3.2 以降でのみ適用されます。これらのフィーチャは、[[無線インターネットフィーチャセット]]が存在する場合のみ実装されます。 :警告!:将来の OS バージョンで、インターネットライブラリ API の後方互換性をサポートあるいは提供することを PalmSource 社は予定していません。 インターネットライブラリは、実行時にインストールされシステムが適切に動作するために必ずしも必要でない、システムライブラリとして実装されています。 このセクションではインターネットライブラリをアプリケーションでどのように使用するかについて説明します。以下の内容がカバーされます。 *システム要件 *初期化とセットアップ *Web ページへのアクセス *非同期操作 *低レベルコールの使用 *キャッシュの概要 *インターネットライブラリネットワーク設定 !!システム要件 インターネットライブラリは、Palm VII デバイスの Palm OS バージョン 3.2 以降のみで利用できます。インターネットライブラリコールを行う前に、インターネットライブラリが存在することを保証します。以下の {{span style='color:blue;font-family:monospace;',FtrGet}} コールを利用することで、それが利用可能かどうかを確かめることができます。 err = FtrGet(inetLibFtrCreator, inetFtrNumVersion, &value); インターネットライブラリがインストールされているなら、{{span style='color:blue;font-family:monospace;',value}} パラメータはゼロ以外で、返されるエラーはゼロ(つまりエラー無し)でしょう。 インターネットライブラリが存在して実行中であるとき、およそ 1 KB の余分な RAM(ネットライブラリ以上です)が必要となります。もしセキュリティライブラリが使用されている(セキュアなサイトにアクセスしているとき)なら、セキュリティライブラリのためにさらに追加のメモリが使用されます。そしてキャッシュデータベースが使用されているなら、キャッシュデータベースを開くためにさらに追加のメモリが使用されます。 !!初期化とセットアップ インターネットライブラリを使用する前に、ライブラリの参照番号を取得するために、アプリケーションは {{span style='color:blue;font-family:monospace;',SysLibFind}} をコールする必要があります。以下のようにコールします。 err = SysLibFind("INet.lib", &libRefNum) 次に、{{span style='color:blue;font-family:monospace;',inetH}} ハンドルをアロケートするために {{span style='color:blue;font-family:monospace;',INetLibOpen}} をコールする必要があります。{{span style='color:blue;font-family:monospace;',inetH}} ハンドルは全アプリケーション固有の環境セッティングを保持し、インターネットライブラリを使用する各アプリケーションは自身のプライベートな {{span style='color:blue;font-family:monospace;',inetH}} ハンドルを得ます。インターネットライブラリの既定の振る舞いを変更するコールは、アプリケーション自身の {{span style='color:blue;font-family:monospace;',inetH}} 構造体に保持されている環境セッティングに影響します。そしてこれらの変更は、同時にインターネットライブラリを使用するかもしれない他のアプリケーションには影響しません。 {{span style='color:blue;font-family:monospace;',INetLibOpen}} もまた、アプリケーションのためにネットライブラリを開きます。更に、アプリケーションは {{span style='color:blue;font-family:monospace;',INetLibOpen}} に好ましいネットワークサービスのタイプ(有線または無線)を伝えます。{{span style='color:blue;font-family:monospace;',INetLibOpen}} は利用可能なネットワークインターフェイスを問い合わせ、要求されたサービスのタイプに合ったインターフェイスにアタッチします。アプリケーションが「[[インターネットライブラリネットワーク設定]]」をコールしたときです。 インターネットライブラリは、システム設定データベースから既定の振る舞いのいくつかを取得します。また、その設定のいくつかは無線設定パネルを経由してユーザによってなされます。このパネルによってセットされた設定は、使用するプロキシサーバや、デバイスIDが送信されるときにユーザに警告するかどうかを決める設定を含んでいます。設定データベースに含まれる他の設定は、インターネットライブラリネットワーク設定( {{span style='color:blue;font-family:monospace;',INetLibSettingSet}} コールを参照)から来ます。しかし、アプリケーションによってなされた変更は、システム設定には保存されません。しかし {{span style='color:blue;font-family:monospace;',inetH}} ハンドルが開いている間だけは影響を与えます。 !!Web ページへのアクセス Palm.Net 環境において、全ての HTML 文書は Palm Powered ハンドヘルドに転送される前に Palm Web クリッピングプロキシサーバによって動的に圧縮されます。 ネットワークからページを読み取る手続きは以下のように操作します。最初に、ソケットを閉じるために、アプリケーションは要求された URL を {{span style='color:blue;font-family:monospace;',INetLibSockClose}} に渡します。 すぐに読めるデータが無い場合は、データの少なくとも 1 バイトが読めるようになるまで {{span style='color:blue;font-family:monospace;',INetLibSockRead}} がブロックする、ということに注意して下さい。イベントを使った非同期操作を実装するには、次の[[非同期操作セクション]]を参照して下さい。 もしアプリケーションが操作を越えたより良いコントロールを要求するなら、{{span style='color:blue;font-family:monospace;',INetLibURLOpen}} コールを他の低レベルインターネットライブラリコール([[低レベルコールの利用]])に置き換えることができます。 !!非同期操作 インターネットアプリケーションを書くことにおける主要な挑戦は、良いユーザインターフェイス反応を提供する間の遅いネットワークの内容へのアクセスのタスクを扱うことです。例えば、ユーザはスクロール・メニューの選択・またはWebページダウンロードの途中でキャンセルボタンのタップができなくてはいけません。 この種の機能を簡単に利用できるようにするに、インターネットライブラリは {{span style='color:blue;font-family:monospace;',INetLibGetEvent}} コールを提供しています。このコールは、伝統的で非ネットワーク Palm OS アプリケーションの全 てが使用する {{span style='color:blue;font-family:monospace;',EvtGetEvent}} コールを置き換えるように設計されています。{{span style='color:blue;font-family:monospace;',INetLibGetEvent}} コールは、処理すべき次のイベントをフェッチします。そのイベントがスクリーンのタップなどのユーザインターフェイスイベントでも、リモートホストから読み取るべきデータが到着するなどのネットワークイベントでも、です。もし準備のできたイベントが存在しなければ、{{span style='color:blue;font-family:monospace;',INetLibGetEvent}} は Palm Powered ハンドヘルドを自動的に低電力モードにします。また、次のイベントの発生までブロックします。 {{span style='color:blue;font-family:monospace;',INetLibGetEvent}} の利用はネットワーク入出力を行なう望ましい方法です。電池寿命を延ばし、ユーザインターフェイスの敏感さを向上させます。 {{span style='color:blue;font-family:monospace;',INetLibGetEvent}} を使うと、Web ページへのアクセス処理はかなり複雑になります。{{span style='color:blue;font-family:monospace;',INetLibURLOpen}} 直後の {{span style='color:blue;font-family:monospace;',INetLibSockRead}}コールのかわりに、アプリケーションはそのイベントループを返し次のイベントを待つべきです。データがソケットで準備できているというネットワークイベントを受け取ったなら、{{span style='color:blue;font-family:monospace;',INetLibSockRead}}をコールすべきです。 標準ユーザインターフェイスイベントに加えて、{{span style='color:blue;font-family:monospace;',INetLibGetEvent}} が返すことのできる 2 種類のネットワークイベントがあります。最初のイベントはステータス変更イベント( {{span style='color:blue;font-family:monospace;',inetSockStatusChangeEvent}} )です。このイベントは、ソケットのステータスが変化してアプリケーションがそのユーザインターフェイスを更新しようとするかもしれない、ということを示しています。例えば、http サーバへのアクセスに {{span style='color:blue;font-family:monospace;',INetLibURLOpen}} をコールしたとき、ソケットのステータスは「ホストを検索中(finding host)」から「ホストと接続中(connecting with host)」、「データを待機中(waiting for data)」、「データ読み取り中(reading data)」などに変化します。この種のイベントに関連づけられたイベント構造体は、ソケットハンドルと新しいステータスの両方を含んでいます。そのため、アプリケーションはユーザインターフェイスを更新することができます。 イベントの第二のタイプ {{span style='color:blue;font-family:monospace;',INetLibGetEvent}} は、データが準備できたイベント( {{span style='color:blue;font-family:monospace;',inetSockReadyEvent}} )を返すことができます。このイベントは、ソケットでデータが読み取り準備ができたときに返されます。このイベントは、{{span style='color:blue;font-family:monospace;',INetLibSockRead}} をコールできてデータ到着を待機中にブロックをしないということを保証する、とアプリケーションに伝えます。 インターネットライブラリを使用するアプリケーションの一般的な流れは、ユーザコマンドの応答で、{{span style='color:blue;font-family:monospace;',INetLibURLOpen}} を使って URL を開きます。そしてユーザインターフェイスと {{span style='color:blue;font-family:monospace;',INetLibURLOpen}} によって返された新規作成ソケットの両方からのイベントを処理するために、 {{span style='color:blue;font-family:monospace;',INetLibGetEvent}} が繰り返しコールされます。 {{span style='color:blue;font-family:monospace;',inetSockStatusChangeEvent}} イベントへの応答で、ユーザに現在のステータス(ホストを検索中、ホストに接続中、データ読み取り中、など)を示すために、アプリケーションはユーザインターフェイスを更新します。{{span style='color:blue;font-family:monospace;',inetSockReadyEvent}} イベントへの応答で、アプリケーションは {{span style='color:blue;font-family:monospace;',INetLibSockRead}} を使ってソケットからデータを読み取ります。最後に、利用可能な全てのデータが読み取られた( {{span style='color:blue;font-family:monospace;',INetLibSockRead}} が 0 バイトの読み取りを返した)とき、アプリケーションは {{span style='color:blue;font-family:monospace;',INetLibSockClose}} を使ってソケットを閉じます。 最後に、アプリケーションがソケットハンドルのステータスを問い合わせることができるように、便利なコール {{span style='color:blue;font-family:monospace;',INetLibSockStatus}} が提供されます。このコールはネットワーク入出力でブロックされません。よって、いつコールしても安全です。それはソケットの現在のステータスを返すだけでなく、読み書きの準備ができているかどうかも返します。それは、{{span style='color:blue;font-family:monospace;',inetSockReadyEvent}} および {{span style='color:blue;font-family:monospace;',inetSockStatusChangeEvent}}イベントを経由して伝達されたものと本質的に同じ情報を返します。{{span style='color:blue;font-family:monospace;',INetLibGetEvent}} を利用しないアプリケーションは、入出力のステータス変化および準備状態をチェックするために {{span style='color:blue;font-family:monospace;',INetLibSockStatus}} を繰り返しポーリングします。しかしポーリングは推奨されません。 !!低レベルコールの使用 {{span style='color:blue;font-family:monospace;',INetLibURLOpen}} が提供するよりも良いコントロールを必要とするアプリケーションは、インターネットライブラリの低レベルコールを使用することができます。それは {{span style='color:blue;font-family:monospace;',INetLibSockhttpReqSend}} を含みます。 http リソースのための {{span style='color:blue;font-family:monospace;',INetLibURLOpen}} 単一コールは、以下の連続と本質的に等価です。{{span style='color:blue;font-family:monospace;',INetLibSockOpen}} 、{{span style='color:blue;font-family:monospace;',INetLibSockConnect}} 、{{span style='color:blue;font-family:monospace;',INetLibSockhttpReqCreate}} 、{{span style='color:blue;font-family:monospace;',INetLibSockhttpReqSend}} です。これらの 4 つのコールは、サーバの非標準ポートへのアクセス(許可されるなら)、デフォルト http リクエストヘッダの修正、http の PUTおよび POST 操作、といった能力をアプリケーションに提供します。実際にネットワーク入出力を行なうコールは、{{span style='color:blue;font-family:monospace;',INetLibSockConnect}}(リモートホストとの TCP 接続を確立する)と {{span style='color:blue;font-family:monospace;',INetLibSockhttpReqSend}}(サーバに http リクエストを送る)だけです。 {{span style='color:blue;font-family:monospace;',INetLibSockhttpAttrSet}} は、{{span style='color:blue;font-family:monospace;',INetLibSockhttpReqCreate}} が生成したデフォルト http リクエストヘッダをアプリケーションが追加または修正ができるようにするために提供されています。 {{span style='color:blue;font-family:monospace;',INetLibSockSettingSet}} は、アプリケーションにソケットセッティングのより良いコントロールを提供します。 最後に、{{span style='color:blue;font-family:monospace;',IINetLibURLCrack}} ルーチンは、URL を構成部品に分割するのに便利なように提供されています。 !!キャッシュの概要 インターネットライブラリは、ダウンロード済のドキュメントのキャッシュデータベースを維持しています。これは LRU(最も昔に使われた:Least Recently Used )キャッシュです。これは、キャッシュが一杯になったときに最も昔に使われた項目がフラッシュされます。検索されたページがキャッシュされているかどうかは、ソケットにセットされたフラグ( {{span style='color:blue;font-family:monospace;',inetOpenURLFlagKeepInCache}} )または {{span style='color:blue;font-family:monospace;',INetLibURLOpen}} によって決定されます。他のフラグ( {{span style='color:blue;font-family:monospace;',inetOpenURLFlagLookInCache}} )は、URL 検索時にインターネットライブラリがまずキャッシュをチェックするべきかどうかを決定します。 インターネットライブラリを利用するアプリケーションはどれでも、同じキャッシュデータベースを使うことができます。そのため、各アプリケーションは事前にフェッチされたドキュメントの同一プールを共有することができます。また、アプリケーションは異なるキャッシュデータベースを使用することもできます。使用するキャッシュデータベースは、{{span style='color:blue;font-family:monospace;',INetLibOpen}} コールで指定されます。 一般的に、キャッシュされた項目は 1 つ以上のデータベースレコードにサーバから受け取ったのと同じフォーマットで保管されます。 Web クリッピングアプリケーションビューアアプリケーションで使用されるキャッシュにおいて、各レコードは項目の「マスタ」URL を含むフィールドを含んでいます。このフィールドはアクティブな PQA の URL がセットされています。ある PQA からリンクされているすべてのページは、同じマスタ URL を持っています。この機能性は、履歴リストを構築するための階層構造におけるすべてのページに見られます。 インターネットライブラリは、キャッシュ内に項目のリストを維持します。{{span style='color:blue;font-family:monospace;',INetLibCacheGetObject}} のコールによって、このリストから項目を探すことも、リスト全体を繰り返すこともできます。 URL がキャッシュされているかどうかを、{{span style='color:blue;font-family:monospace;',INetLibURLGetInfo}} のコールによりチェックすることができます。 !!インターネットライブラリネットワーク設定 インターネットライブラリはネットワーク設定をサポートします。'''設定''' とは、特定のインターネットライブラリ設定( {{span style='color:blue;font-family:monospace;',INetSettingEnum}} タイプから)値のセットのことです。 インターネットライブラリは利用できる設定のリストとそのエイリアスを保持しています。3 つのビルトイン設定があります。 *Palm.Net 無線システムおよび Palm Web クリッピングプロキシサーバを使用する無線設定 *ネットワーク設定パネルおよび Palm Web クリッピングプロキシサーバで指定された有線ネットワーク設定を使用する有線設定 *ネットワーク設定パネルで指定されるがプロキシサーバでは指定されない有線ネットワーク設定を使用するジェネリック設定 既存の設定を修正して別名で保存すれば、独自の設定を定義することもできます。 インターネットライブラリは、いくつかの'''設定エイリアス'''( {{span style='color:blue;font-family:monospace;',INetLibConfigAliasGet}} を参照)も定義しています。 例えば、インターネットライブラリを使ってある種の接続のデフォルト設定を変更するために、適切な値をセットアップし、設定を保存し、カスタム設定を指し示すインターネットライブラリデフォルトエイリアス設定をセットします。どの設定を使用するかをアプリケーションが指定するとき、もしエイリアスを指定したなら、カスタムセッティングが使用されます。 もし設定を使用するなら、{{span style='color:blue;font-family:monospace;',INetLibOpen}} 経由でインターネットライブラリを開くときに特定の設定を指定するべきでしょう。インターネットライブラリは、アプリケーション内で設定を操作するための API を含んでいますが、そのようなことはまれです。利用できる設定を一覧にすることができます( {{span style='color:blue;font-family:monospace;',INetLibConfigDelete}} )。 設定関数は主に設定パネルによる設定の編集および保存のために提供されます。一般的な手順は以下の通りです。編集する設定をアクティブにし、セッティングを適切にセットし、{{span style='color:blue;font-family:monospace;',INetLibConfigSaveAs}} を使ってセッティングを保存します。設定変更は、{{span style='color:blue;font-family:monospace;',INetLibConfigSaveAs}} をコールしない限り、インターネットライブラリが閉じた後には保存されない、ということに注意して下さい。   ---- [[← 1 節に戻る|Palm OS Programmer's Companion Volume II/7-1]] [[↑7 章トップへ|Palm OS Programmer's Companion Volume II/7]] [[3 節に進む →|Palm OS Programmer's Companion Volume II/7-3]]