Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/16-2
16-2 標準 I/O プロバイダアプリケーションの作成
標準 I/O アプリケーションを実行して結果を出力させるためには、標準 I/O プロバイダアプリケーションが必要になります。このアプリケーションはユーザーインタフェイスのサポートを提供します。つまり、標準 I/O アプリケーションが入出力を行なうための標準入力(stdin)デバイスと標準出力(stdout)ウィンドウです。
標準 I/O プロバイダは、ユーザーが(Graffiti や Graffiti 2 を使って)コマンドラインに入力してリターンすると標準 I/O アプリケーションを起動します。プロバイダは I/O 処理に必要なコールバックを含む構造体のポインタを、PilotMain 関数の cmdPBP パラメータを通じて標準 I/O アプリケーションに渡します。
標準 I/O プロバイダアプリケーションを作成するには、アプリケーションはモジュール StdIOProvider.c をリンクする必要があります。
入出力を処理するために、標準 I/O プロバイダアプリケーションはテキストフィールドとスクロールバーのあるフォームを提供する必要があります。標準 I/O プロバイダは以下の手順に従わなければなりません。
- アプリケーションの初期化時に SioInit 関数をコールします。この関数は、入出力フィールドを含むフォーム、フィールド、およびスクロールバーのオブジェクト ID を保存します。
- アプリケーション固有のイベント処理をする前に、フォームのイベントハンドラから SioHandleEvent 関数をコールします。言い換えると、アプリケーションが FrmSetEventHandler でインストールするフォームイベントハンドラにおいて、イベントに対してなにか処理をする前に SioHandleEvent をコールするということです。
- アプリケーションの終了時に SioFree 関数をコールします。
アプリケーションは SioInit コールから SioFree コールまでの間、自由に標準 I/O のマクロおよび関数をコールすることができます。これらのコール時点でカレントフォームが標準 I/O のフォームでない場合、そのフォームが次にアクティブになった時点でテキスト変更の記録と表示が行なわれます。
典型的な標準 I/O プロバイダアプリケーションには ApplicationHandleEvent というルーチンがあり、メインイベントループから SysHandleEvent と MenuHandleEvent の後にコールされます。この例をリスト 16.1 に示します。
リスト 16.1 標準 I/O プロバイダの ApplicationHandleEvent ルーチン
static Boolean ApplicationHandleEvent (EventPtr event) { FormType* frm; UInt16 formId; if (event->eType == frmLoadEvent) { formId = event->data.frmLoad.formID; frm = FrmInitForm (formId); FrmSetActiveForm (frm); switch (formId) { ..... case myViewWithStdIO: FrmSetEventHandler (frm, MyViewHandleEvent); break; } return (true); } return (false); }
典型的なアプリケーションのフォームイベントハンドラをリスト 16.2 に示します。
リスト 16.2 標準 I/O プロバイダのフォームイベントハンドラ
static Boolean MyViewHandleEvent (EventPtr event) { FormType* frm; Boolean handled = false; // Let StdIO handler do its thing first. if (SioHandleEvent(event)) return true; // If StdIO did not completely handle the event... if (event->eType == ctlSelectEvent) { switch (event->data.ctlSelect.controlID) { case myViewDoneButtonID: FrmGotoForm (networkFormID); handled = true; break; } } else if (event->eType == menuEvent) return MyMenuDoCommand( event->data.menu.itemID ); else if (event->eType == frmUpdateEvent) { MyViewDraw( FrmGetActiveForm() ); handled = true; } else if (event->eType == frmOpenEvent) { frm = FrmGetActiveForm(); MyViewInit( frm ); MyViewDraw( frm ); handled = true; } else if (event->eType == frmCloseEvent) { frm = FrmGetActiveForm(); MyViewClose(frm); } return (handled); }