以下、添付図面を参照して本発明の好適な実施形態を詳しく説明する。尚、以下の実施形態は特許請求の範囲に係る本発明を限定するものでなく、また本実施形態で説明されている特徴の組み合わせの全てが本発明の解決手段に必須のものとは限らない。なお、同一の構成要素には同一の参照番号を付して、説明を省略する。
以下で引用されるWindows7 Operating Systemの情報の内、特に詳しい説明を付加していないものに関しては、Microsoft Developer Network (MSDN)のサイトで公開されている情報である。以下において、WSDとは、Web Service on Devicesを表し、Windows Hardware Developer Centralのサイト上で公開されている情報である。また、WSDのPrint Service Definition Version 1.0は、Windows Hardware Developer Centralのサイト上で公開されている米国Microsoft Corporationが定義したPrint Serviceである。これらについては、説明を省略する。
以下において、WebサービスAPIにSSL通信で暗号化されたHTTPSのPOSTメソッド(通信方式の一例)を利用している場合があるが、このPOSTメソッドに関しては公知のものを用いることができる。また、以下において、WebサービスAPIにHTTPのGETメソッド(通信方式の一例)を利用している場合があるが、このGETメソッドに関しては公知のものを用いることができる。また、以下において、WebサービスAPIにSSL通信で暗号化されたHTTPSのGETメソッド(通信方式の一例)を利用している場合があるが、このGETメソッドに関しては公知のものを用いることができる。また、HTTPは、Hyper Text Transfer Protocolの略であり、暗号化されていない公知の通信プロトコルである。
また、HTTPSは、Hyper Text Transfer Protocol over Secure Socket Layerの略であり、暗号化された公知の通信プロトコルである。また、SSLは、Secure Socket Layerの略であり、インターネット上でデータを暗号化して送受信する公知の方法である。また、Google Cloud Print(GCP)は、インターネット上のサイトで公知の機能である。
[第1の実施形態]
[システム構成]
図1は、情報処理装置、及び周辺装置を含んで構成されるシステム構成の一例(画像形成システム)を示す図である。画像形成システムは、複数の情報処理装置と、複数の周辺装置と、端末装置と、を備えており、インターネットを介して相互に通信可能に構成されている。PC1、PC2、PC5、PC7、PC60、PC61及びPC741の各々は、情報処理装置(コンピュータ)の一例であり、例えば、一般的なパーソナルコンピュータである。PC1、PC2、PC5、PC7、PC60、PC61及びPC741の各々は、詳細は後述するが、図2(A)に示すハードウェアを含む。ここで、各PC(PC1,PC2,PC5,PC7,PC60,PC61,PC741)は、同じOSがインストールされていてもよいし、それぞれ異なるOSがインストールされていてもよい。各PCのOSは、特に限定されるものではない。本実施形態では、PC1には、第1のOS、例えば、Operating System(OS)としてGoogle Inc.製のChrome(登録商標)と同等のOSがインストールされている。また、PC2、PC5、PC60、PC61及びPC741の各々には、第2のOS、例えば、Microsoft Corporation製のWindows(登録商標)のServer用のOSがインストールされ、第3のOS、例えば、PC7には、Linux(登録商標)と同等のOSがインストールされている。PC1、PC2、PC5、PC7、PC60、PC61及びPC741は、それぞれEthernet(登録商標)等のインタフェース(I/F)で構成されるローカルエリアネットワーク(LAN)4、6、8、10、11に接続され、さらに、ワイドエリアネットワーク(WAN)(インターネット12)に接続される。すなわち、例えば、MFP3と、PC60と、PC61は、ローカルエリアネットワークにより接続されている。
マルチファンクションプリンタ(MFP)3、103は、周辺装置の一例であり、例えば、プリント機能、スキャナ機能、及びファクシミリ機能などを備える画像形成装置である。本実施形態では、各MFPは、カラーインクジェットプリンタ、カラーファクシミリ、カラースキャナ、フラッシュメモリ用の外部ストレージ等を含んで構成される。MFP3、103は、例えば、ABC社製のKmmnというモデル名のMFPとする。なお、周辺装置は、これに限定されるものではなく、プリンタ、複写機、ファクシミリ、スキャナ、デジタルカメラ、又はこれらの複合機能を備える装置等であってもよい。
MFP3は、Ethernet(登録商標)で構成されるネットワーク11に接続され、インターネット12にも接続されている。MFP103は、Ethernet(登録商標)で構成されるネットワーク104に接続され、さらに、ネットワーク104を介してインターネット12に接続されている。MFP3,MFP103は、詳細は後述するが、図2(B)に示すハードウェアを含む。
ルーター(Router)13は、例えば、Wi−Fi(登録商標)の無線LANを備えるブロードバンドルーター(Wi−Fi BB Router)であり、インターネット12に接続されている。モバイル端末(Mobile Devece)14は、例えば、携帯電話、携帯情報端末である。モバイル端末14は、詳細は後述するが、図2(A)に示すハードウェアを含む。モバイル端末14は、ルーター13と接続され、ルーター13を介してインターネット12に接続される。本実施形態に係るモバイル端末14には、第4のOS、例えば、Google Inc.製のAndroid(登録商標)と同等のOSがインストールされている。以下において、モバイル端末14は、その一例として携帯電話であるとする。
PC7は、サーバーとして機能し、アプリケーション(Application)145、アプリケーション(Application)146、アプリケーション(Application)147を備える。アプリケーション145は、Webサービスを利用した文書作成用のアプリケーションであり、以下、文書作成APP145と称する。アプリケーション146は、Webサービスを利用したクラウド印刷サービスを提供するアプリケーションであり、以下、クラウド印刷APP146と称する。アプリケーション147は、Webサービスを利用した画像や文書読取用のアプリケーションであり、以下、読取APP147と称する。
また、PC2は、サーバーとして機能し、アプリケーション(Application)を備える。アプリケーション143は、MFP3及びMFP103をクラウド印刷APP146が提供するクラウド印刷サービスに対応させるためのクラウド印刷プロキシサービスを提供するアプリケーションである。以下、プロキシAPP143と称する。PC2にインストールされているプロキシAPP143は、例えば、5000台のMFPを一度に管理することができ、それぞれのMFPをクラウド印刷APP146が提供するクラウド印刷サービスに対応させることができる。プロキシAPP143は、詳細は後述するが、図22に示すプリントキューを備える。
PC5は、サーバーとして機能し、アプリケーション(Application)144を備える。アプリケーション144は、PDFファイルをJPEGファイルに変換する画像変換サービスを提供するアプリケーションであり、以下、画像変換APP144と称する。
PC1、PC2、PC5、PC7、PC60、PC61、PC741、モバイル端末14、MFP3、及びMFP103は、インターネット12を介して相互に通信可能に接続されている。Webブラウザ(Web Browser)25は、PC1にインストールされ、Webブラウザ9は、モバイル端末14にインストールされている。Webブラウザ27、28は、MFP3、103にそれぞれインストールされている。Webブラウザ27と28は同一のものであるが、Webブラウザ9、25、27は、それぞれ異なるWebブラウザである。すなわち、Webブラウザ9、25、28は、それぞれ異なるWebブラウザである。Webブラウザ9、25、27、28が、HTTPリクエストのUser−Agentヘッダで文書作成APP145に渡すHTTPユーザーエージェントは、それぞれ異なり、例えば、次のように定義されている。
モバイル端末14のWebブラウザ9のユーザーエージェント:User-Agent: XXXX/5.0 (AAAA)
PC1のWebブラウザ25のユーザーエージェント:User-Agent: XXXX/6.0 (CCCC)
MFP3のWebブラウザ27のユーザーエージェント:User-Agent: YYYY/4.0 (DDDD)
AAAA、CCCC、DDDDが端末を識別する情報を表している。文書作成APP145は、これらの情報を利用して、端末の種類を識別(例えば、モバイル端末であるか、PCであるか、MFPであるか)を判別し、アプリケーションが表示する画面や、内部処理を切り換えることができる。
クラウド印刷APP146は、上述した通り、Webサービスを利用したクラウド印刷サービスを提供するものであり、例えば、Google Inc.が提供するGCPと同等の機能を有する。このクラウド印刷サービスを利用することで、PC1内のWebブラウザ25やモバイル端末14内のWebブラウザ9から、文書作成APP145を実行し、所望の文書を開き、その文書をMFP3やMFP103で印刷することができる。
詳細は後述するが、例えば、ユーザが、開いている文書を印刷する場合、図17に示す文書作成APP145により表示される画面の印刷メニュー401を選択すると、クラウド印刷APP146により図18に示す印刷画面142が表示される。ユーザが印刷画面142でプリンタを選択し、印刷ボタン534を押して印刷の実行を指示すると、文書作成APP145は、印刷画像をPDFファイルとして生成する。
そして、クラウド印刷APP146は、この印刷画像(PDFファイル)と印刷画面142で選択されている印刷設定値とから印刷ジョブ(印刷データ)を生成し、クラウド印刷サービス内の選択されたプリンタ用のプリントキューにその印刷ジョブを格納する。また、クラウド印刷APP146は、そのMFPに対して印刷ジョブ通知を送信する。但し、本実施形態においては、プロキシAPP143が、プリンタに対して印刷ジョブ通知を送信する。
MFPがPDFファイルをレンダリングする機能を備えている場合、MFPは、プリントキューに格納されている印刷ジョブを印刷することができる。しかしながら、廉価版のインクジェットプリンタやMFPにおいては、プリンタやMFPがPDFファイルをレンダリングする機能を備えていないことがある。この場合は、このようなプリンタ等でプリントキューに格納されている印刷ジョブを印刷する場合、PDFファイルの印刷画像を、JPEGファイル等、廉価版のプリンタ等でレンダリングできるタイプの画像フォーマットに変換すること(前処理)が必要となる。
ここで、クラウド印刷APP146が提供するクラウド印刷サービスを利用するためには、ユーザアカウントとパスワードとを用いたログインを必要とする。したがって、クラウド印刷サービスを利用するユーザに、ユーザアカウントとパスワードを登録させる。クラウド印刷APP146は、印刷に利用可能なMFPをクラウド印刷サービスに登録する際に、まず、そのユーザアカウントとパスワードとを使って、クラウド印刷サービスを利用する際のアクセストークンを取得する。そして、クラウド印刷APP146は、取得したアクセストークンを利用し、そのユーザアカウントにMFPを関連付けて登録する。
また、クラウド印刷APP146は、プリンタやMFPの登録の際に、各プリンタやMFPに対して一意の値で表わされるデバイスIDを発行して割り当て、デバイスIDを登録対象のプリンタやMFPに通知する。なお、プリンタやMFPの登録処理に関しては、公知の方法を用いることができる。
図2は、PC、モバイル端末、及びMFPのハードウェアの構成の一例を示す図である。PC1、PC2、PC5、PC7、PC60、PC61、PC741、及びモバイル端末14の各々は、図2(A)に示すハードウェアを含む。図2(A)では、PC1を例に挙げて説明する。
PC1は、ランダムアクセスメモリ部(RAM201)、ハードディスクドライブ部(HDD202)、キーボード部(KBD203)、CPU204、表示用ディスプレイ(LCD205)、ネットワークボード(NB207)を有する。また、PC1は、上述の構成要素を互いに接続するバス206を有する。
CPU204は、制御部の一例であり、PC1の中央処理装置として機能する。なお、HDD202は、記憶部の一例である。記憶部は、可搬性CD−ROMまたは内部に据付のROM、フラッシュメモリ、SSD等であってもよい。KBD203は、入力部の一例である。LCD205は、表示部の一例である。NB207は、通信制御部の一例である。
プロキシAPP143、図3に示す各モジュール(ソフトウェア)等のプログラムは、HDD202に記憶され、CPU204により必要に応じてRAM201に読み出されて実行される。これにより、プロキシAPP143の機能、図3に示す各モジュール(ソフトウェア)の機能などが実現される。また、各種のデータベース(DB)は、HDD202に設けられ、データベースの情報は、CPU204により必要に応じてRAM201に読み出される。
MFP3及びMFP103の各々は、図2(B)に示すハードウェアを含む。図2(B)では、MFP3を例に挙げて説明する。
MFP3は、CPU15,ROM16,RAM17,通信部18、記録部19、操作部20、表示部21、読取り部22、ファクシミリ制御部23、外部ストレージ制御部24を有する。また、MFP3は、上述の構成要素を互いに接続するバスを有する。
CPU15は、マイクロプロセッサ等から構成される。CPU15は、MFP3の中央処理装置として、ROM16に記憶されているプログラムに従って、RAM17、通信部18、記録部19、操作部20、表示部21、読取部22、ファクシミリ制御部23、及び外部ストレージ制御部24を制御する。
ROM16には、プリンタドライバ(不図示)による制御に従ってMFP3が行う記録(印刷)処理、印刷動作の状態をPCへ通知する処理などを実行するプログラムが記憶されている。また、ROM16には、FAXドライバ(不図示)による制御に従ってMFP3がファクシミリの送信処理または受信処理、ファクシミリ動作(送信または受信)の状態をPCへ通知する処理を実行するプログラムが記憶されている。RAM17には、印刷データが一時的に記憶される。印刷データは、主にPCから送られ、印刷データに基づき記録部19によって印刷される。また、RAM17には、読取部22で読取られた画像データ、PCから送られてきたファクシミリの送信データ、ファクシミリ制御部23で受信されたファクシミリの受信データ等も一時的に記憶される。
通信部18には、ネットワーク4用の接続ポート、アナログ電話回線用の接続ポート等が含まれており、Ethernet(登録商標)、ファクシミリのアナログ通信を制御する。記録部19は、インクジェット記録方式の記録ヘッド、各カラーインク、キャリッジ、記録紙搬送機構等から構成される記録ユニットと、印刷データを基に記録ヘッドにて印刷用パルスを発生させるためのASIC等から構成される電気回路とを含む。なお、記録部の記録方式はこれに限定されるものではなく、公知のものを用いることができる。
例えば、印刷可能なアプリケーション上での印刷操作、又はファクシミリの送信操作によって、アプリケーションで開かれているファイルの表示内容(画像データ)が、EMF形式のスプールファイルとしてPC2のHDD202に一時的に格納される。そして、スプールファイルは、プリンタドライバ、又はFAXドライバを介してMFP3制御用コマンドを含む印刷データ、又はファクシミリの送信データに変換された後、インターネットを介してMFP3に送られる。
MFP3にて受信された印刷データは、記録部19で印刷用パルスに変換され、記録紙(被記録媒体)上に印刷される。また、MFP3にて受信されたファクシミリの送信データは、ファクシミリ制御部23でファクシミリの通信プロトコルに変換され、アナログ電話回線を介して相手先のファクシミリ装置に送信される。
操作部20は、電源ボタン、リセットボタン等の各種ボタンから構成され、MFP3に対する操作を受け付ける。表示部21は、タッチパネルの液晶ディスプレイで構成され、MFP3の状態の表示、各種の設定情報や電話番号の表示、入力等を行うことができる。読取部22は、カラーイメージセンサや画像処理用のASIC等から構成される電気回路を含んで構成され、スキャナ機能を制御する。
ファクシミリ制御部23は、ファクシミリ用のモデム、アナログ通信回路等から構成され、ファクシミリの通信プロトコルに従ってファクシミリの送信および受信を制御する。外部ストレージ制御部24は、フラッシュメモリの装着用のスロット、ストレージ用のインタフェース回路等から構成され、装着されたフラッシュメモリを制御する。
図3は、PCのソフトウェアの構成の一例を示す図である。
図3(A)では、サーバーとして機能するPC2を例に挙げて説明する。PC2は、Applications82と、Internet Information Services(IIS)90と、JAVA(登録商標) Virtual Machine(Java(登録商標) VM)89と、IP Network91と、I/F92と、を有する。これらは、OSに標準で同梱されているモジュールである。
I/F92は、Ethernet(登録商標)等のI/Fを制御するI/F制御スタックである。IP Network91は、IP Networkを制御するIP Network制御スタックである。
IIS90は、IISを制御するIIS制御部であり、プロキシAPP143は、このIIS制御部のWebサーバー機能を利用してWebサービスを提供する。Java(登録商標) VM89は、Java(登録商標)バイトコードをプラットフォームのネイティブコードに変換して実行するソフトウェアであり、プロキシAPP143は、JAVA VM89上で実行される。
Applications82は、アプリケーション群であり、プロキシAPP143、アプリケーション150等から構成される。尚、アプリケーション150は、公知のアプリケーションの1つを表すものであり、ここではその詳細な説明を省略する。
図3(B)では、クライアントとして機能するPC60を例に挙げて説明する。PC60は、アプリケーション100と、インタフェース102と、デバイスドライバ107と、スタック101と、スタックスタック104と、スタック108と、スタック109と、スタック110と、を有する。
スタック110は、Ethernet(登録商標)を制御するEthernet(登録商標)制御スタックであり、スタック109は、IP Networkを制御するIP Network制御スタックである。また、スタック104は、WSDを制御するWSD制御スタックであり、スタック108は、IHVの独自プロトコルを制御するIHVネイティブプロトコル制御スタックである。また、スタック101はネットワークのプラグ・アンド・プレイ(以降、N−PnP)を制御するN−PnP制御スタックである。尚、ネットワーク接続デバイスに対するサポートを提供する、プラグ・アンド・プレイの一連の拡張機能として、Windows7OSに標準搭載されている機能として、Plug and Play Extensions(PnP−X)が存在するが、本実施形態では、それと同等の機能としてN−PnPを利用する例を挙げて説明する。後述するWSDを制御するWSDAPIsは、WSD制御スタック104に含まれる。IHVの独自プロトコルを制御するAPIsは、IHVネイティブプロトコル制御スタック108に含まれる。
デバイスドライバ107は、デバイスドライバ群であり、OSに標準で同梱されている標準ドライバ群105とIHVから提供されるIHV製ドライバ群106とから構成される。
アプリケーション100と、インタフェース102と、デバイスドライバ107と、スタック101と、スタック104と、標準ドライバ群105と、スタック108と、スタック109と、スタック110と、が、OSに標準で同梱されているモジュールである。そして、IHV製ドライバ群106及びスタック107が、IHV製モジュールである。
インタフェース102は、アプリケーション/DDIインタフェースであり、Application Programming Interface(API)、Device Driver Interface(DDI)から構成される。Applications100は、アプリケーション群であり、アプリケーション30等を含む。アプリケーション30は、後述する印刷可能なアプリケーションである。
図4は、PC60におけるプリンタドライバの構成を表す図である。同図において、プリンタドライバ50は、PC60にインストールされているMFP3用のプリンタドライバであり、MFP3の製造元であるABC社製から提供される。このプリンタドライバ50は、モジュール33〜36、39を含む。アプリケーション30は、印刷可能なアプリケーションであり、例えば、OSに標準で同梱されているテキストエディタであるNotepad(Notepad.exe)等に相当する。モジュール31は、Graphics Device Interface(GDI)であり、OSの一部である。プリンタキュー32は、スプーラ40の一部として構成され、印刷ジョブがキューイングされる。キューイングされた印刷ジョブは、プリンタキューフォルダ(不図示)に表示される。プリントプロセッサ33は、印刷レイアウトの変更や印刷画像に対する特殊処理を行う。グラフィックスドライバ34は、プリンタドライバの画像処理のコアとして、GDI31から送られる描画命令をもとに印刷用の画像処理を行い、印刷制御コマンドを作成する。
UIモジュール35は、プリンタドライバのユーザインタフェースの提供及び制御を行う。ランゲージモニタ36は、データの通信I/Fとしてデータの送受信を制御する。ステータスモニタ39は、MFP3のインクの残量や、警告、エラー等の状態を表示する。ポートモニタ37は、ランゲージモニタ36から送られるデータを適切なポートに対して送信したり、MFP3から送られるデータをクラスドライバ38を介して受信したりする処理を行う。特に、USBを制御するポートモニタのことをUSBMon、WSDのPrint Serviceを制御するポートモニタのことをWSDMonと呼ぶ。クラスドライバ38は、最もポートに近いローレベルのモジュールである。本実施形態では、WSDやIHVの独自プロトコルのプリンタクラスのドライバに相当し、ポート(本実施形態では、USBまたはネットワークポート)を制御する。
[WSD印刷におけるコーリングシーケンス]
図5〜図16までは、WSD印刷の処理に係るコーリングシーケンス、フローチャートの一例を示す図である。これらのコーリングシーケンス、フローチャートに係るプログラムは、PCまたはMFP内に記憶されている。PC上で動作するアプリケーションのプログラムは、HDD202に記憶されており、CPU204によりRAM201に読み出されて実行される。MFP上で動作するアプリケーションのプログラムは、ROM16に記憶されており、RAM17に読み出され、CPU15により実行される。
図5は、MFP3とローカルネットワークで接続されたPCから印刷時のコーリングシーケンスを示す図である。ここで、MFP3は、複数の印刷ジョブを受け付けることができ、そのうちの1つの印刷ジョブだけを処理して印刷を実行することができるプリンタであるとする。
図5において、ユーザがアプリケーション30から印刷を開始したのを検知すると(S501)、OSは、スプーラ40のStartPrintJob()関数をコールする。この関数内において(S502)、まず、スプーラ40は、ランゲージモニタ36のLM_StartDocPort()関数をコールする(S503)。この関数内において(S504)、ランゲージモニタ36は、lmMultipleJobsにFALSEを代入して初期化する(S505)。
このlmMultipleJobsは、ランゲージモニタ36内で使用されるフラグであり、MFP3が複数の印刷ジョブを受け付けて順次処理する機能を備えている場合にTRUEがセットされ、それ以外の場合にFALSEがセットされる。ランゲージモニタ36は、lmRetryに0を代入して初期化する(S506)。このlmRetryは、ランゲージモニタ36内で使用される変数であり、PC60がMFP3に発行する印刷ジョブ要求のリトライ回数を表す。ランゲージモニタ36は、lmReceivedIdに”None”を代入して初期化する(S507)。このlmReceivedIdには、図6で後述するS607、S623において、MFP3が印刷ジョブ要求の予約を受け付けた時に発行する印刷予約IDが代入される。
その後、ランゲージモニタ36は、ポートモニタ37のPM_StartDocPort()関数をコールする(S508)。この関数内において(S509)、ポートモニタ37は、必要に応じて適当な処理を行い(S510)、戻り値pmRetにその処理の結果を代入してこの関数を終了し、呼び出し元に戻る(S511)。通常、正常に処理された場合はpmRetにTRUEが代入され、それ以外の場合はpmRetにFALSEが代入される。
ランゲージモニタ36は、PM_StartDocPort()関数の戻り値を戻り値lmRetに代入して(S508)、LM_StartDocPort()関数を終了し、呼び出し元に戻る(S512)。スプーラ40は、このLM_StartDocPort()関数の戻り値をspRetに代入する(S503)。spRetがTRUEではない(FALSEである)場合(S513)、S503に戻り、スプーラ40は、ランゲージモニタ36のLM_StartDocPort()関数をコールする。S513においてspRetがTRUEの場合、図6のS601へ進む。図6において、印刷ジョブ要求の発行、予約処理に関して後述する。
最後に、スプーラ40は、ランゲージモニタ36のLM_EndDocPort()関数をコールする(S520)。この関数内において(S521)、ランゲージモニタ36は、lmMultipleJobsにFALSEを代入して初期化する(S522)。ランゲージモニタ36は、lmRetryに0を代入して初期化する(S523)。ランゲージモニタ36は、lmReceivedIdに”None”を代入して初期化する(S524)。その後、ランゲージモニタ36は、ポートモニタ37のPM_EndDocPort()関数をコールする(S525)。
この関数内において(S526)、ポートモニタ37は、必要に応じて適当な処理を行い(S527)、戻り値pmRetにその処理の結果を代入してこの関数を終了し、呼び出し元に戻る(S528)。通常、正常に処理された場合はpmRetにTRUEが代入され、それ以外の場合はpmRetにFALSEが代入される。ランゲージモニタ36は、PM_EndDocPort()関数の戻り値を戻り値lmRetに代入して(S525)、LM_EndDocPort()関数を終了し、呼び出し元に戻る(S529)。スプーラ40は、このLM_EndDocPort()関数の戻り値をspRetに代入し(S520)、StartPrintJob()関数を終了し、呼び出し元に戻る(S530)。
[印刷ジョブ要求の発行、予約処理]
図6は、MFP3とローカルネットワークで接続されたPCから印刷時のコーリングシーケンスを示す図である。図6において、スプーラ40は、ランゲージモニタ36のLM_WritePort()関数をコールする(S602)。この関数内において(S603)、ランゲージモニタ36は、lmRetryとlmMultipleJobsの値を確認し(S604)、lmRetryが0より大きく、かつ、lmMultipleJobsがTRUEの場合、S605へ進み、lmRetryが0またはlmMultipleJobsがTRUEではない(FALSEである)場合、S609へ進む。
S605において、ランゲージモニタ36は、引数にans:ABCCommandをセットして、WSDを制御するWSDAPIsのGetPrinterElements()関数をコールする。この関数内において、PC60は、WSDのPrint ServiceのGetPrinterElementsRequestをMFP3に発行する。このGetPrinterElementsRequestに対して、MFP3は、GetPrinterElementsResponseをPC60に返す(S606)。PC60がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元に戻る(S605)。PC60がMFP3に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元に戻る(S605)。
S605において、ランゲージモニタ36は、GetPrinterElements()関数の戻り値をlmRetに代入する。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。S605でPC60が発行するGetPrinterElementsRequestと、それに対してMFP3が返すGetPrinterElementsResponseの詳細に関しては図9、図10で説明する。
ランゲージモニタ36は、S605のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の<ans:ReceivedId>要素912または1011にセットされている値を、lmReceivedIdに代入する(S607)。ランゲージモニタ36は、lmReceivedIdの値を確認し、「None」の場合(S627)、lmRetryに0を代入して印刷ジョブ要求のリトライ回数を初期化する(S628)。lmReceivedIdの値が「None」ではない場合(S629)、ランゲージモニタ36は、lmRetryに1を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新する(S608)。
S609において、ランゲージモニタ36は、ポートモニタ37のPM_WritePort()関数をコールする。この関数内において(S610)、ポートモニタ37は、WSDを制御するWSDAPIsのCreatePrintJob()関数をコールする(S611)。この関数内において、PC60は、WSDのPrint ServiceのCreatePrintJobRequestをMFP3に発行する。このCreatePrintJobRequestの中に、この印刷ジョブに関する詳細情報が含まれている。このCreatePrintJobRequestに対して、MFP3は、CreatePrintJobResponseまたはFault(ServerErrorNotAcceptingJobs)をPC60に返す(S612)。
例えば、MFP3が印刷ジョブを受け付けて、この印刷ジョブを実行することができる状態の時に、その印刷ジョブを受け付けた場合、MFP3は、CreatePrintJobResponseをPC60に返す。MFP3が印刷ジョブを受け付けることはできるが、この印刷ジョブを実行することができない状態の時に、その印刷ジョブを受け付けた場合、MFP3はFault(ServerErrorNotAcceptingJobs)をPC60に返す。また、MFP3が印刷ジョブを受け付けることができない場合も、MFP3は、Fault(ServerErrorNotAcceptingJobs)をPC60に返す。PC60がCreatePrintJobResponseを受け取ると、CreatePrintJob()関数の戻り値にTRUEが代入されて、呼び出し元に戻る(S613)。PC60がFault(ServerErrorNotAcceptingJobs)を受け取ると、CreatePrintJob()関数の戻り値にFALSEが代入されて、呼び出し元に戻る(S611)。
ポートモニタ37は、戻り値pmRetにCreatePrintJob()関数の戻り値を代入して(S611)、PM_WritePort()関数を終了し、呼び出し元に戻る(S613)。ランゲージモニタ36は、PM_WritePort()関数の戻り値を戻り値lmRetに代入する(S609)。ランゲージモニタ36は、lmRetの値を確認し(S614)、TRUEの場合、S625へ進み、TRUEではない(FALSEである)場合、lmRetryの値を確認する(S615)。S615において、lmRetryが0の場合、ランゲージモニタ36は、引数にwprt:PrinterDescriptionをセットして、WSDを制御するWSDAPIsのGetPrinterElements()関数をコールする(S616)。
この関数内において、PC60は、WSDのPrint ServiceのGetPrinterElementsRequestをMFP3に発行する。このGetPrinterElementsRequestの中に、MFP3が複数の印刷ジョブを受け付けることができるか否かを表す<ans:MultipleJobsControl>要素802(図8(b)で後述)を取得する為に必要な<wprt:Name>wprt:PrinterDescription</wprt:Name>要素801(図8(A)で後述)が含まれている。このGetPrinterElementsRequestに対して、MFP3は、GetPrinterElementsResponseをPC60に返す(S617)。PC60がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元に戻る(S616)。PC60がMFP3に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元に戻る(S616)。
S616において、ランゲージモニタ36は、GetPrinterElements()関数の戻り値をlmRetに代入する。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。ランゲージモニタ36は、GetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の<ans:MultipleJobsControl>要素802にセットされている値を確認する(S618)。S618において、<ans:MultipleJobsControl>要素802に「true」がセットされている場合、lmMultipleJobsにTRUEを代入する(S619)。S615において、lmRetryが0以外(S608、S624でlmRetryに代入される値は0以上の整数なので、実際には0より大きい整数)の場合、S620へ進む。
S620において、lmMultipleJobsがTRUEの場合、ランゲージモニタ36は、引数にans:ABCCommandをセットして、WSDを制御するWSDAPIsのGetPrinterElements()関数をコールする(S621)。
この関数内において、PC60は、WSDのPrint ServiceのGetPrinterElementsRequestをMFP3に発行する。このGetPrinterElementsRequestに対して、MFP3は、GetPrinterElementsResponseをPC60に返す(S622)。PC60がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元に戻る(S621)。PC60がMFP3に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元に戻る(S621)。
S621において、ランゲージモニタ36は、GetPrinterElements()関数の戻り値をlmRetに代入する。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。S621でPC60が発行するGetPrinterElementsRequestと、それに対してMFP3が返すGetPrinterElementsResponseの詳細に関しては図9、図10で説明する。
ランゲージモニタ36は、S621のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の<ans:ReceivedId>要素912または1011にセットされている値、すなわち印刷予約IDを、lmReceivedIdに代入する(S623)。
ランゲージモニタ36は、lmReceivedIdの値を確認し、「None」の場合(S630)、lmRetryに0を代入して印刷ジョブ要求のリトライ回数を初期化する(S631)。lmReceivedIdの値が「None」ではない場合(S632)、ランゲージモニタ36は、lmRetryに1を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新する(S624)。
S620において、lmMultipleJobsがTRUEではない(FALSEである)場合、S625へ進む。S625において、ランゲージモニタ36は、LM_WritePort()関数を終了し、呼び出し元に戻る。この時、このLM_WritePort()関数の戻り値として、lmRetの値が返される。スプーラ40は、このLM_WritePort()関数の戻り値をspRetに代入する(S602)。spRetがTRUEではない(FALSEである)場合(S626)、S602に戻り、スプーラ40は、ランゲージモニタ36のLM_WritePort()関数をコールする。S626においてspRetがTRUEの場合、スプーラ40は、引き続き図7に示す印刷データの送信処理を行う。
[印刷データの送信処理]
図7は、印刷時のコーリングシーケンスを示す図である。図6のS626において、spRetがTRUEの場合、図7において、スプーラ40は、ランゲージモニタ36のLM_WritePort()関数をコールする(S701)。この関数内において(S702)、ランゲージモニタ36は、ポートモニタ37のPM_WritePort()関数をコールする(S703)。この関数内において(S704)、ポートモニタ37は、WSDを制御するWSDAPIsのSendDocument()関数をコールする(S705)。
この関数内において、PC60は、WSDのPrint ServiceのSendDocumentRequestをMFP3に発行し、MTOM(Message Transmission Optimization Mechanism)メッセージエンコーディングを使って、印刷制御コマンドで構成された印刷データを、SOAPメッセージを使用して未処理のバイトとしてMFP3に送信する。MFP3は、SendDocumentRequestに対してSendDocumentResponseをPC60に返す(S706)。PC60がSendDocumentResponseを受け取り、全ての印刷データをMFP3に送信し終わると、SendDocument()関数の戻り値にTRUEが代入されて、呼び出し元に戻る(S705)。
PC60がSendDocumentRequestを発行した時、あるいはSendDocumentResponseを受け取った時に何らかのエラーが発生した場合、SendDocument()関数の戻り値にFALSEが代入されて、呼び出し元に戻る(S705)。ポートモニタ37は、戻り値pmRetにSendDocument()関数の戻り値を代入して(S705)、PM_WritePort()関数を終了し、呼び出し元に戻る(S707)。
ランゲージモニタ36は、PM_WritePort()関数の戻り値を戻り値lmRetに代入して(S703)、LM_WritePort()関数を終了し、呼び出し元に戻る(S708)。スプーラ40は、このLM_WritePort()関数の戻り値をspRetに代入する(S701)。spRetがTRUEではない(FALSEである)場合(S709)、S701に戻り、スプーラ40は、ランゲージモニタ36のLM_WritePort()関数をコールする。S709においてspRetがTRUEの場合、図5のS520へ進む。
[ランゲージモニタ36におけるLM_WritePort()関数の処理]
図14は、ランゲージモニタ36におけるLM_WritePort()関数の処理の手順を示すフローチャートである。図14のフローに係るプログラムは、HDD202に記憶されており、RAM201に読み出され、CPU204により実行される。図6において、スプーラ40がランゲージモニタ36のLM_WritePort()関数をコールすると、図14において、ランゲージモニタ36がLM_WritePort()関数の処理を開始する(S1401)。ランゲージモニタ36は、lmRetryとlmMultipleJobsの値を確認し(S1402)、lmRetryが0より大きく、かつ、lmMultipleJobsがTRUEの場合、S1404へ進む。一方、lmRetryが0またはlmMultipleJobsがTRUEではない(FALSEである)場合、S1409へ進む(S1403)。
S1404において、ランゲージモニタ36は、引数にans:ABCCommandをセットして、WSDを制御するWSDAPIsのGetPrinterElements()関数をコールする。この関数内において、PC60は、WSDのPrint ServiceのGetPrinterElementsRequestをMFP3に発行する(S1404)。このGetPrinterElementsRequestに対して、MFP3は、GetPrinterElementsResponseをPC60に返す(図6のS606、図13のS1319)。
PC60がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元であるランゲージモニタ36に戻る(S1404)。PC60がMFP3に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元であるランゲージモニタ36に戻る(S1404)。ランゲージモニタ36は、GetPrinterElements()関数の戻り値をlmRetに代入する(S1404)。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。S1404でPC60が発行するGetPrinterElementsRequestと、それに対してMFP3が返すGetPrinterElementsResponseの詳細に関しては図9、図10で説明する。
ランゲージモニタ36は、S1404のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の<ans:ReceivedId>要素912または1011にセットされている値を、lmReceivedIdに代入する(S1405)。ランゲージモニタ36は、lmReceivedIdの値を確認し(S1406)、「None」の場合、S1407へ進み、「None」ではない場合、S1408へ進む。
S1407において、ランゲージモニタ36は、lmRetryに0を代入して印刷ジョブ要求のリトライ回数を初期化し、S1409へ進む。一方、S1408において、ランゲージモニタ36は、lmRetryに1を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新し、S1409へ進む。
S1409において、ランゲージモニタ36は、ポートモニタ37のPM_WritePort()関数をコールする。この関数内におけるポートモニタ37の処理は、図15(A)で後述する。ランゲージモニタ36は、PM_WritePort()関数の戻り値を戻り値lmRetに代入する(S1409)。ランゲージモニタ36は、lmRetの値を確認し(S1410)、TRUEの場合、S1421へ進み、TRUEではない(FALSEである)場合、S1411へ進む。S1411において、ランゲージモニタ36は、lmRetryの値を確認し、0の場合、S1412へ進み、0以外の場合、S1415へ進む。0以外の場合とは、S1408、S1420でlmRetryに代入される値は0以上の整数なので、実際には0より大きい整数の場合である。
S1412において、ランゲージモニタ36は、引数にwprt:PrinterDescriptionをセットして、WSDを制御するWSDAPIsのGetPrinterElements()関数をコールする。この関数内において、PC60は、WSDのPrint ServiceのGetPrinterElementsRequestをMFP3に発行する(S1412)。このGetPrinterElementsRequestの中に、MFP3が複数の印刷ジョブを受け付けることができるか否かを表す<ans:MultipleJobsControl>要素802(図8(B)で後述)を取得する為に必要な<wprt:Name>wprt:PrinterDescription</wprt:Name>要素801(図8(A)で後述)が含まれている。このGetPrinterElementsRequestに対して、MFP3は、GetPrinterElementsResponseをPC60に返す(図6のS617、図13のS1319)。
PC60がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元であるランゲージモニタ36に戻る(S1412)。PC60がMFP3に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元であるランゲージモニタ36に戻る(S1412)。ランゲージモニタ36は、GetPrinterElements()関数の戻り値をlmRetに代入する(S1412)。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。ランゲージモニタ36は、GetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の<ans:MultipleJobsControl>要素802にセットされている値を確認する(S1413)。
S1413において、<ans:MultipleJobsControl>要素802に「true」がセットされている場合、S1414へ進み、それ以外の場合、S1415へ進む。S1414において、ランゲージモニタ36は、lmMultipleJobsにTRUEを代入し、S1415へ進む。S1415において、ランゲージモニタ34は、lmMultipleJobsの値を確認し、TRUEの場合、S1416へ進み、TRUEではない(FALSEである)場合、S1421へ進む。
S1416において、ランゲージモニタ36は、引数にans:ABCCommandをセットして、WSDを制御するWSDAPIsのGetPrinterElements()関数をコールする。この関数内において、PC60は、WSDのPrint ServiceのGetPrinterElementsRequestをMFP3に発行する。このGetPrinterElementsRequestに対して、MFP3は、GetPrinterElementsResponseをPC60に返す(図6のS622、図13のS1319)。PC60がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元であるランゲージモニタ36に戻る(S1416)。PC60がMFP3に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元であるランゲージモニタ36に戻る(S1416)。ランゲージモニタ36は、GetPrinterElements()関数の戻り値をlmRetに代入する(S1416)。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。S1416でPC60が発行するGetPrinterElementsRequestと、それに対してMFP3が返すGetPrinterElementsResponseの詳細に関しては図9、図10で説明する。
ランゲージモニタ36は、S1416のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の<ans:ReceivedId>要素912または1011にセットされている値、すなわち印刷予約IDを、lmReceivedIdに代入し(S1417)、S1418へ進む。ランゲージモニタ36は、lmReceivedIdの値を確認し(S1418)、「None」の場合、S1419へ進み、「None」ではない場合、S1420へ進む。S1419において、ランゲージモニタ36は、lmRetryに0を代入して印刷ジョブ要求のリトライ回数を初期化し、S1420へ進む。S1420において、ランゲージモニタ36は、lmRetryに1を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新する。S1421において、ランゲージモニタ36は、LM_WritePort()関数の戻り値として、lmRetをスプーラ40にリターンして返し、LM_WritePort()関数の処理を終了して、呼び出し元であるスプーラ40に戻る(S1422)。
[ポートモニタ37におけるPM_WritePort()関数の処理]
図15は、ポートモニタ37におけるPM_WritePort()関数の処理の手順を示すフローチャートである。図15のフローに係るプログラムは、HDD202に記憶されており、RAM201に読み出され、CPU204により実行される。図14のS1409において、ランゲージモニタ36がポートモニタ37のPM_WritePort()関数をコールすると、図15(A)において、ポートモニタ37がPM_WritePort()関数の処理を開始する(S1501)。ポートモニタ37がCreatePrintJobの状況を確認し(S1502)、CreatePrintJobRequestを発行して、それに対する応答としてCreatePrintJobResponseを既に受信済みの場合(S1503)、S1505へ進み、それ以外の場合、S1504へ進む。S1505において、ポートモニタ37は、戻り値pmRetにTRUEを代入する。
S1504において、ポートモニタ37は、WSDを制御するWSDAPIsのCreatePrintJob()関数をコールする。この関数内において、PC60は、WSDのPrint ServiceのCreatePrintJobRequestをMFP3に発行する(S1504)。このCreatePrintJobRequestの中に、この印刷ジョブに関する詳細情報が含まれている。このCreatePrintJobRequestに対して、MFP3は、CreatePrintJobResponseまたはFault(ServerErrorNotAcceptingJobs)をPC60に返す(図6のS612)。例えば、MFP3が印刷ジョブを受け付けて、この印刷ジョブを実行することができる状態の時に、その印刷ジョブを受け付けた場合、MFP3は、CreatePrintJobResponseをPC60に返す(図6のS612)。MFP3が印刷ジョブを受け付けることはできるが、この印刷ジョブを実行することができない状態の時に、その印刷ジョブを受け付けた場合、MFP3は、Fault(ServerErrorNotAcceptingJobs)をPC60に返す(図6のS612)。また、MFP3が印刷ジョブを受け付けることができない場合も、MFP3は、Fault(ServerErrorNotAcceptingJobs)をPC60に返す(図6のS612)。
PC60がCreatePrintJobResponseを受け取ると、CreatePrintJob()関数の戻り値にTRUEが代入されて、呼び出し元であるポートモニタ37に戻る(S1504)。PC60がFault(ServerErrorNotAcceptingJobs)を受け取ると、CreatePrintJob()関数の戻り値にFALSEが代入されて、呼び出し元であるポートモニタ37に戻る(S1504)。ポートモニタ37は、戻り値pmRetにCreatePrintJob()関数の戻り値を代入する(S1504)。ポートモニタ37は、PM_WritePort()関数の戻り値として、pmRetをランゲージモニタ36にリターンして返し(S1506)、PM_WritePort()関数の処理を終了して、呼び出し元であるランゲージモニタ36に戻る(S1507)。
図7のS703において、ランゲージモニタ36がポートモニタ37のPM_WritePort()関数をコールすると、図15(B)において、ポートモニタ37がPM_WritePort()関数の処理を開始する(S1508)。ポートモニタ37がSendDocumentの状況を確認し(S1509)、SendDocumentRequestを発行して、それに対する応答としてSendDocumentResponseを既に受信済みの場合(S1510)、S1512へ進み、それ以外の場合、S1511へ進む。
S1512において、ポートモニタ37は、戻り値pmRetにTRUEを代入する。S1511において、ポートモニタ37は、WSDを制御するWSDAPIsのSendDocument()関数をコールする(図7のS705)。この関数内において、PC60は、WSDのPrint ServiceのSendDocumentRequestをMFP3に発行し、MTOM(Message Transmission Optimization Mechanism)メッセージエンコーディングを使って、印刷制御コマンドで構成された印刷データを、SOAPメッセージを使用して未処理のバイトとしてMFP3に送信する(S1511)。MFP3は、SendDocumentRequestに対してSendDocumentResponseをPC60に返す(図7のS706)。
PC60がSendDocumentRequestを発行した時、あるいはSendDocumentResponseを受け取った時に、何らかのエラーが発生した場合、SendDocument()関数の戻り値にFALSEが代入されて、呼び出し元に戻る(S1511)。ポートモニタ37は、戻り値pmRetにSendDocument()関数の戻り値を代入する(S2111)。PC60がSendDocumentResponseを受け取り、全ての印刷データをMFP3に送信し終わると、SendDocument()関数の戻り値にTRUEが代入されて、呼び出し元であるポートモニタ37に戻る(S1513)。ポートモニタ37は、戻り値pmRetにSendDocument()関数の戻り値を代入する(S1513)。ポートモニタ37は、PM_WritePort()関数の戻り値として、pmRetをランゲージモニタ36にリターンして返し(S1514)、PM_WritePort()関数の処理を終了して、呼び出し元であるランゲージモニタ36に戻る(S1515)。
図8〜図10は、GetPrinterElementsの内容を示す図であり、図11は、CreatePrintJobの内容を示す図である。GetPrinterElementsオペレーションは、通常、プリンタに関する情報を取得する為に用いられる。CreatePrintJobオペレーションは、印刷ジョブの開始要求である。以下、WSDのPrint Service Definition Version 1.0で定義されているGetPrinterElements、CreatePrintJobの内容については、説明を省略する。
[CreatePrintJobの内容]
図11は、CreatePrintJobの内容を示す図であり、図11(A)は、CreatePrintJobRequest、図11(B)は、CreatePrintJobResponseをそれぞれ表す。
図11(A)は、CreatePrintJobRequestを示す図である。同図に示すCreatePrintJobRequestは、PC60からMFP3に発行されるものの一例である。同図において、記述1105は、WSDのPrint Serviceの名前空間を名前空間名wprtと定義している。名前空間名wprtの有効範囲内は、WSDのPrint Service Definition Version 1.0で定義されているパブリック情報を示す。以下、名前空間名wprtは同様に取り扱われ、名前空間名wprtの有効範囲内は、WSDのPrint Service Definition Version 1.0で定義されているパブリック情報を示す。記述1101は、<wprt:JobDescription>要素であり、また、パブリック情報であり、この中に印刷ジョブに関する情報が含まれている。記述1102は、<wprt:JobName>要素であり、また、パブリック情報である印刷ジョブ名がセットされる。この例では、「Photo2」という印刷ジョブ名がセットされている。記述1103は、<wprt:JobOriginatingUserName>要素であり、また、パブリック情報である、この印刷ジョブを発行したユーザ名がセットされる。この例では、「Natsu」というユーザ名がセットされている状態を示す。
図11(B)は、CreatePrintJobResponseを示す図である。同図に示すCreatePrintJobResponseは、MFP3からPC60に返されるものの一例である。同図において、記述1104は、<wprt:JobId>要素であり、また、パブリック情報であり、PC60から発行されたCreatePrintJobRequestで要求された印刷ジョブに対して、MFP3がこの印刷ジョブを受け付けた時に、この印刷ジョブを識別する為にMFP3が発行したジョブIDがセットされる。この例では、「1234」というジョブIDがセットされている状態を示す。
[GetPrinterElementsの内容]
図8は、GetPrinterElementsの内容を示す図であり、図8(A)は、GetPrinterElementsRequestを、図8(B)は、GetPrinterElementsResponseをそれぞれ示す。
図8(A)は、GetPrinterElementsRequestを示す図である。同図に示すGetPrinterElementsRequestは、PC60からMFP3に発行されるものの一例である。同図において、記述801は、<wprt:Name>要素であり、また、パブリック情報であり、その値としてwprt:PrinterDescriptionがセットされている。
図8(B)は、GetPrinterElementsResponseを示す図である。同図に示すGetPrinterElementsResponseは、MFP3からPC60に返されるものの一例である。MFP3は、wprt:PrinterDescriptionがセットされた<wprt:Name>要素801を含むGetPrinterElementsRequestを受け取った時、GetPrinterElementsResponseでwprt:PrinterDescriptionをPC60に返す。同図において、記述806は、ABC社のWSDを利用したPrint Serviceの名前空間を名前空間名ansと定義している。名前空間名ansの有効範囲内は、ABC社のWSDを利用したPrint Serviceで定義されているプライベート情報である。以下、名前空間名ansは同様に取り扱われ、名前空間名ansの有効範囲内は、ABC社のWSDを利用したPrint Serviceで定義されているプライベート情報を示す。記述803は、<wprt:ElementData>要素であり、また、パブリック情報であり、Name属性としてパブリック情報のwprt:PrinterDescriptionがセットされている。これは、このGetPrinterElementsResponseが、<wprt:Name>要素801で指定されたwprt:PrinterDescriptionを含んでいることを示す。
記述805は、<wprt:PrinterDescription>要素であり、また、パブリック情報であり、MFP3に搭載されている機能等に関する情報が、この中に含まれている。記述804は、<wprt:DeviceId>要素であり、また、パブリック情報であり、IEEE 1284-2000ノDevice IDで定義されたデータ(文字列)がセットされている。これは、MFP3のDevice IDを示す。この例では、「MFG:ABC;CMD:ABCCommand;MDL:Kmmn;CLS:PRINTER;DES:ABC Kmmn;VER:1.00;INFO:000;」というDevice IDがセットされている状態を示す。記述802は、<ans:MultipleJobsControl>要素であり、また、プライベート情報であり、MFP3が複数印刷ジョブ制御機能を備えるプリンタであるか否かを示す。この複数印刷ジョブ制御機能とは、そのプリンタが複数の印刷ジョブを受け付けることができ、その内の1つの印刷ジョブを処理して印刷を実行することができる、という機能である。プリンタがこの機能を備える場合は「true」が、この機能を備えない場合は「false」が、この要素にセットされる。この例では、「true」がセットされている状態を示す。
図9は、GetPrinterElementsの内容を示す図であり、図9(A)は、GetPrinterElementsRequest、図9(B)は、GetPrinterElementsResponseをそれぞれ示す。
図9(A)は、GetPrinterElementsRequestを示す図である。同図に示すGetPrinterElementsRequestは、PC60からMFP60に発行されるものの一例である。同図において、記述903は、<wprt:Name>要素であり、また、パブリック情報であり、その値としてans:ABCCommandがセットされている。このans:ABCCommandは、プライベート情報である。記述904は、<ans:ABCCommand>要素であり、また、プライベート情報であり、この中に、<ans:SplJobId>要素905、<ans:ReceivedId>要素906、<ans:Retry>要素901、<ans:OSVersion>要素907、<ans:DateTime>要素908が含まれている。
要素905、906、901、907、908は、全てプライベート情報であり、ランゲージモニタ36がGetPrinterElementsRequest内のこれらの要素に、それぞれ適切な値をセットする。ランゲージモニタ36は、図5のS503でスプーラ40がLM_StartDocPort()関数をコールした時に渡される第3引数JobIdにセットされている値(ジョブID)を、<ans:SplJobId>要素905にセットする。スプーラ40からランゲージモニタ36に渡されたこのジョブIDは、PC60内のOSから発行されたものであるので、<ans:SplJobId>要素905にセットされる値は、MFP3から発行されて<wprt:JobId>要素1104にセットされるジョブIDとは全く異なるものである。この例では、「5」という値がセットされている状態を表す。LM_StartDocPort()関数の仕様は次に示す通りである。
BOOL WINAPI LM_StartDocPort(
HANDLE hPort,
LPWSTR pPrinterName,
DWORD JobId,
DWORD Level,
LPBYTE pDocInfo
);
- Parameters -
hPort: Caller-supplied port handle.
pPrinterName: Caller-supplied pointer to a string containing the printer name.
JobId: Caller-supplied, spooler-assigned job identifier.
Level: Caller-supplied value indicating the type of structure pointed to by pDocInfo. Possible values are as follows:
Level pDocInfo
1 DOC_INFO_1
2 DOC_INFO_2
pDocInfo: Caller-supplied pointer to a DOC_INFO_1 or DOC_INFO_2 structure. These structures are described in the Microsoft Windows SDK documentation.
- Return Value -
If the operation succeeds, the function should return TRUE. Otherwise it should return FALSE.
ランゲージモニタ36とポートモニタ37のインタフェースであるPM_WritePort()関数の仕様は次に示す通りである。
BOOL WINAPI PM_WritePort(
HANDLE hPort,
LPBYTE pBuffer,
DWORD cbBuf,
LPDWORD pcbWritten
);
- Parameters -
hPort: Caller-supplied port handle.
pBuffer: Caller-supplied pointer to a buffer containing data to be written to the port.
cbBuf: Caller-supplied size, in bytes, of pBuffer.
pcbWritten: Caller-supplied pointer to a location to receive the number of bytes successfully written to the port.
- Return Value -
If the operation succeeds, the function should return TRUE. Otherwise it should return FALSE.
ポートモニタ37は、図6のS611(図15(A)のS1502)において、WSDを制御するWSDAPIsのCreatePrintJob()をコールするが、この関数の引数として参照できる図11に示す<wprt:JobName>要素1102、<wprt:JobOriginatingUserName>要素1103、<wprt:JobId>要素1104にセットされている値は、PM_WritePort()関数の引数として渡されない為、ランゲージモニタ36がこれらの要素1102、1103、1104にセットされている値を参照したり、ランゲージモニタ36がこれらの値を変更したりすることはできない。同じ理由により、ランゲージモニタ36が、ポートモニタ37から発行されるCreatePrintJobオペレーションを使って、CreatePrintJobRequestにプライベート情報である要素905、906、901、907、908を追加することもできない。
<ans:ReceivedId>要素906には、MFP3が印刷ジョブ要求の予約を受け付けた時に発行する印刷予約IDがセットされる。この例では、MFP3から印刷予約IDがまだ発行されていないので、「None」という値がセットされている状態を示す。ランゲージモニタ36は、PC60がMFP3に印刷ジョブ要求を発行する為のトリガとなる、印刷制御コマンドで構成された印刷データの先頭データをMFP3に初めて送信しようとする時の初期値として、「None」を<ans:ReceivedId>要素906にセットする。それ以外の場合は、MFP3からPC60に最後に送られてきたGetPrinterElementsResponseの<ans:ReceivedId>要素912にセットされている値を、ランゲージモニタ36がlmReceivedに保存しておき、ランゲージモニタ36がこの値を<ans:ReceivedId>要素906にセットする。
<ans:Retry>要素901には、PC60がMFP3に発行する印刷ジョブ要求のリトライ回数がセットされる。この例では、PC60がMFP3に印刷ジョブ要求を初めて送信するケースを示す「0」という値がセットされている状態を示す。ランゲージモニタ36は、PC60がMFP3に印刷ジョブ要求を発行する為のトリガとなる、印刷制御コマンドで構成された印刷データの先頭データの送信を試みる度に、このリトライ回数を1ずつ更新して、その値を<ans:Retry>要素901にセットする。<ans:OSVersion>要素907には、PC60のOSのバージョンがセットされる。ランゲージモニタ36は、OSのAPIであるGetVersionEx()関数をコールして、その引数で返されるOSのバージョン情報を、<ans:OSVersion>要素907にセットする。この例では、OSがWindows7であることを表す「6.1」という値がセットされている状態を表す。
MFP3は、この<ans:OSVersion>要素907にセットされている値を確認し、PCのOSに応じて(例えば、PCのOSがWindows7の場合と、それ以外のOSの場合とで)、制御を切り換えることが可能である。例えば、Windows7から新しいWindowsOSに変更し、WSDのプロトコル等のタイミングや制御に変更が入った場合、MFP3がそれに合わせてWSDのプロトコル等のタイミングや制御を切り換えることにより、PCにインストールされているOS毎に最適化された安定した制御を行うことができ誤動作等を防止することができる。
<ans:DateTime>要素908には、このGetPrinterElementsRequestを発行する時の日時がセットされる。ランゲージモニタ36は、OSのAPIをコールして、日付と時刻を取得し、この日付と時刻を用いて<ans:DateTime>要素908に日時をセットする。この例では、「2009-01-01T00:08:00」という値がセットされている状態を示す。ネットワーク11内に接続されているPC、プリンタ、様々なデバイスの状況に応じて、複数のPC(PC60、PC60及びその他のPC(不図示))からMFP3に対して順に発行されたGetPrinterElementsRequestを、MFP3が発行された順に受信するとは限らない。その為、MFP3は<ans:DateTime>要素908をもとに、GetPrinterElementsRequestを処理する順序を決定し、その順序に従って、GetPrinterElementsRequestに対する応答として、その発行元のPCに対して図9(B)で後述するGetPrinterElementsResponseを返す。
図9(B)は、GetPrinterElementsResponseを示す図である。同図に示すGetPrinterElementsResponseは、PC60からMFP3に発行されるものの一例である。MFP3は、ans:ABCCommandがセットされた<wprt:Name>要素903を含むGetPrinterElementsRequestを受け取った時、GetPrinterElementsResponseでans:ABCCommandをPC60に返す。同図において、記述909は、<wprt:ElementData>要素であり、また、パブリック情報であり、Name属性としてプライベート情報のans:ABCCommandがセットされている。これは、このGetPrinterElementsResponseが、<wprt:Name>要素903で指定されたans:ABCCommandを含んでいることを示す。記述910は、<ans:ABCCommand>要素であり、また、プライベート情報であり、この中に、<ans:SplJobId>要素911、<ans:ReceivedId>要素912、<ans:Retry>要素902、<ans:OSVersion>要素913、<ans:DateTime>要素914が含まれている。要素911、912、902、913、914は、全てプライベート情報である。MFP3は、<ans:SplJobId>要素905にセットされている値をそのまま<ans:SplJobId>要素911にセットする。この例では、「5」という値がセットされている状態を示す。
MFP3は、図13で後述するように<ans:ReceivedId>要素912に適切な値をセットする。この例では、「00000202」という値がセットされている状態を示す。MFP3は、<ans:Retry>要素901にセットされている値を確認し、「0」がセットされている場合は、新規に発行された印刷ジョブに対するGetPrinterElementsRequestであると判断する。「0」以外の値がセットされている場合は、MFP3が予約を受け付けた印刷ジョブの再開始要求に対するGetPrinterElementsRequestであると判断する。MFP3は、<ans:Retry>要素901にセットされていた値をそのまま<ans:Retry>要素902にセットする。この例では、ランゲージモニタ36が、PC60がMFP3に印刷ジョブ要求を発行する為のトリガとなる、印刷制御コマンドで構成された印刷データの先頭データをMFP3に初めて送信しようとしたケースを表す「0」という値がセットされている状態を示す。
<ans:OSVersion>要素913は、PC(PC60)のOSのバージョン情報を示す。MFP3は、<ans:OSVersion>要素907にセットされていた値をそのまま<ans:OSVersion>要素913にセットする。この例では、OSがWindows7であることを表す「6.1」という値がセットされている状態を示す。<ans:DateTime>要素914には、このGetPrinterElementsResponseを発行する時の日時がセットされる。MFP3は、内部に装備されているリアルタイムクロックから日付と時刻を取得し、この日付と時刻を用いて<ans:DateTime>要素914に日時をセットする。この例では、「2009-01-01T00:08:01」という値がセットされている状態を示す。
PC60は、<ans:DateTime>要素908と<ans:DateTime>要素914との時間差から、GetPrinterElementsRequestを発行してからGetPrinterElementsResponseを受信する迄の時間を取得することができる。PC60は、これを利用してネットワーク11の通信速度やトラフィックを計算して予想することができ、この時間をもとにWSDのプロトコルの通信やタイミングの制御を最適化することができる。また、PC60はAPIを使ってOS内部のタイマーをコールし、このタイマーから計算されたGetPrinterElementsRequestの発行からGetPrinterElementsResponseの返信を受け取る迄の時間と、<ans:DateTime>要素908と<ans:DateTime>要素914との時間差から計算された時間を比較することもできる。この比較結果をもとに、PC60は、MFP3のリアルタイムクロックの日付や時刻を補正したり、PC60内の日付や時刻を補正したりすることができる。
図9(A)の説明の中で前述した通り、ポートモニタ37は、図5のS515や図6のS611(図15(A)のS1502)において、WSDを制御するWSDAPIsのCreatePrintJob()をコールするが、この関数の引数として参照できる図11に示す<wprt:JobName>要素1102、<wprt:JobOriginatingUserName>要素1103、<wprt:JobId>要素1104にセットされている値は、PM_WritePort()関数の引数として渡されない為、ランゲージモニタ36がこれらの要素1102、1103、1104にセットされている値を参照したり、ランゲージモニタ36がこれらの値を変更したりすることはできない。同じ理由により、ランゲージモニタ36が、ポートモニタ37から発行されるCreatePrintJobオペレーションを使って、CreatePrintJobResponseからプライベート情報である要素911、912、902、913、914を参照することもできない。
図10は、GetPrinterElementsの内容を示す図であり、図10(A)は、GetPrinterElementsRequest、図10(B)は、GetPrinterElementsResponseをそれぞれ示す。
図10(A)は、GetPrinterElementsRequestを示す図である。同図に示すGetPrinterElementsRequestは、PC60からMFP3に発行されるものの一例である。同図において、図9(A)と同様な内容に関しては、その詳細説明を省略する。
記述1001は、<wprt:Name>要素であり、また、パブリック情報であり、その値としてans:ABCCommandがセットされている。このans:ABCCommandは、プライベート情報である。記述1002は、<ans:ABCCommand>要素であり、また、プライベート情報であり、この中に、<ans:SplJobId>要素1003、<ans:ReceivedId>要素1004、<ans:Retry>要素1005、<ans:OSVersion>要素1006、<ans:DateTime>要素1007が含まれている。要素1003、1004、1005、1006、1007は、全てプライベート情報であり、ランゲージモニタ36がGetPrinterElementsRequest内のこれらの要素に、それぞれ適切な値をセットする。ランゲージモニタ36は、図5のS503でスプーラ40がLM_StartDocPort()関数をコールした時に渡される第3引数JobIdにセットされている値を、<ans:SplJobId>要素1003にセットする。この例では、「5」という値がセットされている状態を示す。
<ans:ReceivedId>要素1004には、MFP3が印刷ジョブ要求の予約を受け付けた時に発行する印刷予約IDがセットされる。この例では、MFP3がこの印刷ジョブ要求の予約を既に受け付けていて、受け付けた時に発行された「00000202」という値がセットされている状態を示す。<ans:Retry>要素1005には、PC60がMFP3に発行する印刷ジョブ要求のリトライ回数がセットされる。この例では、PC60がMFP3に印刷ジョブ要求を1回目のリトライとして送信するケースを示す「1」という値がセットされている状態である。
ランゲージモニタ36は、PC60がMFP3に印刷ジョブ要求を発行する為のトリガとなる、最初の印刷制御コマンドで構成された印刷データの送信を試みる度に、このリトライ回数を1ずつ更新して、その値を<ans:Retry>要素1005にセットする。<ans:OSVersion>要素1006には、PC60のOSのバージョンがセットされる。この例では、OSがWindows7であることを表す「6.1」という値がセットされている状態を示す。<ans:DateTime>要素1007には、このGetPrinterElementsRequestを発行する時の日時がセットされる。この例では、「2009-01-01T00:08:04」という値がセットされている状態を示す。
図10(B)は、GetPrinterElementsResponseを表す図である。同図に示すGetPrinterElementsResponseは、PC60からMFP3に発行されるものの一例である。MFP3は、ans:ABCCommandがセットされた<wprt:Name>要素1001を含むGetPrinterElementsRequestを受け取った時、GetPrinterElementsResponseでans:ABCCommandをPC60に返す。同図において、図9(B)と同様な内容に関しては、その詳細説明を省略する。
記述1008は、<wprt:ElementData>要素であり、また、パブリック情報であり、Name属性としてプライベート情報のans:ABCCommandがセットされている。これは、このGetPrinterElementsResponseが、<wprt:Name>要素1001で指定されたans:ABCCommandを含んでいることを示す。記述1009は、<ans:ABCCommand>要素であり、また、プライベート情報であり、この中に、<ans:SplJobId>要素1010、<ans:ReceivedId>要素1011、<ans:Retry>要素1012、<ans:OSVersion>要素1013、<ans:DateTime>要素1014が含まれている。要素1010、1011、1012、1013、1014は、全てプライベート情報である。MFP3は、<ans:SplJobId>要素1003にセットされている値をそのまま<ans:SplJobId>要素1010にセットする。この例では、「5」という値がセットされている状態を示す。MFP3は、図13で後述するように<ans:ReceivedId>要素1011に適切な値をセットする。この例では、「00000202」という値がセットされている状態を示す。MFP3は、<ans:Retry>要素1005にセットされていた値をそのまま<ans:Retry>要素1012にセットする。この例では、「1」という値がセットされている状態を示す。
MFP3は、<ans:OSVersion>要素1006にセットされていた値をそのまま<ans:OSVersion>要素1013にセットする。この例では、「6.1」という値がセットされている状態を示す。MFP3は、内部に装備されているリアルタイムクロックから日付と時刻を取得し、この日付と時刻を用いて<ans:DateTime>要素1014に日時をセットする。この例では、「2009-01-01T00:08:05」という値がセットされている状態を示す。
[MFP3の印刷キューデータベース]
図26は、MFP3が受け付けた印刷ジョブ要求を管理する印刷キューデータベースを示す図である。図26(A)は、MFP3内に装備された印刷キューデータベースであり。本実施形態では、受け付けることができる印刷ジョブの数はMFPが実行している印刷ジョブも含めて合計4つ管理することができ、さらに4つの印刷ジョブ要求を予約することができる。ここで、印刷ジョブ要求とは、印刷ジョブの印刷要求を指し、印刷画像を含まないものである。この印刷キューデータベースは、ローカルネットワーク(例えば、WSDプロトコル)を利用した印刷ジョブ(及び印刷ジョブ要求)と、ワイドエリアネットワークを利用したクラウド印刷ジョブ(及び印刷ジョブ要求)とを混在して管理する。すなわち、図26(A)に示すMFP3内の印刷キューデータベースは、異なるプロトコル、具体的には、ローカルエリアネットワークを介して印刷指示された印刷ジョブ要求と、ワイエリアネットワークを介して印刷指示された印刷ジョブ要求を一元管理するものである。図26(B)は、クラウド印刷を提供するアプリケーションサーバー側が持つ印刷キューデータベースである。本実施形態では、サーバーとして機能するPC2が図26(B)に示す印刷キューデータベースを備える。この印刷キューデータベースは、WSDプロトコルを利用した印刷ジョブと、クラウド印刷ジョブとが混在したネットワーク印刷をローカルネットワーク上で接続された端末から制御する為の印刷キューデータベースである。すなわち、図26(B)に示すアプリケーションサーバー内の印刷キューデータベースは、具体的には、ローカルエリアネットワークを介して印刷指示された印刷ジョブ要求と、ワイエリアネットワークを介して印刷指示された印刷ジョブ要求を一元管理するものである。図26(B)は、印刷装置(本実施形態では、MFP3)内の印刷キューデータベースに登録可能な印刷ジョブ数が上限数を超えた際に、印刷ジョブ要求を登録するために使用する。
図26(A)、(B)において、「Null」はデータが存在しない空領域であることを示し、「−」はデータが不定(利用不可)であることを示す。
図26(A)において、「No.」欄は、実行中の印刷ジョブ、または、予約されている印刷ジョブ要求の順番を示す。すなわち、図26(A)において、No.は、印刷を実行する予定の印刷ジョブの優先順位を表す。No.1は、現在印刷を実行中の印刷ジョブであり、No.2は、次に印刷を実行する予定の最優先の印刷ジョブを示す。No.3、5〜8は、印刷ジョブ要求の予約を示す。No.5〜8において、No.5はNo.4の次に優先順位の高い印刷ジョブ要求の予約を示し、No.8は最後に印刷を実行する予定の、最も優先順位の低い印刷ジョブ要求の予約を示す。
図26(B)において、「No.」欄は、予約されている印刷ジョブ要求の順番を表す。すなわち、図26(B)においてNo.は、図26(A)の印刷キューデータベースに印刷ジョブが新たに登録できるようになった際に、図26(A)の印刷キューデータベースに登録する印刷ジョブ要求の優先順位を表す。図26(A)、(B)において、「Protocol」欄は、PCとMFP3との間のネットワーク通信に使用される通信プロトコルを示す。本実施形態では、WSDあるいはHTTPの何れかがセットされる。
図26(A)、(B)において、「Computer Name」欄は、印刷ジョブ要求を発行したコンピュータ名を示す。「wprt:JobName」欄は、<wprt:JobName>要素(例えば、記述1102)にセットされている印刷ジョブ名を示す。「wprt:JobOriginatingUserName」欄は、<wprt:JobOriginatingUserName>要素(例えば、記述1103)にセットされているユーザ名を示す。「wprt:JobId」欄は、<wprt:JobId>要素(例えば、記述1104)にセットされている、MFP3から発行されたジョブIDを示す。すなわち、ジョブIDは、MFP3においてジョブの受付が完了した際にMFP3から発行されるIDである。例えば、図26(A)のNo.1の行の「wprt:JobId」欄には、「60」というジョブIDがセットされている。これは、MFP3がこの印刷ジョブの印刷を実行しており、ジョブIDを発行済みの状態であることを示している。No.2、4は、ジョブIDがMFP3から発行済みの状態であるが印刷実行前の印刷ジョブ、すなわち、受付が完了し且つ印刷待機中の印刷ジョブである。
図26(A)のNo.5の行、(B)のNo.1、2の「wprt:JobId」欄には、「Null」がセットされている。これは、MFP3がこの印刷ジョブ要求の予約を受け付けただけで、印刷が実行されておらず、ジョブIDを発行していない状態であることを示している。尚、図26(A)、のNo.3、6、7、8行、(B)のNo.3の「wprt:JobId」欄には「−」がセットされているが、これは、クラウド印刷のジョブにおいては、<wprt:JobId>要素が存在しないので、不定(利用不可)であることを示している。
図26(A)、(B)の「ans:SplJobId」欄は、<ans:SplJobId>要素(例えば、記述905、1003)にセットされている、スプーラ40から発行されたジョブIDを示す。例えば、1台のPCからあるユーザが同じドキュメントを何度も繰り返して連続印刷するようなケースがある。スプーラ40がこれらの印刷ジョブを複数のスレッド等により並列処理できる場合、これら複数の印刷ジョブ要求、すなわち複数のCreatePrintJobRequest内の<wprt:JobName>要素(例えば、記述1102)にセットされている印刷ジョブ名と<wprt:JobOriginatingUserName>要素(例えば、記述1103)にセットされているユーザ名とが各印刷ジョブ要求間で同一の印刷ジョブ名とユーザ名になってしまう為、これらの印刷ジョブ要求を区別することができない、という問題がある。このような問題に対して、スプーラ40から発行されたジョブIDを印刷キューデータベース内に保持する情報に含めることで、これらの印刷ジョブを識別することができ、上記問題を解決することができる。図26(A)、(B)の、「ans:ReceivedId」欄は、<ans:ReceivedId>要素(例えば、記述912、1011)にセットされている印刷予約IDを表す。図26(A)、(B)の「Time」欄は、PCから発行された印刷ジョブ要求または印刷ジョブ要求の予約確認要求を、MFP3が受け付けた時刻を表すタイムカウント値を表す。
本実施形態においては、例えば、ネットワーク11上のPC60とPC61のそれぞれのPCから発行されたWSDのプロトコルを利用した印刷ジョブと、ネットワーク4のPC1から発行されたクラウド印刷の印刷ジョブとが混在することになる。このような、異なる経路で発行された印刷ジョブ、言い換えれば、複数のプロトコルの印刷ジョブが混在している環境においても、図26(A)、(B)のような印刷キューデータベースを利用することで、印刷装置(ここでは、MFP3)において、各PCから発行された印刷ジョブの発行順序に従って正しく印刷させることができる。
[MFP3におけるCreatePrintJobの処理]
図12は、MFP3におけるCreatePrintJobの処理の手順を示すフローチャートである。図12の処理を実行するためのプログラムは、ROM16に記憶されており、RAM17に読み出されてCPU15により実行される。MFP3は、その起動時に、RAM17等に確保されたnew_jobフラグを「0」で初期化している。例えばPC60からMFP3にCreatePrintJobRequest(例えば、図11(A))が発行されて、MFP3がそれを受け付けると、S1201が開始される。MFP3は、CreatePrintJobRequestを受信すると(S1202)、MFP3に内蔵されているタイマーから時刻や経過時間を計測可能なカウント値を取得し、Time1として記憶する(S1203)。そのカウント値の単位は、例えば、「秒」である。
MFP3は、受信したCreatePrintJobRequestから、<wprt:JobName>要素1102にセットされている印刷ジョブ名と、<wprt:JobOriginatingUserName>要素1103にセットされているユーザ名とを取得する(S1204)。また、MFP3は、CreatePrintJobRequestを発行したコンピュータのコンピュータ名(Computer Name)を取得する(S1205)。ここでは、PC60のコンピュータ名が取得される。本実施形態では、WSDのPrint Service宛てのHTTP POSTでのTCP受信ソケットからIPアドレスを取得し、そのIPアドレスに基づいてコンピュータ名を取得する。本実施形態では説明を簡易にする為に、IPアドレスからコンピュータ名を取得し、そのコンピュータ名を用いてPCを特定して各処理を行うが、IPアドレスからPCを直接に特定して各処理を行うようにしても良い。MFP3は、取得した印刷ジョブ名とユーザ名とコンピュータ名とを一時的に保存する(S1206)。
MFP3は、印刷ジョブ名、ユーザ名、コンピュータ名に基づいて、図26(A)に示す印刷キューデータベース内に既にS1202で受信したCreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求の予約が既に存在する可能性があるか否かを判定する(S1207)。例えば、印刷ジョブ名等上記の3つのうちのいずれかの要素に基づいて、印刷キューデータベース内を検索し、同じ、例えば印刷ジョブ名が検索された場合には、可能性があると判定するようにしても良い。その場合、印刷ジョブ名が検索されなかった場合には、可能性がないと判定される。
図26(A)に示す印刷キューデータベース内に、印刷ジョブ要求の予約が既に存在する可能性があると判定された場合、S1213へ進み、存在する可能性がないと判定された場合、S1209へ進む(S1208)。S1209において、図26(A)に示す印刷キューデータベース内に、S1202で受信したCreatePrintJobRequestで開始要求された印刷ジョブより優先順位の高い他の印刷ジョブ要求の予約があるか否かを判定する。ここで、あると判定された場合、S1220へ進み、ないと判定された場合、S1210へ進む。
S1210において、MFP3は、MFP3内の印刷キューデータベースに、空領域があり、S1202で受信したCreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求を登録可能か否かを判定する。ここで、登録可能と判定された場合、S1211に進み、登録可能でないと判定された場合、S1221へ進む。S1211において、MFP3は、図26(A)に示すMFP3内の印刷キューデータベースに、S1202で受信したCreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求を登録する。MFP3は、S1202で受信した印刷ジョブ要求CreatePrintJobRequestの印刷ジョブを受け付けて実行することを示す応答として、CreatePrintJobResponse(例えば、図11(b))をPC60に返信し(S1212)、CreatePrintJobの処理を終了する(S1223)。
S1221において、MFP3は、印刷ジョブ要求をプロキシAPP143に送信する。ここで、図16(B)において後述するように、プロキシAPP143の印刷キューデータベースに、CreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求を登録する。S1221の処理後、S1222へ進む。
S1208で、図26(A)に示す印刷キューデータベース内に、印刷ジョブ要求の予約が既に存在する可能性があると判定された場合、S1213へ進む。S1213において、MFP3は、new_jobフラグの値を参照し、「1」がセットされているか否かを判定する。ここで、「1」がセットされていると判定された場合、S1222へ進み、「1」がセットされていない(「0」がセットされている等)と判定された場合、S1214へ進む。
S1214において、MFP3は、S1203で保存されたカウント値Time1から図13のS1303で保存されたカウント値Time2を減算する。つまり、MFP3が図13のS1302でGetPrinterElementsRequestを受信してからS1202でCreatePrintJobRequestを受信するまでの経過時間を求める。S1214において、MFP3は、その経過時間が5秒を超えているか否かを判定する。経過時間が5秒を超えていると判定された場合、S1222へ進み、5秒を超えていないと判定された場合、S1215へ進む。
S1215において、MFP3は、S1206で記憶した印刷ジョブ名とユーザ名とコンピュータ名に基づいて、図26(A)に示す印刷キューデータベース内で、それらの情報と同じ情報を持つ印刷ジョブ要求の予約を検索する。印刷キューデータベース内から「ans:ReceivedId」欄にセットされている印刷予約IDと、「ans:SplJobId」欄にセットされているスプーラ40から発行されたジョブIDを取得して、一時的に保存する。
MFP3は、図13のS1309で保存されている<ans:ABCCommand>要素(例えば、記述904、1002)に含まれている情報から、<ans:ReceivedId>要素にセットされている印刷予約ID(例えば、記述1004)と、<ans:SplJobId>要素にセットされているスプーラ40から発行されたジョブID(例えば、記述1003)とを取得する(S1216)。MFP3は、S1216で取得した印刷予約IDとスプーラ40から発行されたジョブIDとを、S1215で一時的に保存した印刷予約ID及びスプーラ40から発行されたジョブIDとそれぞれ比較する。さらに、MFP3は、S1215で一時的に保存した印刷予約IDに基づいて、印刷キューデータベースから取得した印刷ジョブ名とユーザ名とコンピュータ名を、S1206で一時的に保存した印刷ジョブ名、ユーザ名及びコンピュータ名とそれぞれ比較する(S1217)。
MFP3は、比較対象の全ての情報を比較した結果、全ての比較対象情報がそれぞれ一致したか否かを判定する(S1218)。ここで、一致したと判定された場合、S1219へ進み、少なくとも1つ以上の情報が一致しないと判定された場合、S1220へ進む。
S1219において、MFP3は、図26(A)に示す印刷キューデータベースを確認し、S1202で受信したCreatePrintJobRequestで開始要求された印刷ジョブより優先順位の高い他の印刷ジョブ要求の予約がこの印刷キューデータベース内にあるか否かを判定する(S1219)。ここで、あると判定された場合、S1222へ進み、ないと判定された場合、S1210へ進む。
S1220において、MFP3は、new_jobフラグに「1」をセットする。S1222において、MFP3は、S1202で受信した印刷ジョブ要求CreatePrintJobRequestに対して、この印刷ジョブを受け付けることができなかったことを示すFault(ServerErrorNotAcceptingJobs)をPC60に返信し、S1223において、CreatePrintJobの処理を終了する。
[MFP3におけるGetPrinterElementsの処理]
図13は、MFP3におけるGetPrinterElementsの処理の手順を示すフローチャートである。図13のフローに係るプログラムは、ROM16に記憶されており、RAM17に読み出され、CPU15により実行される。PC60からMFP3にGetPrinterElementsRequest(例えば図8(A)、図9(A)、図10(A))が発行されて、MFP3がこれを受け付けると、同図のS1301が開始される。MFP3は、GetPrinterElementsRequestを受信した後(S1302)、GetPrinterElementsRequestから<wprt:Name>要素(例えば801、903、1001)にセットされている値を確認する(S1304)。S1304において、GetPrinterElementsRequestの中に複数の<wprt:Name>要素が存在する場合があるので、MFP3は取得した全ての<wprt:Name>要素にセットされている値を一時的に保存しておく。<wprt:Name>要素にセットされている値として、wprt:PrinterDescriptionが見つかった場合、S1306へ進み、見つからなかった場合、S1308へ進む(S1305)。
S1306において、MFP3は<ans:MultipleJobsControl>要素802に「true」をセットし、S1308へ進む。S1308において、MFP3は、S1304で一時的に保存された<wprt:Name>要素にセットされている全ての値を確認し、ans:ABCCommandが見つかった場合、S1303へ進み、見つからなかった場合、S1319へ進む。S1303において、MFP3は内蔵されているタイマーから時刻や経過時間を計算可能なカウント値を取得してTime2に保存する。このカウント値の単位は「秒」である。
S1309において、MFP3は、GetPrinterElementsRequest内の<ans:ABCCommand>要素(例えば904、1002)に含まれている全ての情報を取得して保存する。MFP3はnew_jobフラグの値を確認し、「1」がセットされている場合、S1307へ進み、それ以外(「0」がセットされている)の場合、S1311へ進む(S1320)。S1307において、Time2から図12のS1203で保存されたTime1を減算して、図12のS1202でMFP3がCreatePrintJobRequestを受信してからS1302でMFP3がGetPrinterElementsRequestを受信するまでの経過時間を計測する。この経過時間が5秒を超えている場合、S1321へ進み、5秒以内の場合、S1310へ進む。
S1310において、MFP3は、<ans:Retry>要素(例えば、901、1005)にセットされている値を確認し、この値が「0」の場合、S1317へ進み、「0」以外(実際には0より大きい整数)の場合、S1311へ進む。S1317において、MFP3は、図16(A)に示す印刷予約IDの発行処理を実行する。MFP3は、図16(A)で<ans:ReceivedId>要素(例えば、912、1011)にセットされた値を確認し、「None」の場合、S1321へ進み、「None」ではない場合、S1318へ進む(S1323)。S1318において、MFP3は、図16(A)のS1704で新規に発行した印刷予約ID(ans:ReceivedId)をもとに、図26(A)に示す印刷キューデータベースに新規の印刷ジョブ要求の予約として各情報を登録して、印刷キューデータベースを更新する。この時、MFP3は、「Time」欄にセットされているタイムカウント値をTime2に保存されている値で更新する。
S1321において、MFP3はnew_jobフラグを「0」で初期化する。MFP3は、S1306でセットされた情報、図16(A)のS1705でセットされた情報、図26(A)に示す印刷キューデータベース内にセットされている情報等を用いて、GetPrinterElementsResponseに各情報をセットして、S1302で受信したGetPrinterElementsRequestに対する応答として、GetPrinterElementsResponseをPC(PC60)に返す(S1319)。そして、GetPrinterElementsの処理を終了する(S1322)。
一方、S1311において、MFP3は、<ans:ReceivedId>要素にセットされている印刷予約ID(例えば、1004)を取得する。MFP3は、図26(A)に示す印刷キューデータベース内の「ans:ReceivedId」に、この印刷予約IDが存在するか否かを判定する(S1312)。MFP3が、この印刷ジョブ要求の予約を表す印刷予約IDを図26(A)に示す印刷キューデータベース内で発見した場合、S1314へ進み、発見しなかった場合、S1317へ進む(S1313)。
S1314において、MFP3は、図26(A)に示す印刷キューデータベースから、その印刷予約IDで予約されている印刷ジョブ予約の「Time」欄にセットされているタイムカウント値を取得し、S1303で保存されたTime2からこのタイムカウント値を減算して、最後にこの印刷ジョブ予約が更新された時からの経過時間を計測する。MFP3は、この経過時間が既定時間(ここでは20秒に設定)を超える場合、S1316へ進み、既定時間以内の場合、S1323へ進む(S1315)。S1316において、MFP3は、図26(A)に示す印刷キューデータベース内において、この印刷ジョブ要求の印刷予約ID(ans:ReceivedId)を一旦削除し、この印刷ジョブ要求をその印刷キューデータベース内の最後尾に移動して、最も優先順位の低い印刷ジョブ要求の予約となるように変更し、S1317へ進む。
図12のS1212、図13のS1307において、一定時間の経過を判断する値として5秒の固定のタイムアウト値を設定したが、これらの例に限られることはない。例えば、MFP3の使用環境やユーザが使用するネットワークの環境に応じて、例えば、3秒、8秒、10秒というような固定のタイムアウト値を設定しても良い。また、MFP3の表示部21のタッチパネルや操作部20のボタン操作により、使用環境に応じた任意の適切な値を設定したりするように構成してもよい。また、MFP3がネットワーク11上のPCをモニタし、その数に応じてネットワークの混雑状況を把握し、その混雑状況から最適なタイムアウト値を設定するように構成してもよい。さらに、図12のS1212におけるタイムアウト値と、図13のS1307におけるタイムアウト値を、同一の値ではなく、それぞれ異なる値としてもよい。この場合、例えば、図12のS1212におけるタイムアウト値を5秒とし、図13のS1307におけるタイムアウト値を3秒とする、というようにしても良い。
図16は、MFP3における印刷予約IDの発行の処理の手順を示すフローチャートとプロキシAPP143に印刷ジョブ要求を登録する処理の手順を示すフローチャートである。図16(A)のフローに係るプログラムは、ROM16に記憶されており、RAM17に読み出され、CPU15により実行される。MFP3が図13のS1317の印刷予約IDの発行処理を実行すると、図16のS1601が開始される。MFP3は、図26(A)に示す印刷キューデータベースの空領域の状況を確認し(S1602)、空領域が有る場合、S1604へ進み、空領域が無い場合、S1605へ進む(S1603)。
S1604において、MFP3は印刷予約ID(ans:ReceivedId)を新規に発行し、<ans:ReceivedId>要素(例えば912、1011)にこの印刷予約IDをセットし、印刷予約IDの発行処理を終了して(S1606)、図13のS1323へ進む。S1704で発行される印刷予約IDは、MFP3内で管理されるものであり、MFP3内で一意に決定される値である。一方、S1605において、MFP3は<ans:ReceivedId>要素(例えば912、1011)に「None」をセットし、印刷予約IDの発行処理を終了して(S1606)、図13のS1323へ進む。
図16(B)は、プロキシAPP143がMFP3から受信した印刷ジョブ要求を登録する処理の手順を示すフローチャートである。図12のS1222においてサーバーの印刷キューデータベースに登録処理が開始されると、図16のS1610が開始される。S1611において、プロキシAPP143の印刷キューデータベースを確認する。S1612において、登録済みの印刷ジョブ要求であれば、終了し(S1614)、登録済みでない印刷ジョブ要求であると判定された場合、S1613に進む。S1613において、プロキシAPP143がMFP3から受信した印刷ジョブ要求を図26(B)に示すプロキシAPP143の印刷キューデータベースに登録し、終了する(S1614)。
図17は、PC7の文書作成APP145の画面をWebブラウザで表示した一例を示す図である。図17は、ある文書を開いている状態を示す。文書作成APP145は、この画面の情報をモバイル端末14、PC1、MFP3、MFP103に送信し、モバイル端末14、PC1、MFP3、MFP103がその情報を受信してWebブラウザ9、25、27、28でその画面を表示する。このように、文書作成APP145の画面は、Webブラウザ9、25、27、28を利用して、そのWebブラウザ上に表示される。ファイルメニュー402は、コンテンツ(文書)選択画面(不図示)を表示して予め保存されている文書やコンテンツを開いたり、新規文書を作成したりするためのサブメニューを備えていて、ユーザが文書やコンテンツを選択したり、新規文書を作成することができる。尚、コンテンツ(文書)選択画面は、PC等で一般的なファイル選択画面と同様な画面で構成されるものであり、ここではその説明を省略する。印刷メニュー401は、印刷に関する各種の操作を受け付ける。例えば、ユーザがKBD203または操作部20等の入力部を操作し、開いている文書を印刷するときに印刷メニュー401を押下すると、図18に示す印刷画面142が表示される。
図18は、印刷画面142の一例を示す図である。印刷画面142は、ユーザに対するMFP3、103用の印刷設定画面として、文書作成APP145により制御され、文書作成APP145は、印刷画面142の画面の情報をモバイル端末14、PC1、MFP3、MFP103に送信し、モバイル端末14、PC1、MFP3、MFP103がその情報を受信してWebブラウザ9、25、27、28でその画面を表示する。このように、印刷画面142は、Webブラウザ9、25、27、28を利用して、そのWebブラウザ上に表示される。デバイス選択肢535、536、537の各々は、選択可能なデバイスの選択肢である。デバイス選択肢535、536、537は、それぞれ、GHI社製のACBXDFというモデル名のMFP、ABC社製のKmmnというモデル名のMFP(MFP3)、DEF社製のXyzというモデル名のMFPに該当する選択肢を表す。図18では、MFP3を表すデバイス選択肢536が選択されている状態が示されている。
MFP3(103)内のWebブラウザ27(28)上に印刷画面142が表示される場合、文書作成APP145はデバイス選択肢536だけを表示する情報をMFP3(103)に送信して、ユーザがそれ以外のデバイスを選択できないようにする。モバイル端末14内のWebブラウザ9またはPC1内のWebブラウザ25上に印刷画面142が表示される場合、文書作成APP145はデバイス選択肢535、536、537を表示する情報をモバイル端末14またはPC1に送信して、モバイル端末14またはPC1がその情報を受信してWebブラウザ9または25で表示する。これにより、ユーザが、モバイル端末14またはPC1のWebブラウザ9または25を操作する場合、文書作成APP145は、そのユーザが全てのデバイスを選択できるように制御する。
用紙サイズ選択部530では、A5、A4、B5、Letterの各選択肢の中からMFP3で印刷する用紙のサイズがユーザ操作に応じて選択される。図18では、「Letter」が選択されている状態が示されている。種類選択部531では、Plain Paper、Photo Paper、Postcardの各選択肢の中からMFP3で印刷する用紙の種類がユーザ操作に応じて選択される。図18では、「Plain Paper」が選択されている状態が示されている。印刷品位選択部532では、High、Standard、Fastの各選択肢の中からMFP3で印刷する印刷品位がユーザ操作に応じて選択される。図18では、「Standard」が選択されている状態が示されている。色/濃度選択部533では、Auto、Manualの各選択肢の中からMFP3で印刷する色や濃度がユーザ操作に応じて選択される。図18では、「Auto」が選択されている状態が示されている。
印刷ボタン534は、印刷の開始の指示を受け付ける。ユーザ操作により印刷ボタン534が押下されると、文書作成APP145は、デバイス選択肢536に関連付けられているMFP3用の印刷ジョブを生成し、クラウド印刷APP146にその印刷ジョブを発行する。クローズボタン538は、印刷画面142を閉じる指示を受け付ける。ユーザ操作によりクローズボタン538が押下されると、文書作成APP145は、印刷画面142を閉じる。
[クラウド印刷処理]
図19〜図24は、クラウド印刷処理の手順を示すフローチャートである。これらのフローチャートに係るプログラムは、PCまたはMFP内に記憶されている。PC上で動作するアプリケーションのプログラムは、HDD202に記憶されており、CPU204によりRAM201に読み出されて実行される。MFP上で動作するアプリケーションのプログラムは、ROM16に記憶されており、RAM17に読み出されてCPU15により実行される。
図19において、縦の列が処理の実行元を表し、左側から、PC1(Webブラウザ25)、クラウド印刷APP146、プロキシAPP143、文書作成APP145または読取APP147、MFP3(Webブラウザ27)に対応している。図21、図23において、縦の列が処理の実行元を表し、左側から、文書作成APP145、プロキシAPP143、画像変換APP144に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図24において、縦の列が処理の実行元を表し、左側から、MFP3、プロキシAPP143に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。
以下、ユーザがPC1またはMFP3を使って、ドキュメントの印刷をMFP3で行うケース(ドキュメント印刷に係る一連の処理)での通信制御方法について説明する。
図19は、PC1内のWebブラウザ25から文書作成APP145を実行して印刷を行う際の処理の手順を示すフローチャートである。同図において、ユーザが、PC1内のWebブラウザ25を起動して文書作成APP145を実行すると(S1901)、Webブラウザ25は、文書作成APP145にホーム画面を要求する(S1902)。文書作成APP145は、PC1にホーム画面の情報を送信し(S1903)、PC1は、Webブラウザ25でその画面を表示する(S1902)。
ユーザが、Webブラウザ25を操作して、ファイルメニュー402内のサブメニューを利用して印刷対象のコンテンツ(文書)の選択を開始したのを検知すると、Webブラウザ25は、文書作成APP145にコンテンツ(文書)選択画面を要求する(S1904)。文書作成APP145は、PC1にコンテンツ(文書)選択画面の情報を送信し(S1905)、PC1内のWebブラウザ25は、その画面を表示する(S1904)。ユーザが、コンテンツ(文書)を選択した状態で、図17に示す印刷メニュー401を押下したのを検知すると、Webブラウザ25は、文書作成APP145に図18に示す印刷画面142を要求する(S1904)。文書作成APP145は、PC1に印刷画面142の情報を送信し(S1905)、PC1内のWebブラウザ25は、その画面を表示する(S1904)。
デバイス選択肢536が選択されている(MFP3が選択されている)状態で、ユーザが印刷ボタン534を押下したのを検知すると、Webブラウザ25は、文書作成APP145に印刷要求を発行する(S1906)。その際、この印刷要求が発行されたホストがPCである旨を表す情報(host=PC)と、この印刷要求がMFP3へのジョブ通知を必要とする旨を表す情報(notification=yes)が、この印刷要求の中に含まれている。
文書作成APP145は、印刷要求を受け付けると、クラウド印刷APP146に印刷ジョブを発行する(S1907)。その際、この印刷ジョブの印刷要求が発行されたホストがPCである旨を表す情報(host=PC)と、この印刷ジョブがMFP3へのジョブ通知を必要とする旨を表す情報(notification=yes)が、この印刷ジョブの中に含まれている。
クラウド印刷APP146は、プロキシAPP143のプリントキューに印刷ジョブを入稿する(S1908)。その際、クラウド印刷APP146は、この印刷ジョブの印刷要求が発行されたホストがPCである旨を表す情報(host=PC)、この印刷ジョブがMFP3へのジョブ通知を必要とする旨を表す情報(notification=yes)、この印刷ジョブの発行年月日・時刻(発行時間)を、印刷ジョブに付加する。プロキシAPP143は、図20(A)に示すジョブのスタック処理を実行して、ジョブID(印刷ジョブID)をクラウド印刷APP146に返し(S1909)、MFP3からの印刷ジョブ取得要求待ち状態となる(S1910)。
S1908において、クラウド印刷APP146は、プロキシAPP143から返されたジョブID(印刷ジョブID)を文書作成APP145に返す。PC1内のWebブラウザ25が、文書作成APP145に発行された印刷要求のレスポンスを受信すると、文書作成APP145にホーム画面を要求する(S1911)。文書作成APP145は、PC1にホーム画面の情報を送信し(S1912)、PC1は、Webブラウザ25でその画面を表示し(S1911)、ユーザの入力操作待ち状態となる(S1913)。
図21で後述するように、図21のS2108において、プロキシAPP143は、MFP3にジョブ(印刷ジョブ)通知を送信し、MFP3は、このジョブ(印刷ジョブ)通知を受信すると(S1914)、図24で後述するように印刷ジョブ要求を印刷キューデータベースに登録する(S1915)。その後、オンラインでのスタンバイ状態となる(S1916)。
印刷開始時においては、表示部21に「印刷準備中」または「印刷中」というような印刷関連処理を実行中である旨を表すメッセージを表示して、印刷モードに移行したことをユーザに知らせる。MFP3は、Webブラウザ27を介さずにこのメッセージを表示する。MFP3は、プロキシAPP143にジョブ(印刷ジョブ)取得要求を発行する(S1917)。プロキシAPP143は、図20(B)に示すジョブ情報の返信処理を実行し、その結果として次に示すような印刷ジョブ情報をMFP3へ返信する(S1918)。
[印刷ジョブ情報の例]
jobId: prn0001
dateTime: 20120814121812100
host: PC
owner: chancy
deviceId: 77778888
ticketUri: https://ske88funclub.com/print/ticket/prn001/ticket.xml
dataUri: https://ske88funclub.com/print/data/prn001/data.jpg
status: queued
MFP3は、印刷ジョブ情報から印刷設定を表す印刷設定ファイルの格納先と印刷画像ファイルの格納先(ticketUriとdataUri)を取得する。MFP3は、ticketUri、dataUriで指定されたパス(URI)にそれぞれアクセスして、印刷ジョブ(印刷設定ファイルと印刷画像ファイル)を取得する。MFP3は、印刷設定ファイルと印刷画像ファイルの内容に従って印刷を実行し、印刷を完了または終了した時に印刷が終了したことをAPP143に通知をする(S1919)。S1920において、プロキシAPP143は、図23に示すジョブの削除の処理を実行し、そのジョブに関する一連の処理を終了する(S1921)。MFP3は、印刷を完了または終了した後、オンラインでのスタンバイ状態となる(S1922)。
[プロキシAPP143におけるジョブのスタック処理とジョブ情報の返信処理]
図20は、プロキシAPP143におけるジョブのスタック処理とジョブ情報の返信処理の手順を示すフローチャートである。図20(A)は、プロキシAPP143におけるジョブのスタック処理の手順を示すフローチャートである。
図19のS1909においてジョブのスタック処理が実行されると、同図において、プロキシAPP143は、ジョブのスタック処理を開始する(S2001)。プロキシAPP143は、図22(A)に示すジョブキューにジョブをスタックし、図22(B)に示すジョブ情報を格納可能なテーブルに各情報を保存する(S2002)。プロキシAPP143は、ジョブIDを生成し(S2003)、ジョブID(印刷ジョブIDまたは読取ジョブID)をこの処理の呼び出し元に返し、この処理の呼び出し元に戻る(S2004)。
図20(B)は、プロキシAPP143におけるジョブ情報の返信処理の手順を示すフローチャートである。図19のS1918においてジョブ情報の返信処理が実行されると、同図において、プロキシAPP143は、ジョブ情報の返信処理を開始する(S2010)。プロキシAPP143は、デバイスIDで、対象のデバイス(MFP3)のジョブキューを特定し(S2011)、そのジョブキューにおいて、ジョブIDが一致するジョブを検索する(S2012)。
ここで、ジョブキューの例としては、図22(A)が挙げられる。プロキシAPP143がジョブキュー内にジョブが有ると判定した場合、S2014へ進み、ジョブが無いと判定した場合、S2016へ進む(S2013)。
S2014において、プロキシAPP143は、ジョブキュー内にスタックされているジョブIDのジョブ情報を取得してS2015へ進む。S2015において、プロキシAPP143は、S2014で取得したジョブ情報をそのデバイスに返信し、この処理の読み出し元に戻る(S2017)。
S2016において、プロキシAPP143は、対象のデバイスのジョブキュー内にジョブIDのジョブが無い為、ジョブ情報が存在しない旨をそのデバイスに返信し、この処理の読み出し元に戻る(S2017)。
[プロキシAPP143におけるジョブ通知処理]
図21は、プロキシAPP143におけるジョブ通知処理の手順を示すフローチャートである。プロキシAPP143は、常時起動していて、管理/制御対象のデバイス(プリンタやMFP)に対して順に、同図に示す処理を実行し、必要に応じて対象のデバイスにジョブ通知(印刷ジョブ通知)を送信する。同図では、対象のデバイスが特定された後の処理を示す。ここでは、対象のデバイスとして、MFP3が特定された例で説明する。
プロキシAPP143は、対象のデバイスをMFP3と特定して、ジョブ通知処理を実行すると、同図に示す処理を開始する(S2101)。プロキシAPP143は、デバイス(MFP3)の状態を確認し(S2102)、オンライン状態であると判定した場合、S2104へ進み、オンライン状態でないと判定した場合、S2109へ進む(S2103)。
S2104において、プロキシAPP143は、図22(A)に示すジョブキューを参照して、MFP3の印刷ジョブの有無を確認し、印刷ジョブが有ると判定した場合、S2105へ進み、印刷ジョブが無いと判定した場合、S2109へ進む。
S2105において、プロキシAPP143は、画像変換APP144に画像変換を要求する。画像変換APP144は、プロキシAPP143からの画像変換要求に従って、印刷対象の画像を、MFP3が印刷できるファイル形式であるJPEGファイルに変換する(S2106)。ここで、印刷対象の画像とは、文書作成APP145がHDD202に一時的に保存している、印刷対象のコンテンツまたは印刷用に生成したPDFファイルである。
画像変換APP144の画像変換処理が完了すると、プロキシAPP143は、処理中の印刷ジョブのジョブIDをキーとして、図22(B)に示すその印刷ジョブの詳細情報を参照してジョブ通知(印刷ジョブ通知)の必要性の有無を確認する。プロキシAPP143は、ジョブ通知が必要(notification=yes)と判定した場合、S2108へ進み、ジョブ通知が必要でない(notification=no)と判定した場合、S2109へ進む(S2107)。S2107において、プロキシAPP143は、判定結果を、図22(B)に示すジョブ情報を格納するテーブル内のジョブ通知の必要性の有無を表す情報として保存する。S2108において、プロキシAPP143は、MFP3にジョブ通知(印刷ジョブ通知)を送信し、この処理を終了する(S2109)。
[プロキシAPP143内のジョブキューと、ジョブキューにスタックされるジョブの印刷ジョブ情報]
図22は、プロキシAPP143内のジョブキューを表す図と、プロキシAPP143内のジョブキューにスタックされるジョブの印刷ジョブ情報を格納するテーブルを表す図である。ジョブキューは、一般的なデータベースで構成されている。同図において、「prn」の付いたジョブIDは、印刷ジョブのジョブIDを示し、プロキシAPP143は、これらのジョブIDを生成する。発行年月日・時刻は、例えば、図22(A)に示すprn0010のジョブIDの例の場合では、このジョブが2012年08月14日7時7分15秒の時刻に発行されたものであることを表す。図22(A)のジョブキューは、1つのジョブキューだけで構成された例であり、優先順位1位、容量制限は制限無しとして設定されているジョブキューの例である。
図22(B)に示すテーブルに格納される印刷ジョブ情報として、例えば、発行年月日・時刻、ホスト、オーナー名、デバイスID、ジョブチケットのパス(URI)、印刷画像データのパス(URL)、ステータス、ジョブ通知の必要性の有無、ジョブの優先順位がある。
[プロキシAPP143における印刷ジョブの削除処理]
図23は、プロキシAPP143における印刷ジョブの削除処理の手順を示すフローチャートである。図19のS1920において印刷ジョブの削除処理が実行されると、プロキシAPP143は、印刷ジョブの削除処理を開始する(S2301)。プロキシAPP143は、画像変換APP144に印刷画像ファイルの削除要求を発行すると(S2302)、画像変換APP144は、dataUriで指定されたパス(URI)に格納されている印刷画像ファイルを削除する(S2303)。
プロキシAPP143は、文書作成APP145に印刷対象画像削除要求を発行すると(S2304)、文書作成APP145は、印刷対象の画像、即ちHDD202に一時的に保存している印刷対象コンテンツまたは印刷用に生成したPDFファイルを削除する(S2305)。プロキシAPP143は、ジョブチケット削除要求を発行すると(S2306)、文書作成APP145は、印刷設定ファイル(ジョブチケット)を削除する(S2307)。プロキシAPP143は、ジョブ情報を削除し、図22に示すジョブキューからもそのジョブを削除し(S2308)、この処理の呼び出し元に戻る(S2309)。
[クラウド印刷の印刷ジョブ要求の印刷キューデータベースへの登録]
図24は、クラウド印刷の印刷ジョブ要求を印刷キューデータベースに登録する処理の手順を示すフローチャートである。図24のフローに係るプログラムは、ROM16に記憶されており、RAM17に読み出されてCPU15により実行される。
図19のS1915において、印刷ジョブ要求の登録処理が実行されると、MFP3は、印刷ジョブ要求を印刷キューデータベースに登録する処理を開始する(S2401)。S2401において、MFP3は、図26(A)に示す印刷キューデータベースを確認する。S2402において、印刷キューデータベースに空領域があって印刷ジョブ要求が登録可能である場合、S2404に進み、空領域がなく登録不可である場合、S2405に進む。
S2404において、クラウド印刷ジョブの印刷ジョブ要求を図26(A)に示す印刷キューデータベースに、Protocol名を「HTTP」にして登録し、この処理を終了する(S2406)。
S2405において、MFP3は、プロキシAPP143に印刷ジョブ要求を送信し、この処理を終了する(S2406)。プロキシAPP143は、印刷ジョブ要求を受信し(S2407)、図26(B)に示す印刷キューデータベースに印刷ジョブ要求を登録し(S2408)、この処理を終了する(S2409)。
[MFP3における印刷キューデータベースの最優先印刷ジョブ要求の確認処理]
図25は、MFP3における印刷キューデータベースの最優先印刷ジョブ要求の確認処理の手順を示すフローチャートである。縦の列が処理の実行元を表し、左側からMFP3、プロキシAPP143に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図25のフローに係るプログラムは、ROM16に記憶されており、RAM17に読み出されてCPU15により実行される。
プロキシAPP143の図26(B)に示す印刷キューデータベースに印刷ジョブ要求が予約されている状態において、MFP3が印刷ジョブ要求を図26(A)に示す印刷キューデータベースに登録した際、または、最優先印刷ジョブ要求が更新された際に、同図に示す処理が実行される(S2501)。S2502において、MFP3は、図26(A)に示す印刷キューデータベースに予約されている最も優先順位の高い印刷ジョブ要求の「Protocol」欄を確認し、クラウド印刷であるか否かを判定する。ここで、「HTTP」であればクラウド印刷であると判定してS2503に進み、「WSD」であればクラウド印刷でないと判定してS2504に進む。
S2503において、図19のS1917〜S1921のクラウド印刷処理を行い、印刷を終了する(S2505)。一方、S2504において、図14で示すようにPCからの印刷ジョブを受けて印刷を開始し、印刷を終了する(S2505)。
印刷終了後、印刷が終了した(実行済みの)印刷ジョブ要求を印刷キューデータベースから削除し(S2506)、MFP3は、プロキシAPP143に印刷ジョブ要求の取得要求を発行する(S2507)。
プロキシAPP143は、MFP3から印刷ジョブ要求の取得要求を受信すると(S2508)、プロキシAPP143の図26(B)の印刷キューデータベースに予約されている印刷ジョブ要求の中で最も優先順位の高い印刷ジョブ要求をMFP3に送信する。プロキシAPP143は、送信した印刷ジョブ要求を印刷キューデータベースから削除する(S2509)。MFP3は、プロキシAPP143から受信した印刷ジョブ要求(S2510)を、MFP3の印刷キューデータベースに登録し(S2511)、S2512において印刷キューデータベースを更新し、終了する(S2513)。
[MFP3における印刷キューデータベースの更新割込処理]
図27は、MFP3における印刷キューデータベースの更新割り込みの処理の手順を示すフローチャートである。縦の列が処理の実行元を表し、左側からMFP3、プロキシAPP143に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図27のフローに係るプログラムは、ROM16に記憶されており、RAM17に読み出されてCPU15により実行される。
MFP3に内蔵されているタイマーにより、180秒毎にこの割り込みが発生し、同図に示す処理が実行される。MFP3に内蔵されているタイマーにより、この割り込み処理が発生すると、同図のS2700が開始される。MFP3は、図26(A)に示す印刷キューデータベース内の予約されている印刷ジョブ要求の中から、最も優先順位の高いものの内容を確認し(S2701)、クラウド印刷であるか否かを判定する(S2702)。ここで、S2701で確認した印刷ジョブ要求の「Protocol」欄が「HTTP」であればクラウド印刷と判定してS2708に進み、「WSD」であればクラウド印刷でないと判定してS2703に進む。
S2703において、MFP3は、内蔵されているタイマーから時刻や経過時間を計測可能なカウント値をTime2としてRAM等に保存する(S2703)。このカウント値の単位は「秒」である。MFP3は、Time2と印刷キューデータベースの「Time」欄に設定されているタイムカウント値を減算する。MFP3は、その減算結果が既定時間(60秒)を超える場合、S2705へ進み、既定時間(60秒)以内の場合、S2706へ進む(S2704)。
S2705において、MFP3は、S2701で確認した印刷ジョブ要求の予約を図26(A)に示す印刷キューデータベース内から削除してS2708へ進む。その際、MFP3は、この印刷ジョブ要求の印刷予約ID(ans:ReceivedId)も削除する。
S2706において、MFP3は、S2704で求めた減算結果が既定時間(20秒)を超えるか否かを判定する(S2706)。ここで、超えると判定された場合、S2707へ進み、既定時間(20秒)を超えないと判定された場合、S2708へ進む。本実施形態では、この既定時間(20秒)は、図13のS1315で設定している20秒と同一の値である。S2707において、MFP3は、S2701で対象とした印刷ジョブ要求の印刷予約ID(ans:ReceivedId)を一旦削除する。そして、この印刷ジョブ要求を印刷キューデータベース内の最後尾に移動して、最も優先順位の低い印刷ジョブ要求の予約となるように変更し、S2708へ進む。
S2708において、MFP3が、全ての印刷ジョブ要求の予約の確認を完了した場合、S2710に進み、完了していない場合、S2709へ進む。S2709において、MFP3は、図26(A)に示す印刷キューデータベース内の、次の優先順位の印刷ジョブ要求の確認に進み、S2702へ戻る。
S2710において、MFP3の図26(A)に示す印刷キューデータベースに、空領域があって印刷ジョブ要求を登録可能であれば、S2711へ進み、空領域がなく登録不可であれば、印刷キューデータベースの更新割り込みの処理を終了する(S2715)。
S2711において、MFP3は、印刷ジョブ要求の取得要求をプロキシAPP143に発行する。S2712において、S2711でMFP3から発行された印刷ジョブ要求の取得要求を受信する。S2713において、プロキシAPP143は、図26(B)に示す印刷キューデータベースに予約されている印刷ジョブ要求の中で、最も優先順位の高い印刷ジョブ要求をMFP3に送信し、送信した印刷ジョブ要求を印刷キューデータベースから削除する。S2714において、MFP3は、プロキシAPP143から送信された印刷ジョブ要求を図26(A)に示す印刷キューデータベースに登録して、印刷キューデータベースの更新割り込みの処理を終了する(S2715)。
[印刷キューデータベースの更新処理]
図28は、印刷キューデータベースの更新処理の手順を示すフローチャートである。縦の列が処理の実行元を表し、左側からMFP3、プロキシAPP143に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図28のフローに係るプログラムは、ROM16に記憶されており、RAM17に読み出されてCPU15により実行される。
本処理は、図26(A)に示す印刷キューデータベースをRAM17に示すような揮発性メモリに実装した場合に行う処理である。図26(A)に示す印刷キューデータベースを不揮発性メモリ(不図示)に実装した場合は、本処理を行わなくても良い。
MFP3の電源がONになると、同図に示す処理が開始される(S2801)。S2802において、MFP3は、プロキシAPP143に印刷ジョブ要求の取得要求を発行する。プロキシAPP143は、MFP3からの印刷ジョブ要求の取得要求を受信すると(S2803)、プロキシAPP143の図26(B)に示す印刷キューデータベースに予約されている印刷ジョブ要求の中で、MFP3の印刷キューデータベースに登録できる数だけ、印刷ジョブ要求をMFP3に送信する。送信した印刷ジョブ要求は、印刷キューデータベースから削除し(S2804)、この処理を終了する(S2808)。
MFP3は、プロキシAPP143から送信された印刷ジョブ要求を受信すると(S2805)、受信した印刷ジョブ要求を印刷キューデータベースに登録して(S2806)、印刷キューデータベースの更新処理を終了する(S2807)。
本実施形態では、異なるプロトコルの印刷ジョブを同一の印刷キューデータベースで管理することにより、発行順に印刷をすることができる。より具体的には、例えば、ローカルネットワークにより接続された情報処理装置からのWSD印刷と、ワイドエリアネットワークを介して接続された情報処理装置からのクラウド印刷を同一の印刷キューデータベースで管理することにより、WSD印刷とクラウド印刷を発行順に印刷することができる。
また、本実施形態では、印刷を実行する装置(ここでは、MFP3)が印刷キューデータベース(印刷キュー管理テーブル)を備えるだけでなく、印刷を実行するMFP3とワイドエリアネットワークを介して接続する外部装置(ここでは、PC2)に、MFP3用の印刷キューデータベースを備える。そして、PC2のプロキシAPP143の印刷キューデータベースも異なるプロトコルの印刷ジョブ要求を一元管理することができる。これにより、MFP3に印刷ジョブの印刷要求を送信した際に、MFP3の印刷キューデータベースに送信した印刷ジョブ要求を登録できなかった場合、PC2に当該印刷ジョブを転送し、PC2の印刷キューデータベースに登録する。これにより、より多くの印刷ジョブの予約要求を管理することができる。すなわち、MFP3の印刷キューデータベースの容量が小さく、MFP3の印刷キューデータベースに予約要求を登録することができない場合でも、印刷の予約をしておくことができる。
[実施形態2]
実施形態1において、図19、図21では、PC1内のWebブラウザ25から文書作成APP145を実行して印刷を行う例を挙げた。この例の場合、プロキシAPP143がMFP3に印刷ジョブ通知を発行する前に、図21のS2105とS2106の画像変換処理が行なわれる。その為、MFP3は、図19のS1917の処理が開始されると、変換された画像データをすぐに取得でき印刷可能である。
しかしながら、図19のS1917の処理が開始されない場合、図21のS2106において変換された画像データは、PC2内に存在し続け、その間PC2のディスク容量を占有することになる。そこで、特定時間以上その画像データが印刷されない場合には、ディスク容量、セキュリティの観点から、PC2内から削除するほうが好ましいと考えられる。
ここで、図21のS2106の画像変換から特定時間以上経過した際に、PC2から画像データを削除する場合、特定時間以上経過後(画像データ削除後)に図19のS1917の印刷ジョブ取得要求を開始すると印刷に失敗してしまう、ということがある。本実施形態では、このことを解決するための周辺装置制御システムの一例を説明する。実施形態1で既に説明した内容に関しては、その説明を省略する。
本実施形態では、図21のS2105の画像変換要求とS2106の画像変換処理を、図19のS1917のMFP3からプロキシAPP143に印刷ジョブ要求の取得が発行された後に行うようにする。このようにすることで、MFP3が印刷を開始できる状態になってから、S2105の画像変換要求とS2106の画像変換処理を行うことになる。その為、MFP3は、変換された画像をすぐに印刷することができる。
[他の実施形態]
本発明は、上述した実施形態に限定されるものではない。例えば、上述した実施形態では、印刷を実行する装置(MFP3)以外の印刷キューデータベースとして、クラウド印刷を提供するアプリケーションサーバーが印刷キューデータベースを有するものとしたが、これに限定されるものではない。すなわち、印刷を実行する装置とネットワークを介して接続可能な外部装置が印刷を実行する装置用の印刷キューデータベースを有していればよい。また、印刷を実行する装置用の印刷キューデータベースは、複数の外部装置が備えるようにしてもよい。これにより、より多くの印刷ジョブを登録することができる。
本実施形態では、ローカルエリアネットワークを介して発行された第1のジョブとしてWSD印刷を例にあげたが、これに限定されず、他のプロトコルの印刷であってもよい。また、この場合、MFP3が備える印刷キューデータベースは、ローカルエリアネットワークを介して受け付けたWSD印刷と他のプロトコルの印刷と、ワイドエリアネットワークを介して受け付けたクラウド印刷を受け付け、情報処理装置からの発行順に従って、印刷ジョブ(印刷ジョブ要求)を管理するようにすればよい。
上述した実施形態では、プロキシAPP143が印刷ジョブの削除処理を行うものとしたが、これに限定されず、例えば、MFP3が印刷ジョブの削除処理を行うようにしてもよい。
上述した実施形態では、PC1、PC2、PC5、PC7、PC60,PC61、PC741、MFP3、MFP103が利用するネットワークのインタフェースとして、Ethernet(登録商標)を採用した。しかしながら、このインタフェースに限られることなく、例えば、無線LAN、IEEE1394、Bluetooth(登録商標)、USB等の任意のインタフェースを用いるようにしてもよい。また、各種のアプリケーション(ファームウェア)における機能、上述したフローチャートに係る処理の一部、又は全部を専用のハードウェアを用いて構成してもよい。
上述した実施形態では、情報処理装置としてパーソナルコンピュータを想定した。しかしながら、この例に限られるものではなく、例えばDVDプレーヤー、ゲーム、セットトップボックス、インターネット家電等、同様な使用方法が可能な任意の情報処理装置(端末)に対して適用することができ、有効である。
上述した実施形態では、周辺装置としてMFPを例示した。しかしながら、周辺装置として他に、複写機、ファクシミリ、スキャナ、デジタルカメラ、及びこれらの複合機能を備える装置等の何れかであってもよい。上述した実施形態では、OSの例としてWindowsと同等のOSを使用したが、このOSに限られるものではなく、任意のOSを使用することができる。上述した実施形態では、ネットワーク4の構成例としてEthernet(登録商標)を用いたが、この例に限られるものではなく、他の任意のネットワーク構成であってもよい。
上述した実施形態は、PC60からWSDのプロトコルを利用した印刷システムを利用した例を説明したが、PC60からベンダー独自のプロトコルを利用した印刷システムまたは、OSが提供するその他のローカルまたはネットワーク印刷システム等の任意の印刷システムや、任意のプロトコルを利用した場合も同様に適用することができる。上述した実施形態は、PC1からGCPを利用した印刷システムを利用した例を説明したが、Internet Printing Protocolや、Universal Plug and Playなどの任意の印刷サービスを利用した印刷システムも同様に適用することができる。
本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。また、プログラムは、1つのコンピュータで実行させても、複数のコンピュータを連動させて実行させるようにしてもよい。また、上記した処理の全てをソフトウェアで実現する必要はなく、処理の一部または全部をASIC等のハードウェアで実現するようにしてもよい。また、CPUも1つのCPUで全ての処理を行うものに限らず、複数のCPUが適宜連携をしながら処理を行うものとしてもよい。