図15は、本発明の実施例1に係る画像形成システムのハードウエア概略ブロック図である。
情報処理装置としての画像形成装置10は、コピー、プリント、FAX送受信及び電子メール送信を行うことが可能な複合機である。画像形成装置10は、HTTPに従ったWebサーバマシンとしても機能し、イントラネット内のホストコンピュータの汎用ブラウザによる画像形成装置10の遠隔操作が可能となっている。
画像形成装置10では、MPU11にインターフェイス12を介してPROM13、DRAM14、操作パネル15、プリンタ16、スキャナ17、NIC(Network Interface Card)18及びFAXモデム19が接続されている。図15では簡単化のため、複数のインターフェイスを1つのブロックで示している。
PROM13は、例えばフラッシュメモリであり、これにはマルチプロセス及びマルチスレッドの機能を備えた汎用OS(オペレーティングシステム)、Webサーバ及びWebアプリケーション(画像形成処理プログラムを含む)並びに後述の各種データが格納されている。OSは、例えばLinux(登録商標)である。
DRAM14は、ワークエリア用であり、マルチプロセス及びマルチスレッドのインスタンス並びにリクエストメッセージ、リスポンスメッセージ及びこれらに関係したデータが格納され、解放される。操作パネル15は、設定値又は指示を入力し、設定画面や状態などを表示させるためのものである。プリンタ16は、コピー及びファックス送信での画像入力用である。スキャナ17は、プリントエンジン並びに用紙の給紙部、搬送部及び排紙部を備え、DRAM14内に生成されたビットマップデータが供給され、このデータに基づいて感光ドラムに静電潜像を形成し、この像をトナーで現像し、トナー像を用紙に転写し定着させ、排紙する。NIC18は、ケーブル又は無線の通信媒体を介して複数のWebクライアントマシーン20、21、・・・に結合される。FAXモデム19は、公衆回線網28を介して任意のFAX装置29に結合される。
図1は、主に画像形成装置10のソフトウエア構成を示す機能ブロック図である。
画像形成装置10では、PROM13(図15)内に、プログラムとして、OS30と、その上層のinetd31、httpd32、メール送信サーバ33、メインWebサーバ34、Webアプリケーション35及びDBMS(database management system)36とを備え、データとして、静的リソース37と、HTMLテンプレートファイル38と、バッファサイズテーブル39と、言語テーブルファイル40と、データベース41と、コンフィグレーションファイル42とを備えている。
inetd31、httpd32及びメール送信サーバ33は汎用プログラムである。inetd31及びhttpd32中の文字"d"は、バックグラウンドで動作するデーモンであることを示しており、それぞれプロセスとして動作する。メインWebサーバ34、Webアプリケーション35及びDBMS36は1つのプロセスとして動作する。
inetd31を用いている理由は、既存の資産を有効利用してメインWebサーバ34の構成を簡単化するためである。inetd31は、定義ファイルに記述された1つ以上のポートを監視するのでスーパーサーバと称されており、クライアントとの間でTCP接続が確立する毎に、そのポート番号に対応した、定義ファイルに記述されているプログラムを起動させる。本実施例では、inetd31は80番のポートのみ監視し、クライアントとの間でTCP接続が確立する毎にhttpd32を起動させる。inetd31は、セキュリティ機能(フィルタ)も備えており、本実施例では、定義ファイルに記述されたローカルIPアドレスを持つクライアントからの接続要求のみ受け付ける。
httpd32を用いている理由は、これを用いないとinetd31が接続要求を受け付ける毎にメインWebサーバ34が起動されることになるからである。メインWebサーバ34は、システム起動時に1回起動させれば、後述のように、メインWebサーバ34内でリクエスト毎にスレッドが生成されて並行処理が可能となっており、リクエスト毎にプロセスを生成するよりもメモリを節約することができる。
本実施例1によれば、既存の資産を有効利用してメモリ資源節約型メインWebサーバの構成を簡単化しその開発期間を短縮することができるという効果を奏する。
httpd32は、起動されると、inetd31でTCP接続が確立したクライアントからのリクエストメッセージを、Webクライアントマシーン20からNIC18及びOS30を介し受け取り、パイプでメインWebサーバ34に渡した後、DRAM14上から消滅する。すなわち、httpd32は、仲介役としてのみ機能する。このため、この仲介に必要な機能のみコンパイルされて用いられ、これによりメモリをさらに節約することができるという効果を奏する。
メインWebサーバ34では、HTTP処理スレッド生成部340が、httpd32からのリクエストメッセージを受け取ってHTTP処理スレッド341を生成し、このメッセージの識別子をHTTP処理スレッド341のコンストラクタに引き渡し、HTTP処理スレッド341を起動させる。
HTTP処理スレッド341は、このメッセージをパースし、メッセージに含まれているリクエストURI中のパス及びGETメソッドの場合のクエリ文字列、各フィールド名とその値、POSTメソッドの場合には変数名とその値(本明細書及び特許請求の範囲では、POSTメソッドにおいて、GETメソッドの場合のクエリ文字列に対応するものもクエリ文字列と称す)を、予め定めた構造体の変数の対応する要素に代入し、この構造体変数(以下、S変数と称す。)の識別子(以下、S識別子と称す。)を引数として処理粗振分部342を呼び出す。
以下の処理では、リクエストメッセージ中の情報が、S変数の対応する要素を介して用いられ、これにより以下の複数の処理のそれぞれが簡単になる。リクエストURI中のパスが格納されたS変数の要素をS変数.パス、クエリ文字列が格納されたS変数の要素をS変数.クエリ文字列と表記する
図3は、処理粗振分部342による処理を示すフローチャートである。以下、カッコ内は図中の識別符号である。
(S0)S変数.パスを読取る。
(S1)このパスに含まれるファイル名の拡張子が"cgi"であればステップS2へ進み、そうでなければステップS3へ進む。
(S2)S識別子を引数としてWebアプリケーション35を呼出し、図3の処理を終了する。
(S3)ステップS0で読取ったパスが、コンフィグレーションファイル42内のフォースファイル項目に記述された、ファイル名に一致し又はディレクトリのパス以下のものである場合には、ステップS2へ進み、そうでなければステップS4へ進む。すなわち、リクエスト対象を示すパスが所定パスであればCGIプログラムのうち、後述のget.cgiに対するリクエストであるとみなす。
(S4)S識別子を引数として静的リソース処理部343を呼び出す。
静的リソース処理部343はこれに応答して、S変数.パスで識別されるファイルの内容を静的リソース37からDRAM14上に読出し、その識別子を、対応するHTTP処理スレッド341に引き渡す。HTTP処理スレッド341はこれに応答して、このファイルの内容にリスポンスヘッダを付加し、リスポンスメッセージとして、OS30及びNIC18を介しWebクライアントマシーン20へこのメッセージを送信する。
本実施例1によれば、処理粗振分部342において、クライアントからのリクエストURIに含まれるパスがコンフィグレーションファイル42内のフォースファイル項目に記述された仮想ファイルパスと一致し又は仮想ディレクトリパス以下のものと判定されれば、Webアプリケーション35に制御が移るので、Webアプリケーション35に制御を移すためのプログラムファイルパスを省略でき、これにより37及び38の記述を簡単化することができるという効果を奏する。
次に、処理粗振分部342によりWebアプリケーション35が呼び出された場合の処理を説明する。図2は、主にWebアプリケーション35の構成を示す機能ブロック図である。
この呼出は、Webアプリケーション35の処理細振分部350に対して行われる。図4は、処理細振分部350による処理を示すフローチャートである。
ここで、従来ではCGIプログラムのそれぞれがプロセスとして起動されていたが、本実施例1では、CGIプログラムのそれぞれを1つのプロセスの中の関数(サブルーチン)として起動することにより、プロセス間通信による遅延を防止するとともに、複数のCGIプログラムでリソースを共有して、全体として必要なメモリサイズを削減している。すなわち、CGI方式の利点を有効利用するとともに、その欠点を補っている。
(S10、S11)S変数.パスに含まれるファイル名本体(ファイル名から.cgiを除いた部分)が"login"であればS識別子を引数として認証制御部351を呼び出し、図4の処理を終了する。
(S12、S13)該ファイル名本体が"get"であればS識別子を引数としてGET処理制御部352を呼び出し、図4の処理を終了する。
(S14、S15)該ファイル名本体が"set"であればS識別子を引数としてSET処理制御部353を呼び出し、図4の処理を終了する。
(S16、S17)該ファイル名本体が"image"であればS識別子を引数としてイメージ処理制御部354を呼び出し、図4の処理を終了し、そうでなければ、すなわちフォースファイルであれば、ステップS13へ進む。
図2に戻って、GET処理制御部352は、S変数.クエリ文字列に含まれるパスを引数としてHTMLトランスレータ355を呼び出す。例えば、リクエスト行がGET /cgi-bin/get.cgi?htmfile=/start/start.html HTTP/1.1である場合、S変数.クエリ文字列はhtmfile=/start/start.htmlであり、このパス/start/start.htmlは、HTMLテンプレートファイルのパスである。HTMLトランスレータ355はこの呼出に応答して、図5(A)に示す処理を行う。
ここで、HTMLテンプレートファイル38の各々について、図5(B)に示す如く、そのパスとそのファイルサイズに対応したバイト数とを対応させたバッファサイズテーブル39が予め作成されている。このバイト数は例えば、ファイルサイズ自体、ファイルサイズの1.1倍又はファイルサイズに256バイトを加えたものなどである。
(S20)バッファサイズテーブル39から、指定されたテンプレートファイルに対応したバイト数を読取る。
(S21)図1に示すOS30のメモリマネージャ302を介し、DRAM14上のこのバイト数の一時記憶領域を獲得する。
(S22)テンプレートファイルから、ステートメント行カウンタSLCが示す行のステートメントを読み込み、このカウンタSLCを1だけインクリメントする。
(S23)ステップS22で読み込むべきステートメントが存在しなかった場合にはステップS29へ進み、そうでなければステップS24へ進む。
(S24)ステートメントがディレクティブ(HTMLトランスレータ355に対する指示文)であれば、後述のようにその処理を行う。
(S25〜S28)ステートメントがコンテキスト・トークン(以下、単にトークンと称す。)であれば、後述のようにこれを対応する文字列で置換したものを該一時記憶領域に書き込み、そうでなければステートメントをそのまま該一時記憶領域に書き込む。次に、ステップS22へ戻る。
ステップS25、S27又はS28においては、次の処理も行われる。
(S2A、S2B)該一時記憶領域に書き込む際に、該一時記憶領域が不足して書き込めない場合には、メモリマネージャ302を介し、ステップS20で取得したサイズの所定%、例えば10%だけ、一時記憶領域を拡大させる。
図6は、図5(A)のステップS27の詳細を示すフローチャートである。
(S30)トークンからトークンボディを抽出する。ここにトークンとは例えば、#l_NetworkSetting#又は#f_GetIPAddress#のように、トークン開始記号#とトークン終了記号#とを含む文字列である。トークンのうち、#と#の間の文字列を、トークンボディと称す。トークンボディの先頭部分は、トークンの種類を示しており、先頭2文字がl_、f_である場合、それぞれ言語トークン、関数トークンであることを示し、先頭3文字がmsgである場合、メッセージ・トークンであることを示す。
(S31)トークンボディの先頭2文字がl_であればステップS32へ進みf_であればステップS36へ進み、先頭3文字がmsgであればステップS39へ進む。
(S32)トークン名をハッシュ値に変換する。ここにトークン名とは、言語トークンにおけるトークンボディ中の3文字目以降の文字列である。
言語テーブルファイル40は、各国語の言語テーブルファイルを有し、各テーブルは、トークン名のハッシュ値とトークン名の値である文字列とが対応付けられている。
(S33)ステップS32で変換されたハッシュ値をキーとして、指定された言語テーブルファイルの内容を検索し、対応する値を得る。例えば、トークン名がNetworkSetingの場合、指定された言語が英語であれば"Network Setting" が得られ、日本語であれば"ネットワーク設定"が得られる。
指定された言語は、最初は既定値であり、後述のようにして変更され、langクッキーに保持され、lang値により言語テーブルファイル40内の1つが指定される。例えば、lang=0は英語を示し、lang=2は日本語を示す。
(S34)トークンをその値で変換する。例えばlang=0で言語トークンが#l_NetworkSetting#である場合、このトークンが"Network Setting"に変換される。
ここで、処理関数群356内の各関数の引数及び返り値の形式は統一されており、任意の関数funcは、C言語でfunc(chr **IN,chr ***OUT)と表される。引数IN及び返り値OUTはともに文字列の1次元動的配列である。INよりもOUTの方に記号*が1つ多く付加されているのは、返り値OUTの配列要素数を関数側で変更できるようにするため、すなわち関数側で動的配列にすることができるようにするためである。
関数トークンの場合にはこれがその関数名の関数の返り値*OUT[0]に変換される。メッセージ・トークン#msgX#(Xは自然数)の場合、これが関数の返り値*OUT[X]に変換される。
(S35)トークンの値にはトークンを含めることができ、この値にトークンが含まれている場合にはステップS30へ戻り、そうでなければ図6の処理を終了する。
(S36、S37)関数トークンに引数が含まれていれば、引数を抽出する。
引数は、クエリ文字列と同じ形式で記述され、デリミタとしての&により複数の引数を関数トークンに含むことができる。関数トークンにおけるトークンボディの3文字目以降&まで(&が無い場合は最後まで)を関数名と称す。例えば、関数トークン#f_func&arg1=XXX&arg2=YYY&arg3=ZZZ#は、関数名がfunc、引数名arg1の値がXXX、引数名arg2の値がYYY、引数名arg3の値がZZZであることを示す。一般に、引き数名argXの値は引数IN[X]に代入される。
(S38)関数トークンに含まれる関数名の関数に、関数トークンに含まれる引数を渡して、この関数を呼び出す。次にステップS34へ進む。
この関数は、図2の処理関数群356に含まれている。関数は、DBMS36を介してデータベース41内のデータを読出し又は変更することができる。このデータには、画像形成装置の各種設定値やトナー残量、印刷枚数などの状態が含まれている。
(S39)メッセージ・トークン#msgX#からインデックスX(X≧0)を取り出し、ステップS34へ進む。
例えば、関数トークン#f_getDHCPMode#で識別される関数getDHCPModeが*OUT[0]="#l_dhcp_on#"を返し、ステップS34で#f_getDHCPMode#が#l_dhcp_on#で置換され、ステップS35からステップS30へ戻る。lang=0の場合、ステップS33で"DHCP ON"が取得され、ステップS34で#l_dhcp_on#が"DHCP ON"で置換され、lang=2の場合、ステップS33で"DHCP オン"が取得され、ステップS34で#l_dhcp_on#が"DHCP オン"で置換される。
したがって、トークンを変数と言語の両方に応じて適当に変換することができるという効果を奏する。
他の例として、lang=2の場合、言語トークン#l_jobnum_msg#が"現在処理中のジョブは#f_getJobNum#個です。"に変換され、さらに、関数トークン#f_getJobNum#が*OUT[0]="10"に変換され、結果として、言語トークンl_jobnum_msg#が"現在処理中のジョブは10個です。"に変換される。lang=0の場合、言語トークン#l_jobnum_msg#が"#f_getJobNum# jobs are being processed"に変換され、さらに、関数トークン#f_getJobNum#が*OUT[0]="10"に変換され、結果として、言語トークンl_jobnum_msg#が"10 jobs are being processed"に変換される。
したがって、英語と日本語で文章中の変数の値"10" の位置が異なっても対応できるという効果を奏する。
本実施例1によれば、Webアプリケーション35に含まれる複数の関数の返り値の形式が統一されているので、Webアプリケーションの全体構成を簡単化することができるとともにチームによるソフトウエア設計が容易になるという効果を奏し、機能を拡張又は変更した製品の開発期間短縮に寄与するところが大きい。
また、複数の関数のそれぞれが関数側で返り値を複数にすることができるので、1つの関数を実行して得られる情報を複数箇所でそれぞれ異なる目的に用いることができ、複雑な構成を簡単化することができるという効果を奏する。
DBMS36は主に、設定値の変更に対する制限を課すものであり、値の範囲を制限したり、同時に設定値を変更できるクライアント数を一人に制限する。
図14(A)及び(B)は、Webクライアントマシーン20と画像形成装置10との間のメッセージ送受概略を示すシーケンス図である。
図14(A)において、Webクライアントマシーン20のブラウザ上から画像形成装置10のサイトのトップ頁を要求し、画像形成装置10がこれに応答して、Webクライアントマシーン20のブラウザ上に例えば図9(A)に示すような画面が表示される。この画面のHTMLファイルは、言語選択のフォームと、印刷画面又はFAX送信画面への移動を指示するフォームとを有している。
この言語選択フォームにおいて、ユーザがプルダウンメニュー中の項目(言語)を選択し、Goボタンを押下すると、選択した言語の情報を含むリクエストメッセージが画像形成装置10へ送信され、図2において、処理細振分部350からGET処理制御部352へ処理が移り、次いでHTMLトランスレータ355により、トップページのテンプレートファイルに含まれる言語トークンが、選択した言語の文字列に変換され、これがGET処理制御部352に返される。GET処理制御部352は、このリスポンスボディに、選択した言語のクッキーフィールドを付加し、HTTP処理スレッド341を介し残りのリスポンスヘッダを付加して、リクエストメッセージを完成させる。HTTP処理スレッド341は、このリスポンスメッセージを、OS30及びNIC18を介して、Webクライアントマシーン20へ送信する。これにより、Webクライアントマシーン20のブラウザには、選択した言語で図9(A)に示す内容が表示される。このHTTP処理スレッド341は、この送信後に消滅する。
Webクライアントマシーン20から画像形成装置10へ送信されるこれ以降のリクエストメッセージには、選択した言語を示すクッキーがリクエストヘッダに含まれるので、ブラウザに表示される文字列の言語が、選択したものとなる。
上記画面移動のフォームにおいて、ユーザがFAX送信画面のラジオボタンを選択し、移動ボタンを押下すると、リクエストURIにget.cgiを含むリクエストメッセージが画像形成装置10へ送信され、上記同様にして画像形成装置10によりリスポンスメッセージが生成され、これがWebクライアントマシーン20に送信されて、ブラウザ上に図9(B)に示すような画面が表示される。
ユーザが、プルダウンメニューでFAX送信の宛先を選択し、次いで参照ボタンをクリックしてブラウザに対しファイル選択ダイアログを表示させ、Webクライアントマシーン20のハードディスクに格納されているファイルを選択して送信ファイルを特定し、FAX送信ボタンを押下すると、選択した宛先と送信ファイルの内容とを含むリクエストメッセージが画像形成装置10へ送信される。
このリクエストメッセージに含まれるリクエスト行は例えば、POST /cgi-bin/image.cgi HTTP/1.1であり、ファイル名がimage.cgiであるので、図2の処理細振分部350からイメージ処理制御部354へ制御が移る。このメッセージのリクエストボディに含まれるクエリ文字列は例えば、func=sendFax&arg0=sendfile.pdf&arg1=1&okhtmfile=OK.html&failhtmfile=NG.htmlであり、これは上記S変数.クエリ文字列に格納されている。イメージ処理制御部354は、S識別子をイメージ処理部357へ渡し、イメージ処理部357はこれに基づいて、IN[0]="sendfile.pdf",IN[1]="1"を引数として処理関数群356中の関数sendFaxを呼出す。関数sendFaxでは、処理関数群356内の設定値取得関数を介して、データベース41から又は後述のクッキーから、FAX送信に使用する設定値を取得する。この点は、FAX送信以外のイメージ処理についても同様である。関数sendFaxは、取得した設定値を用い、送信ファイルsendfile.pdfの内容をFAX送信用の画像データに変換し、アドレス帳内の1番目の宛先へFAXを送信する。
上記送信が正常に行われたか否かの情報は、関数sendFaxにおいて返り値*OUT[0]に代入され、これがイメージ処理部357を介してイメージ処理制御部354に返される。イメージ処理制御部354は、上記クエリ文字列に基づき、*OUT[0]="OK"であれば、テンプレートファイルOK.htmlのパスをGET処理制御部352に与えてOK.htmファイルを生成させ、*OUT[0]="NG"であれば、テンプレートファイルNG.htmlのパスをGET処理制御部352に与えてNG.htmファイルを生成させる。本実施例では、テンプレートファイルの拡張子をhtmlとし、これに基づいて作成されたファイルの拡張子をhtmとしている。
例えば図11(A)に示す如く、テンプレートファイルOK.htmlにはメッセージ・トークン#msg1#が含まれ、図11(C)に示す如く、テンプレートファイルNG.htmlにはメッセージ・トークン#msg1#及び#msg2#が含まれており、メッセージ・トークン#msg1#及び#msg2#はHTMLトランスレータ355による図6のステップS39及びS34の処理により、それぞれ*OUT[1]及び*OUT[2]で置換される。これにより、テンプレートファイルOK.html及びNG.htmlからそれぞれ図11(B)及び(D)に示すようなHTMLファイルOK.htm及びNG.htmがGET処理制御部352により生成される。いずれの場合も、GET処理制御部352及びHTTP処理スレッド341を介しリスポンスヘッダがこれに付加されて、Webクライアントマシーン20へ送信される。
GET処理制御部352はまた、設定に応じて、送信完了又は送信失敗をユーザに通知するため、HTMLファイルOK.htm又はNG.htmの内容の電子メールを作成して、メール送信サーバ33のメールボックスへ格納させる(図10参照)。
本実施例1によれば、処理関数群356内の各関数の返り値の形式が上述のように統一されているので、同一テンプレートファイルOK.html及びNG.htmlに基づき、FAX送信結果以外のイメージ処理結果又は設定値変更結果を示すリスポンスメッセージボディも作成することができ、構成が簡単になる。
また、処理の種類毎に異なるテンプレートファイルを用いても、関数の返り値とメッセージ・トークンとが統一的に対応づけられているので、例えば図11(E)に示すように、処理結果のテンプレートファイルを容易に作成できるという効果を奏する。図11(F)は、図11(E)に示すテンプレートファイルOK.htmlに基づいて作成されたHTMLファイルOK.htmを示す。
図9(B)に戻って、プルダウンメニューに含まれる宛先の数は、後述する図9(C)画面を用いてユーザが追加又は削除することにより変化する。このような変化に対応して、図12(A)に示すようなテンプレートファイルが用いられる。このテンプレートファイルには、forディレクティブ<!-- for f_getCountOfAddress -->とend_forディレクティブ<!-- end_for -->とが含まれる。ディレクティブは、その開始記号<!--及び終了記号-->で識別される。
forディレクティブとend_forディレクティブとの間に配置されたステートメントに対する処理は、forディレクティブに含まれる繰り返し回数f_getCountOfAddressだけ繰り返される。この繰り返し回数は、定数であってもよいが、この例では、トークン識別記号#を省略した関数トークンf_getCountOfAddressが変数として用いられている。この関数トークンで識別される関数getCountOfAddressにより、アドレス帳に含まれる宛先の数が取得されて、その返り値*OUT[0]で関数トークンが置換される。
オプションタグに含まれるトークン"#f_m_Count&arg0=0#"中のf_m_は、関数Countが多価関数であることを示している。この関数は、上述の引数及び返り値の形式が統一された関数と同一であるが、forディレクティブでの繰り返しが何回目であるかを示す内部カウンタiの値により、関数の取り扱いが異なる。カウンタiが初期値0(繰り返し1回目)である場合のみこの関数が呼び出され、i≧0の各iについて多価関数トークン"#f_m_Count&arg0=0#"が*OUT[i]で置換される。これらのことは、アドレス帳内のi番目の宛先を*OUT[i]に代入する多価関数トークン#f_m_getAddress#についても同様である。
ディレクティブは、上述の図5(A)におけるステップS25で処理される。図7は、このステップS25での、主にforディレクティブに対する処理の詳細を示すフローチャートである。
(S40)forディレクティブ(for DIR)であればステップS41へ進み、そうでなければステップS4Cへ進む。
(S41)繰り返しカウンタiに初期値0を代入し、また、処理対象のステートメントがテンプレートファイル内の何行目であるかを示す行カウンタSLCの値をSLC0に代入して保存する。
(S42)テンプレートファイルから、カウンタSLCが示す行のステートメントを読み込み、この行カウンタを1だけインクリメントする。
(S43)このステートメントに多価関数トークンが含まれていればステップS44へ進み、そうでなければステップS47へ進む。
(S44、S45)i=0のときのみ、処理関数群356内の、多価関数トークンで識別される関数を呼び出す。この際、多価関数トークンに引数が含まれていればこれを抽出してこの関数に引き渡す。例えば多価関数トークンが"#f_m_Count&arg0=0#"である場合、IN[0]="0"を引き渡して関数Countを呼び出す。関数Countの*OUT[i]は、in[0]を数値に変換しこれに値iを加えたものを文字型に変換したものである。
(S46)多価関数トークンを*OUT[i]で置換し、ステップS48へ進む。
(S47)ステートメントに応じた処理を行う。
(S48)end_forディレクティブであればステップS49へ進み、そうでなければステップS42へ戻る。
(S49)繰り返しカウンタiを1だけインクリメントする。
(S4A)iの値がforディレクティブ内で指定された値imaxに等しければ図7の処理を終了し、そうでなければステップS4Bへ進む。
(S4B)ステートメント行カウンタSLCにSLC0を代入し、ステップS42へ戻る。
(S4C)他のディレクティブに対する処理を行って図7の処理を終了する。
このような処理を含む図5(A)の処理により、図12(A)に示すテンプレートファイルに基づいて、図12(B)に示すようなHTMLファイルがリスポンスボディとしてHTMLトランスレータ355により生成される。
図12(A)と図12(B)とを比べると、簡単化されたテンプレートファイルで任意の項目数のプルダウンメニューを作成可能であることが明らかである。上記forディレクティブは、C言語等の命令文で用いられる他のwhile文やdo−loopなどの制御ループにも同様に適用可能である。
次に、SET処理の具体例として、アドレス帳内の項目(宛先)を追加、変更又は削除する処理を説明する。
図14(B)は、図9(A)の画面から図9(B)の画面へ移った後、「アドレス帳を開く」ボタンをクリックして図9(C)の画面へ移り、編集処理を行い、これが成功した場合を示す。
「アドレス帳を開く」ボタンをクリックして得られるリクエストメッセージに対応したリスポンスメッセージは、上述の図9(A)で「移動」ボタンをクリックして得られるリクエストメッセージに対応したリスポンスメッセージと同様にして作成される。このメッセージのリスポンスボディは、図13(A)に示すテンプレートファイルに基づいてHTMLトランスレータ355により生成され、例えば図13(B)に示すものである。図13(A)中のforディレクティブ及び多価関数トークンは、図12(A)中のものと同様である。
図9(C)において、リストボックス内の項目をクリックして選択すると、この項目が反転表示されるとともに、クライアンドサイドのオンクリックイベントハンドラが呼び出されて、選択した項目が宛先ボックス内に表示される。ユーザが、この状態で「削除」のラジオボタンを選択し、または宛先ボックス内の文字列を変更して「変更」のラジオボタンを選択し、実行ボタンを押下すると、宛先ボックス内のデータと、選択した「変更」又は「削除」を示すデータと、図13(B)に示すFORMタグの属性値とを含むリクエストメッセージが、画像形成装置10へ送信される。
画像形成装置10では、このメッセージに対応した上述のS識別子を引数としてSET処理制御部353が起動され、処理関数群356内の対応する関数及びDBMS36を介してデータベース41内のアドレス帳データが更新又は削除される。
また、ユーザが、追加しようとする宛先を図9(C)の宛先ボックスに記入し、「追加」ラジオボタンを選択して実行ボタンを押下すると、前記と同様に、この宛先と、追加を示すデータと、図13(B)に示すFORMタグの属性値とを含むリクエストメッセージが画像形成装置10へ送信され、SET処理制御部353、処理関数群356及びDBMS36を介しデータベース41内のアドレス帳データに、この宛先が追加される。
設定値変更の他の例として、図9(B)に示す画面でFAX送信設定値ボタンを押下すると、そのリクエストメッセージに対応して、図10に示すような画面を表示するためのリスポンスメッセージが画像形成装置10からWebクライアントマシーン20へ送信される。この画面には、FAX受信までのコール回数選択ドロップダウンリスト、送信完了/失敗通知手段選択ドロップダウンリスト及びその宛先並びにアドレス帳選択ドロップダウンリストが表示されている。通知手段選択ドロップダウンリストには「e−mail」、「携帯電話」、「無し」の項目がある。
ここで、図2のデータベース41には、クライアントのIDと通知手段ごとの宛先アドレスとが登録されており、図10で宛先が「登録先」となっている場合には、この登録された宛先が用いられる。図10で選択されたアドレス帳は、図9(B)及び(C)で用いられる。
設定値変更の種類には、マイ設定と共通設定とがある。マイ設定はクライアント毎の設定であり、共通設定は各クライアントに共通の設定である。
マイ設定は、共通設定の一部または全部を、共通設定を変更せずにクッキーによりユーザ毎に設定値を書き換えるものである。このクッキーの値は、処理関数群356内の設定値取得関数で用いられる。すなわち、この関数は、該当するものがクッキーにあればその値を取得し、無ければDBMS36を介しデータベース41内の該当する設定値(共通設定値)を取得する。
共通設定は、データベース41に格納された設定であり、クッキーにより書き換えられない項目の設定値として用いられる。すなわち、処理関数群356内の設定値取得関数は、マイ設定でクッキーにより個別に変更されない項目については、データベース41内の共通設定値を取得する。
図10に示す「共通」は、マイ設定において共通設定の値が用いられ(クッキーを使用しない)又は共通設定において変更しないことを示している。共通設定値の変更は、管理者権限でログインしている場合のみ許可される。管理者権限でログインしているか否かは、後述の認証クッキーで判定される。
なお、管理者権限でログインしている場合、処理関数群356内の設定値取得関数はデータベース41内の共通設定値を取得する。
「変更」ボタンを押下すると、図10に示す情報を含むリクエストメッセージが画像形成装置10へ送信され、図2のSET処理制御部353及びこれに関係した部分で、図8に示すような処理が行われる。
(S50)SET処理制御部353は、S変数に基づいて例えば、IN[0]="my"(「マイ設定」),IN[1]="common"(FAX受信までのコール回数が「共通」),IN[2]="e-mail"(通知手段が「e-mail」),IN[3]="same"(宛先が「登録先」),IN[4]="DesignDepartment"(アドレス帳が「DesignDepartment」) とし、FAX送信設定値変更関数を呼び出す。
(S51)FAX送信設定値変更関数は、IN[0]に基づいて、共通設定とマイ設定のどちらが選択されたかを判定し、前者と判定した場合にはステップS52へ進み、後者と判定した場合にはステップS57へ進む。
(S52)FAX送信設定値変更関数は、認証クッキーに基づいて、管理者権限でログインしているか否かを判定し、肯定判定した場合にはステップS53へ進み、そうでなければステップS56へ進む。
(S53)FAX送信設定値変更関数は、IN[1]〜IN[4]の値で、DBMS36を介しデータベース41に格納されている対応する設定値を更新する。但し、IN[1]="common"であれば、FAX受信までのコール回数を更新しない。また、IN[3]="same"であれば、通知先を更新しない。
(S54)FAX送信設定値変更関数は、IN[3]についてDBMS36が設定値変更を許可した場合には*OUT[0]に"OK"を代入し、禁止した場合には*OUT[0]に"NG"を代入するとともにその原因を示す文字列をDBMS36から取得して*OUT[1]に代入する。設定値変更関数からSET処理制御部353にリターンする。
(S55)SET処理制御部353は、*OUT[0]が"OK"、"NG"又は"NotAuth"であればそれぞれ、テンプレートファイルOK.html、NG.html又はNotAuth.htmlのパスを引数としてGET処理制御部352を呼び出す。
GET処理制御部352はこれに応答して、HTMLトランスレータ355を介しテンプレートファイルに基づいてHTMLファイルを作成させ、このファイルにリスポンスヘッダの一部を付加する。作成されたNotAuth.htmには、そのフォームにユーザのID及びパスワードの入力ボックスが記述されている。GET処理制御部352は、HTTP処理スレッド341を介して残りのリスポンスヘッダを付加させ、リスポンスメッセージとしてWebクライアントマシーン20へ送信させ、図8の処理を終了する。
なお、ユーザのID及びパスワードは、画像形成装置10のサイトのトップ頁でも入力させるようにしてもよい。
(S56)*OUT[0]に"NotAuth"を代入し、ステップS55へ進む。
(S57)上記R識別子で識別される構造体変数の対応する要素の値、すなわち図10の設定値の名前とその値の組をそれぞれ、値が「共通」又は「登録先」であるものを除き、クッキーにセットする。このクッキーは、ステップS55において、ヘッダフィールドとされる。
(S58)IN[1]が"common"でない場合、文字数等が条件を満たしているか否かを判定し、肯定判定した場合には*OUT[0]に"OK"を代入し、否定判定した場合には*OUT[0]に"NG"を代入するとともにその原因を示す文字列を*OUT[1]に代入する。次にステップS55へ進む。
このような処理により、マイ設定と共通設定とを簡単かつ容易に行うことができるとともに、ユーザに応じたサービスを提供することができるという効果を奏する。
また、SET処理制御部353での処理が成功したか否かに応じて、GET処理制御部352を介しリスポンスボディを生成させるので、SET処理でGET処理を有効利用してソフトウエア構成を簡単化することができるという効果を奏する。
なお、共通設定は、管理者権限で操作パネル15を操作して直接変更することもできる。
また、ステップS52で正当な権限がないと判定され、ブラウザ上のNotAuth.htm表示画面でユーザのID及びパスワードが入力されて、これに対応したデータがリクエストメッセージとして画像形成装置10へ送信される。このメッセージのリクエスト行は例えば、POST /cgi-bin/login.cgi HTTP/1.1であり、上述のS識別子を引数として、図2において認証制御部351が起動される。
認証制御部351は、S変数の要素に格納されているユーザの前記データを引数として、処理関数群356内の関数Authを呼び出す。この関数は、DBMS36を介し、このデータに対応したデータがデータベース41内に登録されているか否かを判定し、肯定判定した場合には*OUT[0]に"OK"を代入し、否定判定した場合には*OUT[0]に"NotAuth"を代入する。認証制御部351は、*OUT[0]の内容に応じて、SET処理の場合と同様の処理を行う。ただし、認証制御部351は、*OUT[0]="OK"の場合、認証されたこと及び管理者権限が有るか否かを示す認証クッキー、例えば、Set-Cookie: login=admin_1068625073を、リスポンスヘッダフィールドとして、リスポンスボディに付加する。Webクライアントマシーン20がこのクッキーを受け取った後は、Webクライアントマシーン20から画像形成装置10へリクエストメッセージが送信される毎に、これに該クッキーが含まれる。
本実施例1によれば、Webアプリケーション35において、処理細振分部350により、クライアントからのリクエストURIに含まれるパスのファイル名に基づいて複数の処理制御部351〜354のいずれかに制御を移させ、複数の処理制御部351〜354のそれぞれが直接又は間接的に処理関数群356の中の少なくとも1つを介して処理を行わせるので、処理関数群356に新たな関数を追加したり、処理関数群356の中の1つ以上の関数を変更したり、複数の処理制御部351〜354に新たな処理制御部を追加することにより、容易に機能を拡張又は変更することができるという効果を奏し、新製品の開発期間短縮に寄与するところが大きい。
なお、本発明には外にも種々の変形例が含まれる。
例えば、上記実施例ではCGIを用いた場合を説明したが、本発明はCGIに限定されない処理の手法に特徴があるので、CGIの替わりにASPやJSPなどを用いた構成であってもよい。
また、関数の返り値は、関数の値であってもよい。関数は、関数とサブルーチンを区別するプログラム言語におけるサブルーチン、又はクラスのメンバ関数などであってもよい。引数は、メンバ変数を介して関数へ引き渡す構成であってもよい。
さらに、テンプレートファイルはHTMLファイルを作成するためのものに限定されず、XMLファイルなどの他のファイルを作成するためのものであってもよい。
また、メッセージ・トークンは、メッセージ以外にも利用可能である。
また、図3のステップS3において、パスに含まれるファイル名の拡張子がテンプレートファイルであることを示している場合に、ステップS2へ進む構成であってもよい。図4において、ファイル名拡張子が"cgi"でなければステップS13へ進むようにしてもよい。フォースファイル項目のパス及びこれと比較されるパスは、実パスであってもよい。
さらに、図3と図4の処理を1つにまとめた構成や、DBMS36を用いない構成であってもよい。メインWebサーバ34、Webアプリケーション35及びDBMS36はそれぞれプロセスとして動作する構成であってもよい。
また、汎用のinetd31及びhttpd32を用いずに、これらの機能をHTTP処理スレッド生成部340に含めた構成であってもよい。
また、上記実施例では情報処理装置が画像形成装置である場合を説明したが、本発明はこれに限定されず、本発明は特許請求の範囲に記載された構成を含むものであればよい。