統合環境エージェント,CodeName: EseSonA Version 0.04α 公開中.
Version 0.04α(2001/01/10版) ダウンロード(1.13MB)
使用しての感想,バグ報告(αのうちは,報告すればキリがないほどのバグが あると思われるが),機能の改良などがあれば電子メールで, a33@wakaba.toyonaka.osaka.jp まで.単に「使っています」だけのメールでも大歓迎である.
統合環境エージェントは,デスクトップあるいはネットワーク接続環境に おける環境支援ソフトを統合管理するエージェントです.ここでいう環境 支援ソフトとは,
という特性を持つソフトウェアを指します.具体的には,時計,アラーム, スケジューラ,ダイアルアップ接続/切断支援といったローカル環境支援 と,電子メール到着検知(biff),Web サイト更新検知(自動巡回),ネットワーク による時刻同期(ntpd),別ユーザの存在検知(アウェアネス…ICQ の Online Check 機能)などのネットワーク環境支援が存在します.
前者の支援機構に対する統合環境は多く提案,実装,提供されていますが, 後者のネットワーク環境支援ソフトについては,それらを統合したシステムは 一般的ではありません.これは各種システムがそれぞれかなり異なる知識と 実装をもとにしているためであり,それらを統合するのには大きな労力が必要で, かつメンテナンス作業も非常に難しくなるからです.
そこで,本エージェントにおいては,全ての環境支援機能を,動的ロードを 利用することにより,分離開発できるようなシステムの構築を目指します.すなわち, 統合管理エージェントが各種機能の起動を行い,その結果を取得し,ユーザに 提示します.各種機能は動的ロードにより容易に機能追加/バージョンアップが できることになり,統合システムの陳腐化およびメンテナンスの繁雑性を低減 させることが可能です.
さらに,インタフェース部分を分離実装します.これは,ユーザの志向,嗜好に よりインタフェースのタイプが変化する可能性が高いからです.常駐型エージェント としては,ペルソナウェアをはじ めとした擬人系や,ICQのようなシステム ライクな形式がありますが,これらのいずれの形式にも対応できるように,インタ フェース部を分離できるような実装をしております.
以上より,システムは以下の3つのブロックから実現されることとなります.
イベントドライバがイベント実行部を呼び出す場合には,以下の2通りが あります.
イベント実行部は DLL で構成され,イベントドライブ部が動的に関数を 呼び出すことによって機能を提供します.
イベントドライブ部は,イベント実行部の提供する機能を実行する関数 (以降機能関数)をイベントドライブ部ローカルのタイマによって呼び出します. 機能関数は以下の形式の関数です.
function f (str : PChar) : Pchar (...for Delphi)
char *f(char *str) (...for C)
機能関数は,イベントドライブ部から渡される文字列引数を用いて,ユーザ からの指定を解釈します.ユーザからの指定が無い場合,あるいは指定が時刻 指定などのイベントドライバ部で処理可能である場合は,引数にはヌル文字列を 取ることになります.
機能関数は,イベントを実行し,その実行結果を文字列として返します. その内容は以下の形式に則っている必要があります.
Result Code SPCResult Message
リザルトコードは,実行が正常終了したか,エラー終了したかを示します. 3桁の10進正整数で示され,100 の位が 0 の場合,正常終了を示します.なお, このコードは直接 UI に渡されます.また,リザルトメッセージは,コード以外 にユーザに提供する情報がある場合に与えます.セパレータは空白文字です. なお,リザルトメッセージ中にいくつ空白文字があってもかまいません.
イベントドライブ部の実装では, 引数の文字列も返値の文字列もメモリ領域をとって格納しているつもり ですので,実行が終了次第,機能関数を含む DLL は消滅/初期化しても問題 ありません.
イベントドライバは,UI からのイベント設定部に向かってのプロパティ 設定パネルの表示をフックし,実際にイベントドライバに伝えます.これを 受け取るとイベント実行部はプロパティページを表示します.この伝達は イベント実行部に実装された次の関数をイベントドライバが呼び出すことで 実現します.
function PropertyPage : Pchar (...for Delphi)
char *PropertyPage(void) (...for C)
イベント実行部から渡されたリザルトコードとメッセージを, 次の形式に変換して,文字列としてUI に提供します.
DLL Name SPCFunction Name SPCSequence Number SPCResult Code SPCResult Message
第1エントリに,機能関数を含む DLL 名が,第2エントリに,機能関数名が, 第3エントリにシーケンス番号が続きます.シーケンス番号については後述します. あとはリザルトメッセージと同様です.なお,500 番台のエラーコードがこのとき 付加されることがありますが,500 番台は,イベントドライブ部でのエラーであり, 以下の二つが(現在)指定されています.したがって,イベント実行部の実装において, 500番台のリザルトコードを返すことは出来ません.
さらに.900番台のリザルトコードは以下の特殊な意味を持ちます.
900番台のリザルトコードは,エントリの追加を示します. この場合,追加するエントリリスト形式の連続をリザルトメッセージに設定して UI 部に通知し,UI 部でエントリ追加関数(AddEntry 関数)を呼び出すことによって イベントドライブ部に追加エントリを通知します.途中どうせ イベントドライブ部通るんだから,そこでフックすりゃいいのですが,なんか 実装がぱっと思い付かなかったので(^^;,このようなややっこしい実装になって います.
エントリリストが複数ある場合,エントリリスト間にSPC+SPCを挟むことで処理する.このため, エントリリストにおいて,+1文字からなる引数を指定することは できません.
イベントドライバは返り値を解析し,エントリを追加します.エントリおよび エントリリストについては後述します.
これらの結果文字列はイベントドライブ部に格納され,次に示す関数により, 結果を取得することができます.
function isResult : integer
integer isResult(void)イベントドライブ部に存在する結果文字列の個数を返します.function GetResults : PChar
char *GetResults(void)イベントドライブ部に存在する結果文字列のうち,最も古いものを返します. 返したときにイベントドライブ部はこの結果文字列を破棄します.
インタフェース部では,この結果文字列の存在をタイマでポーリング(定期的に チェック)することにより,結果を取得することができます.
よく考えると,これってタイマを2段も使ってて非常にもったいない気がするんです よね….ただ,UI と イベントドライバを分離するためにはこれしか方法を思い つかなかったモノで…馬鹿な私をお許し下さい.
イベントドライブ部からイベント実行を依頼するのには,イベントドライブ部に 実装されている以下の関数を呼び出します.
Procedure AddEntry(str : Pchar)
void AddEntry(char *str)後述するエントリリストをイベントドライブ部に送信し,イベント実行を依頼 します.Procedure DirectAction(str : Pchar)
void DirectAction(char *str)イベントドライブ部に,イベント実行を「即時実行」するように依頼します. 引数はエントリリストの形式から,時間表現部を除いた形式となります.これも 後述します.Procedure PropertyPage(DLLname : Pchar)
void PropertyPage(char *DLLname)イベントドライブ部に,DLLname に該当する名前の DLL のプロパティを開く ように指示します.この関数の動作は DirectAction 手続きで実現可能ですが, 利用頻度が高いため,別の関数として用意します.イベントの実行を依頼するエントリリストは次の形式になっています. 区切り文字は空白です(SPCは表記していません).
YY MM DD hh mm(/mm) DLLName Sequence FunctionName Argument 年 月 日 時 分(/毎分) DLL名 シーケンス番号 機能関数名 引数 前 5 エントリは時刻指定エントリです.各エントリに正整数で値を指定します. 指定しない場合は,* を代わりに指定します.分指定には /を 使った特殊な指定があり,/mmで, mm分ごとに実行を示します.この場合のmmには 60以上の数値を指定することもできます.また,/指定をした場合には, 他の時間指定はすべて無視されます.
後半は指定時刻に実行される機能関数を指定します.ここで,シーケンス番号 とは,同一 DLL かつ 同一関数 の呼び出しが複数個エントリされる場合に,その それぞれを個別に扱うための識別番号です.すなわち,あるエントリリストにおいて, その中のあるエントリと,DLL名,機能関数名,シーケンス番号が一致するエントリ を追加した場合,エントリは上書きされます.