(57)【要約】【課題】ワイドエリアネットワークを介して発行された印刷ジョブとローカルエリアネットワークを介して発行された印刷ジョブを同一のキュー内で管理し、受け付けた順に印刷することができる画像形成装置を提供する。【解決手段】情報処理装置からワイドエリアネットワークを介して発行された第１のジョブを示す第１のジョブ情報を受信し、また、情報処理装置からローカルエリアネットワークを介して発行された第２のジョブを示す第２のジョブ情報を受信する。その第１及び第２のジョブの発行順に従って、第１のジョブ情報と第２のジョブ情報を第１の記憶部に格納する。【選択図】図２６
2015150706.tif 000002
【特許請求の範囲】
【請求項１】
ジョブを発行する情報処理装置とワイドエリアネットワーク又はローカルエリアネットワークを介して通信可能な画像形成装置であって、
前記情報処理装置から前記ワイドエリアネットワークを介して発行された第１のジョブを示す第１のジョブ情報を受信する第１の受信手段と、
前記情報処理装置から前記ローカルエリアネットワークを介して発行された第２のジョブを示す第２のジョブ情報を受信する第２の受信手段と、
前記第１のジョブ及び前記第２のジョブの情報処理装置からの発行順に従って、前記第１の受信手段により受信した前記第１のジョブ情報と前記第２の受信手段により受信した前記第２のジョブ情報を第１の記憶部に格納させるように制御する制御手段と、
を備えることを特徴とする画像形成装置。
【請求項２】
前記制御手段は、前記第１の記憶部の空き容量に応じて、前記第１の受信手段により受信した前記第１のジョブ情報又は前記第２の受信手段により受信した前記第２のジョブ情報を、前記第１の記憶部と異なる第２の記憶部に格納させることを特徴とする請求項１に記載の画像形成装置。
【請求項３】
前記第２の記憶部は、前記ワイドエリアネットワークを介して通信可能な外部装置が備えることを特徴とする請求項２に記載の画像形成装置。
【請求項４】
前記制御手段により格納された前記第１のジョブ情報又は前記第２のジョブ情報に対応するジョブを実行すると、前記第２の記憶部から当該実行済みのジョブに対応する前記第１のジョブ情報又は前記第２のジョブ情報を削除するよう前記第２の記憶部を備える他の装置に対して要求する要求手段、をさらに備えることを特徴とする請求項２又は３に記載の画像形成装置。
【請求項５】
前記制御手段は、前記第１のジョブ情報又は前記第２のジョブ情報を格納可能な空き容量が前記第１の記憶部にない場合に、前記第１のジョブ情報又は前記第２のジョブ情報を前記第２の記憶部に格納することを特徴とする請求項１乃至４のいずれか１項に記載の画像形成装置。
【請求項６】
実行済みのジョブに対応する前記第１のジョブ情報又は前記第２のジョブ情報を前記第１の記憶部から削除する削除手段、をさらに備え、
前記削除手段による削除の結果、前記第１のジョブ情報又は前記第２のジョブ情報を格納可能な空き容量が前記第１の記憶部に発生した場合、前記制御手段は、前記第２の記憶部から前記第１のジョブ情報又は前記第２のジョブ情報を取得して前記第１の記憶部に格納する、ことを特徴とする請求項１乃至５のいずれか１項に記載の画像形成装置。
【請求項７】
前記削除手段は、さらに、前記第１の記憶部に記憶されている時間が予め定められた時間を経過している前記第１ジョブ情報又は前記第２のジョブ情報を削除することを特徴とする請求項６に記載の画像形成装置。
【請求項８】
前記制御手段は、前記発行順に従って、前記第２の記憶部から前記第１のジョブ情報又は前記第２のジョブ情報を取得することを特徴とする請求項６又は７に記載の画像形成装置。
【請求項９】
前記第１のジョブ情報及び前記第２のジョブ情報は、前記情報処理装置からのジョブの発行時間を含むことを特徴とする請求項１乃至８のいずれか１項に記載の画像形成装置。
【請求項１０】
前記第１の受信手段は、前記情報処理装置からのジョブの発行を受け付けるサーバから前記第１のジョブ情報を受信することを特徴とする請求項１乃至９のいずれか１項に記載の画像形成装置。
【請求項１１】
ジョブを発行する情報処理装置とワイドエリアネットワーク又はローカルエリアネットワークを介して通信可能な画像形成装置において実行される制御方法であって、
前記情報処理装置から前記ワイドエリアネットワークを介して発行された第１のジョブを示す第１のジョブ情報を受信する第１の受信工程と、
前記情報処理装置から前記ローカルエリアネットワークを介して発行された第２のジョブを示す第２のジョブ情報を受信する第２の受信工程と、
前記第１のジョブ及び前記第２のジョブの情報処理装置からの発行順に従って、前記第１の受信工程において受信した前記第１のジョブ情報と前記第２の受信工程において受信した前記第２のジョブ情報を第１の記憶部に格納させる制御工程と、
を有することを特徴とする制御方法。
【請求項１２】
請求項１乃至１０のいずれか１項に記載の画像形成装置の各手段としてコンピュータを機能させるためのプログラム。
【請求項１３】
情報処理装置からワイドエリアネットワークを介して発行された第１のジョブを示す第１のジョブ情報を受信する第１の受信手段と、
前記情報処理装置からローカルエリアネットワークを介して発行された第２のジョブを示す第２のジョブ情報を受信する第２の受信手段と、
前記第１の受信手段により受信した前記第１のジョブ情報と前記第２の受信手段により受信した前記第２のジョブ情報を第１の記憶部に格納する格納手段と、
前記第１の受信手段により受信した前記第１のジョブ情報と前記第２の受信手段により受信した前記第２のジョブ情報の格納先を制御する制御手段と、を備える画像形成装置と、
前記第１のジョブ情報と前記第２のジョブ情報を格納可能な第２の記憶部、を備える装置と、を含み、
前記制御手段は、前記第１のジョブ及び前記第２のジョブの前記情報処理装置からの発行順及び前記第１の記憶部の空き容量に応じて、前記第１の受信手段により受信した前記第１のジョブ情報又は前記第２の受信手段により受信した前記第２のジョブ情報を前記第１の記憶部又は前記第２の記憶部に格納させる、ことを特徴とする画像形成システム。
【請求項１４】
前記情報処理装置から前記ワイドエリアネットワークを介して発行されたジョブを受け付けて前記第１のジョブ情報を生成する生成手段と、
前記生成手段により生成された前記第１のジョブ情報を前記画像形成装置に送信する送信手段と、を備える装置をさらに含むことを特徴とする請求項１２に記載の画像形成システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ジョブを管理する画像形成装置、制御方法およびプログラム、並びに、画像形成システムに関する。
【背景技術】
【０００２】
近年、ＵＳＢ、Ｅｔｈｅｒｎｅｔ（登録商標）、無線ＬＡＮ等の様々なインタフェースを利用して、情報処理装置に周辺装置を接続した周辺装置制御システムが、自宅、オフィス等、様々な場面で有効に活用されている。周辺装置の例としては、プリンタ、複写機、ファクシミリ、スキャナ、デジタルカメラ、これらの複合機等が挙げられる。ローカルネットワークで接続された情報処理装置は、大容量の記憶媒体を持たない低コストなプリンタに対してベンダ独自のネットワーク印刷システムと、ＷＳＤ（Web Service on Devices）のPrint Serviceを利用したネットワーク印刷システムとを実現できる。このような異なるネットワーク印刷システムを利用して印刷する場合でも、プリンタはそれぞれの印刷ジョブを同一の印刷キュー内で管理することで、プリンタが情報処理装置から印刷ジョブを受け付けた順に印刷可能とすることが知られている（特許文献１）。
【０００３】
近年、このようなプリンタに対して、Ｇｏｏｇｌｅ  Ｉｎｃ．からGoogle Cloud Print（登録商標。以下、ＧＣＰ）と呼ばれるクラウド印刷サービスが提供されている。クラウド印刷サービスを利用する場合、まずユーザは、パーソナルコンピュータ（ＰＣ）やモバイル端末からそのＰＣやモバイル端末内にインストールされているＷｅｂブラウザにより文書作成用のアプリケーション（Ｗｅｂアプリケーション）等を起動する。そして、インターネットを介して文書をプリンタや複合機で印刷することが可能である。これらクラウド印刷の印刷ジョブは、クラウド印刷サービスを提供するアプリケーションの印刷キューで管理される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１１−１３４３０３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
従来では、ローカルネットワークで接続された情報処理装置からの印刷ジョブは、プリンタ内の印刷キューで管理される。また、クラウド印刷の印刷ジョブは、クラウド印刷サービスを提供するアプリケーション内の印刷キューに登録される。そして、プリンタが情報処理装置からＷＡＮ（ワイドエリアネットワーク）を介してクラウド印刷を受け付けた場合、クラウド印刷はプリンタ内の印刷キューで管理されず、そのまま印刷される。したがって、プリンタがローカルネットワークで接続された情報処理装置の印刷ジョブを受け付けた後からクラウド印刷を受け付けたとしても、クラウド印刷の印刷ジョブが割り込んで先に印刷されてしまう可能性がある。
【０００６】
本発明の目的は、このような従来の問題点を解決することにある。
【課題を解決するための手段】
【０００７】
上記課題を解決するため、本発明に係る画像形成装置は、ジョブを発行する情報処理装置とワイドエリアネットワーク又はローカルエリアネットワークを介して通信可能な画像形成装置であって、前記情報処理装置から前記ワイドエリアネットワークを介して発行された第１のジョブを示す第１のジョブ情報を受信する第１の受信手段と、前記情報処理装置から前記ローカルエリアネットワークを介して発行された第２のジョブを示す第２のジョブ情報を受信する第２の受信手段と、前記第１のジョブ及び前記第２のジョブの情報処理装置からの発行順に従って、前記第１の受信手段により受信した前記第１のジョブ情報と前記第２の受信手段により受信した前記第２のジョブ情報を第１の記憶部に格納させるように制御する制御手段と、を備えることを特徴とする。
【発明の効果】
【０００８】
本発明によれば、ワイドエリアネットワークを介して発行された印刷ジョブとローカルエリアネットワークを介して発行された印刷ジョブを同一のキュー内で管理し、受け付けた順に印刷することができる。
【図面の簡単な説明】
【０００９】
【図１】印刷システムの構成を示す図である。
【図２】ＰＣ、モバイル端末、ＭＦＰのハードウェアの構成を示す図である。
【図３】ＰＣのソフトウェアの構成を示す図である。
【図４】ＰＣにおけるプリンタドライバの構成を示す図である。
【図５】ＷＳＤ印刷時のコーリングシーケンスを示す図である。
【図６】ＷＳＤ印刷時のコーリングシーケンスを示す図である。
【図７】ＷＳＤ印刷時のコーリングシーケンスを示す図である。
【図８】GetPrinterElementsの内容を示す図である。
【図９】GetPrinterElementsの内容を示す図である。
【図１０】GetPrinterElementsの内容を示す図である。
【図１１】CreatePrintJobの内容を示す図である。
【図１２】ＭＦＰにおけるCreatePrintJobの処理の手順を示す図である。
【図１３】ＭＦＰにおけるGetPrinterElementsの処理の手順を示す図である。
【図１４】ランゲージモニタにおけるLM_WritePort()関数の処理の手順を示す図である。
【図１５】ポートモニタにおけるPM_WritePort()関数の処理の手順を示す図である。
【図１６】ＭＦＰにおける印刷予約ＩＤの発行処理と、プロキシＡＰＰの印刷キューデータベースへの登録処理の手順を示す図である。
【図１７】ＰＣの文書作成ＡＰＰの画面をＷｅｂブラウザで表示した一例を示す図である。
【図１８】印刷画面の一例を示す図である。
【図１９】ＰＣのＷｅｂブラウザから文書作成ＡＰＰを実行して印刷を行う処理の手順を示す図である。
【図２０】プロキシＡＰＰにおけるジョブのスタック処理とジョブ情報の返信処理の手順を示す図である。
【図２１】プロキシＡＰＰにおけるジョブ通知処理の手順を示す図である。
【図２２】プロキシＡＰＰ内のジョブキューとプロキシＡＰＰ内のジョブキューにスタックされるジョブのジョブ情報を格納するテーブルを示す図である。
【図２３】ＭＦＰとプロキシＡＰＰにおける印刷ジョブの削除処理の手順を示す図である。
【図２４】クラウド印刷の印刷ジョブ要求の登録処理の手順を示す図である。
【図２５】ＭＦＰにおける印刷キューデータベースの最優先印刷ジョブ要求の確認処理の手順を示す図である。
【図２６】ＭＦＰが受け付けた印刷ジョブ要求を管理する印刷キューデータベースを示す図である。
【図２７】ＭＦＰにおける印刷キューデータベースの更新割込処理の手順を示す図である。
【図２８】ＭＦＰにおける印刷キューデータベースの更新処理の手順を示す図である。
【発明を実施するための形態】
【００１０】
以下、添付図面を参照して本発明の好適な実施形態を詳しく説明する。尚、以下の実施形態は特許請求の範囲に係る本発明を限定するものでなく、また本実施形態で説明されている特徴の組み合わせの全てが本発明の解決手段に必須のものとは限らない。なお、同一の構成要素には同一の参照番号を付して、説明を省略する。
【００１１】
以下で引用されるWindows7 Operating Systemの情報の内、特に詳しい説明を付加していないものに関しては、Microsoft Developer Network (MSDN)のサイトで公開されている情報である。以下において、ＷＳＤとは、Web Service on Devicesを表し、Windows Hardware Developer Centralのサイト上で公開されている情報である。また、ＷＳＤのPrint Service Definition Version 1.0は、Windows Hardware Developer Centralのサイト上で公開されている米国Microsoft Corporationが定義したPrint Serviceである。これらについては、説明を省略する。
【００１２】
以下において、ＷｅｂサービスＡＰＩにＳＳＬ通信で暗号化されたＨＴＴＰＳのＰＯＳＴメソッド（通信方式の一例）を利用している場合があるが、このＰＯＳＴメソッドに関しては公知のものを用いることができる。また、以下において、ＷｅｂサービスＡＰＩにＨＴＴＰのＧＥＴメソッド（通信方式の一例）を利用している場合があるが、このＧＥＴメソッドに関しては公知のものを用いることができる。また、以下において、ＷｅｂサービスＡＰＩにＳＳＬ通信で暗号化されたＨＴＴＰＳのＧＥＴメソッド（通信方式の一例）を利用している場合があるが、このＧＥＴメソッドに関しては公知のものを用いることができる。また、ＨＴＴＰは、Hyper Text Transfer Protocolの略であり、暗号化されていない公知の通信プロトコルである。
【００１３】
また、ＨＴＴＰＳは、Hyper Text Transfer Protocol over Secure Socket Layerの略であり、暗号化された公知の通信プロトコルである。また、ＳＳＬは、Secure Socket Layerの略であり、インターネット上でデータを暗号化して送受信する公知の方法である。また、Google Cloud Print(GCP)は、インターネット上のサイトで公知の機能である。
【００１４】
［第１の実施形態］
［システム構成］
図１は、情報処理装置、及び周辺装置を含んで構成されるシステム構成の一例（画像形成システム）を示す図である。画像形成システムは、複数の情報処理装置と、複数の周辺装置と、端末装置と、を備えており、インターネットを介して相互に通信可能に構成されている。ＰＣ１、ＰＣ２、ＰＣ５、ＰＣ７、ＰＣ６０、ＰＣ６１及びＰＣ７４１の各々は、情報処理装置（コンピュータ）の一例であり、例えば、一般的なパーソナルコンピュータである。ＰＣ１、ＰＣ２、ＰＣ５、ＰＣ７、ＰＣ６０、ＰＣ６１及びＰＣ７４１の各々は、詳細は後述するが、図２（Ａ）に示すハードウェアを含む。ここで、各ＰＣ（ＰＣ１，ＰＣ２，ＰＣ５，ＰＣ７，ＰＣ６０，ＰＣ６１，ＰＣ７４１）は、同じＯＳがインストールされていてもよいし、それぞれ異なるＯＳがインストールされていてもよい。各ＰＣのＯＳは、特に限定されるものではない。本実施形態では、ＰＣ１には、第１のＯＳ、例えば、Operating System（ＯＳ）としてＧｏｏｇｌｅ  Ｉｎｃ．製のＣｈｒｏｍｅ（登録商標）と同等のＯＳがインストールされている。また、ＰＣ２、ＰＣ５、ＰＣ６０、ＰＣ６１及びＰＣ７４１の各々には、第２のＯＳ、例えば、Microsoft Corporation製のＷｉｎｄｏｗｓ（登録商標）のＳｅｒｖｅｒ用のＯＳがインストールされ、第３のＯＳ、例えば、ＰＣ７には、Ｌｉｎｕｘ（登録商標）と同等のＯＳがインストールされている。ＰＣ１、ＰＣ２、ＰＣ５、ＰＣ７、ＰＣ６０、ＰＣ６１及びＰＣ７４１は、それぞれＥｔｈｅｒｎｅｔ（登録商標）等のインタフェース（Ｉ／Ｆ）で構成されるローカルエリアネットワーク（ＬＡＮ）４、６、８、１０、１１に接続され、さらに、ワイドエリアネットワーク（ＷＡＮ）（インターネット１２）に接続される。すなわち、例えば、ＭＦＰ３と、ＰＣ６０と、ＰＣ６１は、ローカルエリアネットワークにより接続されている。
【００１５】
マルチファンクションプリンタ（ＭＦＰ）３、１０３は、周辺装置の一例であり、例えば、プリント機能、スキャナ機能、及びファクシミリ機能などを備える画像形成装置である。本実施形態では、各ＭＦＰは、カラーインクジェットプリンタ、カラーファクシミリ、カラースキャナ、フラッシュメモリ用の外部ストレージ等を含んで構成される。ＭＦＰ３、１０３は、例えば、ＡＢＣ社製のＫｍｍｎというモデル名のＭＦＰとする。なお、周辺装置は、これに限定されるものではなく、プリンタ、複写機、ファクシミリ、スキャナ、デジタルカメラ、又はこれらの複合機能を備える装置等であってもよい。
【００１６】
ＭＦＰ３は、Ｅｔｈｅｒｎｅｔ（登録商標）で構成されるネットワーク１１に接続され、インターネット１２にも接続されている。ＭＦＰ１０３は、Ｅｔｈｅｒｎｅｔ（登録商標）で構成されるネットワーク１０４に接続され、さらに、ネットワーク１０４を介してインターネット１２に接続されている。ＭＦＰ３，ＭＦＰ１０３は、詳細は後述するが、図２（Ｂ）に示すハードウェアを含む。
【００１７】
ルーター（Ｒｏｕｔｅｒ）１３は、例えば、Ｗｉ−Ｆｉ（登録商標）の無線ＬＡＮを備えるブロードバンドルーター（Ｗｉ−Ｆｉ  ＢＢ  Ｒｏｕｔｅｒ）であり、インターネット１２に接続されている。モバイル端末（Ｍｏｂｉｌｅ  Ｄｅｖｅｃｅ）１４は、例えば、携帯電話、携帯情報端末である。モバイル端末１４は、詳細は後述するが、図２（Ａ）に示すハードウェアを含む。モバイル端末１４は、ルーター１３と接続され、ルーター１３を介してインターネット１２に接続される。本実施形態に係るモバイル端末１４には、第４のＯＳ、例えば、Ｇｏｏｇｌｅ  Ｉｎｃ．製のＡｎｄｒｏｉｄ（登録商標）と同等のＯＳがインストールされている。以下において、モバイル端末１４は、その一例として携帯電話であるとする。
【００１８】
ＰＣ７は、サーバーとして機能し、アプリケーション（Ａｐｐｌｉｃａｔｉｏｎ）１４５、アプリケーション（Ａｐｐｌｉｃａｔｉｏｎ）１４６、アプリケーション（Ａｐｐｌｉｃａｔｉｏｎ）１４７を備える。アプリケーション１４５は、Ｗｅｂサービスを利用した文書作成用のアプリケーションであり、以下、文書作成ＡＰＰ１４５と称する。アプリケーション１４６は、Ｗｅｂサービスを利用したクラウド印刷サービスを提供するアプリケーションであり、以下、クラウド印刷ＡＰＰ１４６と称する。アプリケーション１４７は、Ｗｅｂサービスを利用した画像や文書読取用のアプリケーションであり、以下、読取ＡＰＰ１４７と称する。
【００１９】
また、ＰＣ２は、サーバーとして機能し、アプリケーション（Ａｐｐｌｉｃａｔｉｏｎ）を備える。アプリケーション１４３は、ＭＦＰ３及びＭＦＰ１０３をクラウド印刷ＡＰＰ１４６が提供するクラウド印刷サービスに対応させるためのクラウド印刷プロキシサービスを提供するアプリケーションである。以下、プロキシＡＰＰ１４３と称する。ＰＣ２にインストールされているプロキシＡＰＰ１４３は、例えば、５０００台のＭＦＰを一度に管理することができ、それぞれのＭＦＰをクラウド印刷ＡＰＰ１４６が提供するクラウド印刷サービスに対応させることができる。プロキシＡＰＰ１４３は、詳細は後述するが、図２２に示すプリントキューを備える。
【００２０】
ＰＣ５は、サーバーとして機能し、アプリケーション（Ａｐｐｌｉｃａｔｉｏｎ）１４４を備える。アプリケーション１４４は、ＰＤＦファイルをＪＰＥＧファイルに変換する画像変換サービスを提供するアプリケーションであり、以下、画像変換ＡＰＰ１４４と称する。
【００２１】
ＰＣ１、ＰＣ２、ＰＣ５、ＰＣ７、ＰＣ６０、ＰＣ６１、ＰＣ７４１、モバイル端末１４、ＭＦＰ３、及びＭＦＰ１０３は、インターネット１２を介して相互に通信可能に接続されている。Ｗｅｂブラウザ（Ｗｅｂ  Ｂｒｏｗｓｅｒ）２５は、ＰＣ１にインストールされ、Ｗｅｂブラウザ９は、モバイル端末１４にインストールされている。Ｗｅｂブラウザ２７、２８は、ＭＦＰ３、１０３にそれぞれインストールされている。Ｗｅｂブラウザ２７と２８は同一のものであるが、Ｗｅｂブラウザ９、２５、２７は、それぞれ異なるＷｅｂブラウザである。すなわち、Ｗｅｂブラウザ９、２５、２８は、それぞれ異なるＷｅｂブラウザである。Ｗｅｂブラウザ９、２５、２７、２８が、ＨＴＴＰリクエストのＵｓｅｒ−Ａｇｅｎｔヘッダで文書作成ＡＰＰ１４５に渡すＨＴＴＰユーザーエージェントは、それぞれ異なり、例えば、次のように定義されている。
【００２２】
モバイル端末１４のＷｅｂブラウザ９のユーザーエージェント：User-Agent: XXXX/5.0 (AAAA)
ＰＣ１のＷｅｂブラウザ２５のユーザーエージェント：User-Agent: XXXX/6.0 (CCCC)
ＭＦＰ３のＷｅｂブラウザ２７のユーザーエージェント：User-Agent: YYYY/4.0 (DDDD)
ＡＡＡＡ、ＣＣＣＣ、ＤＤＤＤが端末を識別する情報を表している。文書作成ＡＰＰ１４５は、これらの情報を利用して、端末の種類を識別（例えば、モバイル端末であるか、ＰＣであるか、ＭＦＰであるか）を判別し、アプリケーションが表示する画面や、内部処理を切り換えることができる。
【００２３】
クラウド印刷ＡＰＰ１４６は、上述した通り、Ｗｅｂサービスを利用したクラウド印刷サービスを提供するものであり、例えば、Ｇｏｏｇｌｅ  Ｉｎｃ．が提供するＧＣＰと同等の機能を有する。このクラウド印刷サービスを利用することで、ＰＣ１内のＷｅｂブラウザ２５やモバイル端末１４内のＷｅｂブラウザ９から、文書作成ＡＰＰ１４５を実行し、所望の文書を開き、その文書をＭＦＰ３やＭＦＰ１０３で印刷することができる。
【００２４】
詳細は後述するが、例えば、ユーザが、開いている文書を印刷する場合、図１７に示す文書作成ＡＰＰ１４５により表示される画面の印刷メニュー４０１を選択すると、クラウド印刷ＡＰＰ１４６により図１８に示す印刷画面１４２が表示される。ユーザが印刷画面１４２でプリンタを選択し、印刷ボタン５３４を押して印刷の実行を指示すると、文書作成ＡＰＰ１４５は、印刷画像をＰＤＦファイルとして生成する。
【００２５】
そして、クラウド印刷ＡＰＰ１４６は、この印刷画像（ＰＤＦファイル）と印刷画面１４２で選択されている印刷設定値とから印刷ジョブ（印刷データ）を生成し、クラウド印刷サービス内の選択されたプリンタ用のプリントキューにその印刷ジョブを格納する。また、クラウド印刷ＡＰＰ１４６は、そのＭＦＰに対して印刷ジョブ通知を送信する。但し、本実施形態においては、プロキシＡＰＰ１４３が、プリンタに対して印刷ジョブ通知を送信する。
【００２６】
ＭＦＰがＰＤＦファイルをレンダリングする機能を備えている場合、ＭＦＰは、プリントキューに格納されている印刷ジョブを印刷することができる。しかしながら、廉価版のインクジェットプリンタやＭＦＰにおいては、プリンタやＭＦＰがＰＤＦファイルをレンダリングする機能を備えていないことがある。この場合は、このようなプリンタ等でプリントキューに格納されている印刷ジョブを印刷する場合、ＰＤＦファイルの印刷画像を、ＪＰＥＧファイル等、廉価版のプリンタ等でレンダリングできるタイプの画像フォーマットに変換すること（前処理）が必要となる。
【００２７】
ここで、クラウド印刷ＡＰＰ１４６が提供するクラウド印刷サービスを利用するためには、ユーザアカウントとパスワードとを用いたログインを必要とする。したがって、クラウド印刷サービスを利用するユーザに、ユーザアカウントとパスワードを登録させる。クラウド印刷ＡＰＰ１４６は、印刷に利用可能なＭＦＰをクラウド印刷サービスに登録する際に、まず、そのユーザアカウントとパスワードとを使って、クラウド印刷サービスを利用する際のアクセストークンを取得する。そして、クラウド印刷ＡＰＰ１４６は、取得したアクセストークンを利用し、そのユーザアカウントにＭＦＰを関連付けて登録する。
【００２８】
また、クラウド印刷ＡＰＰ１４６は、プリンタやＭＦＰの登録の際に、各プリンタやＭＦＰに対して一意の値で表わされるデバイスＩＤを発行して割り当て、デバイスＩＤを登録対象のプリンタやＭＦＰに通知する。なお、プリンタやＭＦＰの登録処理に関しては、公知の方法を用いることができる。
【００２９】
図２は、ＰＣ、モバイル端末、及びＭＦＰのハードウェアの構成の一例を示す図である。ＰＣ１、ＰＣ２、ＰＣ５、ＰＣ７、ＰＣ６０、ＰＣ６１、ＰＣ７４１、及びモバイル端末１４の各々は、図２（Ａ）に示すハードウェアを含む。図２（Ａ）では、ＰＣ１を例に挙げて説明する。
【００３０】
ＰＣ１は、ランダムアクセスメモリ部（ＲＡＭ２０１）、ハードディスクドライブ部（ＨＤＤ２０２）、キーボード部（ＫＢＤ２０３）、ＣＰＵ２０４、表示用ディスプレイ（ＬＣＤ２０５）、ネットワークボード（ＮＢ２０７）を有する。また、ＰＣ１は、上述の構成要素を互いに接続するバス２０６を有する。
【００３１】
ＣＰＵ２０４は、制御部の一例であり、ＰＣ１の中央処理装置として機能する。なお、ＨＤＤ２０２は、記憶部の一例である。記憶部は、可搬性ＣＤ−ＲＯＭまたは内部に据付のＲＯＭ、フラッシュメモリ、ＳＳＤ等であってもよい。ＫＢＤ２０３は、入力部の一例である。ＬＣＤ２０５は、表示部の一例である。ＮＢ２０７は、通信制御部の一例である。
【００３２】
プロキシＡＰＰ１４３、図３に示す各モジュール（ソフトウェア）等のプログラムは、ＨＤＤ２０２に記憶され、ＣＰＵ２０４により必要に応じてＲＡＭ２０１に読み出されて実行される。これにより、プロキシＡＰＰ１４３の機能、図３に示す各モジュール（ソフトウェア）の機能などが実現される。また、各種のデータベース（ＤＢ）は、ＨＤＤ２０２に設けられ、データベースの情報は、ＣＰＵ２０４により必要に応じてＲＡＭ２０１に読み出される。
【００３３】
ＭＦＰ３及びＭＦＰ１０３の各々は、図２（Ｂ）に示すハードウェアを含む。図２（Ｂ）では、ＭＦＰ３を例に挙げて説明する。
【００３４】
ＭＦＰ３は、ＣＰＵ１５，ＲＯＭ１６，ＲＡＭ１７，通信部１８、記録部１９、操作部２０、表示部２１、読取り部２２、ファクシミリ制御部２３、外部ストレージ制御部２４を有する。また、ＭＦＰ３は、上述の構成要素を互いに接続するバスを有する。
ＣＰＵ１５は、マイクロプロセッサ等から構成される。ＣＰＵ１５は、ＭＦＰ３の中央処理装置として、ＲＯＭ１６に記憶されているプログラムに従って、ＲＡＭ１７、通信部１８、記録部１９、操作部２０、表示部２１、読取部２２、ファクシミリ制御部２３、及び外部ストレージ制御部２４を制御する。
【００３５】
ＲＯＭ１６には、プリンタドライバ（不図示）による制御に従ってＭＦＰ３が行う記録（印刷）処理、印刷動作の状態をＰＣへ通知する処理などを実行するプログラムが記憶されている。また、ＲＯＭ１６には、ＦＡＸドライバ（不図示）による制御に従ってＭＦＰ３がファクシミリの送信処理または受信処理、ファクシミリ動作（送信または受信）の状態をＰＣへ通知する処理を実行するプログラムが記憶されている。ＲＡＭ１７には、印刷データが一時的に記憶される。印刷データは、主にＰＣから送られ、印刷データに基づき記録部１９によって印刷される。また、ＲＡＭ１７には、読取部２２で読取られた画像データ、ＰＣから送られてきたファクシミリの送信データ、ファクシミリ制御部２３で受信されたファクシミリの受信データ等も一時的に記憶される。
【００３６】
通信部１８には、ネットワーク４用の接続ポート、アナログ電話回線用の接続ポート等が含まれており、Ｅｔｈｅｒｎｅｔ（登録商標）、ファクシミリのアナログ通信を制御する。記録部１９は、インクジェット記録方式の記録ヘッド、各カラーインク、キャリッジ、記録紙搬送機構等から構成される記録ユニットと、印刷データを基に記録ヘッドにて印刷用パルスを発生させるためのＡＳＩＣ等から構成される電気回路とを含む。なお、記録部の記録方式はこれに限定されるものではなく、公知のものを用いることができる。
【００３７】
例えば、印刷可能なアプリケーション上での印刷操作、又はファクシミリの送信操作によって、アプリケーションで開かれているファイルの表示内容（画像データ）が、ＥＭＦ形式のスプールファイルとしてＰＣ２のＨＤＤ２０２に一時的に格納される。そして、スプールファイルは、プリンタドライバ、又はＦＡＸドライバを介してＭＦＰ３制御用コマンドを含む印刷データ、又はファクシミリの送信データに変換された後、インターネットを介してＭＦＰ３に送られる。
【００３８】
ＭＦＰ３にて受信された印刷データは、記録部１９で印刷用パルスに変換され、記録紙（被記録媒体）上に印刷される。また、ＭＦＰ３にて受信されたファクシミリの送信データは、ファクシミリ制御部２３でファクシミリの通信プロトコルに変換され、アナログ電話回線を介して相手先のファクシミリ装置に送信される。
【００３９】
操作部２０は、電源ボタン、リセットボタン等の各種ボタンから構成され、ＭＦＰ３に対する操作を受け付ける。表示部２１は、タッチパネルの液晶ディスプレイで構成され、ＭＦＰ３の状態の表示、各種の設定情報や電話番号の表示、入力等を行うことができる。読取部２２は、カラーイメージセンサや画像処理用のＡＳＩＣ等から構成される電気回路を含んで構成され、スキャナ機能を制御する。
【００４０】
ファクシミリ制御部２３は、ファクシミリ用のモデム、アナログ通信回路等から構成され、ファクシミリの通信プロトコルに従ってファクシミリの送信および受信を制御する。外部ストレージ制御部２４は、フラッシュメモリの装着用のスロット、ストレージ用のインタフェース回路等から構成され、装着されたフラッシュメモリを制御する。
【００４１】
図３は、ＰＣのソフトウェアの構成の一例を示す図である。
図３（Ａ）では、サーバーとして機能するＰＣ２を例に挙げて説明する。ＰＣ２は、Ａｐｐｌｉｃａｔｉｏｎｓ８２と、Internet Information Services（ＩＩＳ）９０と、ＪＡＶＡ（登録商標）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ（Ｊａｖａ（登録商標）  ＶＭ）８９と、ＩＰ  Ｎｅｔｗｏｒｋ９１と、Ｉ／Ｆ９２と、を有する。これらは、ＯＳに標準で同梱されているモジュールである。
【００４２】
Ｉ／Ｆ９２は、Ｅｔｈｅｒｎｅｔ（登録商標）等のＩ／Ｆを制御するＩ／Ｆ制御スタックである。ＩＰ  Ｎｅｔｗｏｒｋ９１は、ＩＰ  Ｎｅｔｗｏｒｋを制御するＩＰ  Ｎｅｔｗｏｒｋ制御スタックである。
【００４３】
ＩＩＳ９０は、ＩＩＳを制御するＩＩＳ制御部であり、プロキシＡＰＰ１４３は、このＩＩＳ制御部のＷｅｂサーバー機能を利用してＷｅｂサービスを提供する。Ｊａｖａ（登録商標）  ＶＭ８９は、Ｊａｖａ（登録商標）バイトコードをプラットフォームのネイティブコードに変換して実行するソフトウェアであり、プロキシＡＰＰ１４３は、ＪＡＶＡ  ＶＭ８９上で実行される。
【００４４】
Ａｐｐｌｉｃａｔｉｏｎｓ８２は、アプリケーション群であり、プロキシＡＰＰ１４３、アプリケーション１５０等から構成される。尚、アプリケーション１５０は、公知のアプリケーションの１つを表すものであり、ここではその詳細な説明を省略する。
【００４５】
図３（Ｂ）では、クライアントとして機能するＰＣ６０を例に挙げて説明する。ＰＣ６０は、アプリケーション１００と、インタフェース１０２と、デバイスドライバ１０７と、スタック１０１と、スタックスタック１０４と、スタック１０８と、スタック１０９と、スタック１１０と、を有する。
【００４６】
スタック１１０は、Ｅｔｈｅｒｎｅｔ（登録商標）を制御するＥｔｈｅｒｎｅｔ（登録商標）制御スタックであり、スタック１０９は、ＩＰ  Ｎｅｔｗｏｒｋを制御するＩＰ  Ｎｅｔｗｏｒｋ制御スタックである。また、スタック１０４は、ＷＳＤを制御するＷＳＤ制御スタックであり、スタック１０８は、ＩＨＶの独自プロトコルを制御するＩＨＶネイティブプロトコル制御スタックである。また、スタック１０１はネットワークのプラグ・アンド・プレイ（以降、Ｎ−ＰｎＰ）を制御するＮ−ＰｎＰ制御スタックである。尚、ネットワーク接続デバイスに対するサポートを提供する、プラグ・アンド・プレイの一連の拡張機能として、Ｗｉｎｄｏｗｓ７ＯＳに標準搭載されている機能として、Plug and Play Extensions（ＰｎＰ−Ｘ）が存在するが、本実施形態では、それと同等の機能としてＮ−ＰｎＰを利用する例を挙げて説明する。後述するＷＳＤを制御するＷＳＤＡＰＩｓは、ＷＳＤ制御スタック１０４に含まれる。ＩＨＶの独自プロトコルを制御するＡＰＩｓは、ＩＨＶネイティブプロトコル制御スタック１０８に含まれる。
【００４７】
デバイスドライバ１０７は、デバイスドライバ群であり、ＯＳに標準で同梱されている標準ドライバ群１０５とＩＨＶから提供されるＩＨＶ製ドライバ群１０６とから構成される。
【００４８】
アプリケーション１００と、インタフェース１０２と、デバイスドライバ１０７と、スタック１０１と、スタック１０４と、標準ドライバ群１０５と、スタック１０８と、スタック１０９と、スタック１１０と、が、ＯＳに標準で同梱されているモジュールである。そして、ＩＨＶ製ドライバ群１０６及びスタック１０７が、ＩＨＶ製モジュールである。
【００４９】
インタフェース１０２は、アプリケーション／ＤＤＩインタフェースであり、Application Programming Interface（ＡＰＩ）、Device Driver Interface（ＤＤＩ）から構成される。Ａｐｐｌｉｃａｔｉｏｎｓ１００は、アプリケーション群であり、アプリケーション３０等を含む。アプリケーション３０は、後述する印刷可能なアプリケーションである。
【００５０】
図４は、ＰＣ６０におけるプリンタドライバの構成を表す図である。同図において、プリンタドライバ５０は、ＰＣ６０にインストールされているＭＦＰ３用のプリンタドライバであり、ＭＦＰ３の製造元であるＡＢＣ社製から提供される。このプリンタドライバ５０は、モジュール３３〜３６、３９を含む。アプリケーション３０は、印刷可能なアプリケーションであり、例えば、ＯＳに標準で同梱されているテキストエディタであるＮｏｔｅｐａｄ（Ｎｏｔｅｐａｄ．ｅｘｅ）等に相当する。モジュール３１は、Graphics Device Interface（ＧＤＩ）であり、ＯＳの一部である。プリンタキュー３２は、スプーラ４０の一部として構成され、印刷ジョブがキューイングされる。キューイングされた印刷ジョブは、プリンタキューフォルダ（不図示）に表示される。プリントプロセッサ３３は、印刷レイアウトの変更や印刷画像に対する特殊処理を行う。グラフィックスドライバ３４は、プリンタドライバの画像処理のコアとして、ＧＤＩ３１から送られる描画命令をもとに印刷用の画像処理を行い、印刷制御コマンドを作成する。
【００５１】
ＵＩモジュール３５は、プリンタドライバのユーザインタフェースの提供及び制御を行う。ランゲージモニタ３６は、データの通信Ｉ／Ｆとしてデータの送受信を制御する。ステータスモニタ３９は、ＭＦＰ３のインクの残量や、警告、エラー等の状態を表示する。ポートモニタ３７は、ランゲージモニタ３６から送られるデータを適切なポートに対して送信したり、ＭＦＰ３から送られるデータをクラスドライバ３８を介して受信したりする処理を行う。特に、ＵＳＢを制御するポートモニタのことをＵＳＢＭｏｎ、ＷＳＤのPrint Serviceを制御するポートモニタのことをＷＳＤＭｏｎと呼ぶ。クラスドライバ３８は、最もポートに近いローレベルのモジュールである。本実施形態では、ＷＳＤやＩＨＶの独自プロトコルのプリンタクラスのドライバに相当し、ポート（本実施形態では、ＵＳＢまたはネットワークポート）を制御する。
【００５２】
［ＷＳＤ印刷におけるコーリングシーケンス］
図５〜図１６までは、ＷＳＤ印刷の処理に係るコーリングシーケンス、フローチャートの一例を示す図である。これらのコーリングシーケンス、フローチャートに係るプログラムは、ＰＣまたはＭＦＰ内に記憶されている。ＰＣ上で動作するアプリケーションのプログラムは、ＨＤＤ２０２に記憶されており、ＣＰＵ２０４によりＲＡＭ２０１に読み出されて実行される。ＭＦＰ上で動作するアプリケーションのプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出され、ＣＰＵ１５により実行される。
【００５３】
図５は、ＭＦＰ３とローカルネットワークで接続されたＰＣから印刷時のコーリングシーケンスを示す図である。ここで、ＭＦＰ３は、複数の印刷ジョブを受け付けることができ、そのうちの１つの印刷ジョブだけを処理して印刷を実行することができるプリンタであるとする。
【００５４】
図５において、ユーザがアプリケーション３０から印刷を開始したのを検知すると（Ｓ５０１）、ＯＳは、スプーラ４０のStartPrintJob()関数をコールする。この関数内において（Ｓ５０２）、まず、スプーラ４０は、ランゲージモニタ３６のLM_StartDocPort()関数をコールする（Ｓ５０３）。この関数内において（Ｓ５０４）、ランゲージモニタ３６は、lmMultipleJobsにFALSEを代入して初期化する（Ｓ５０５）。
【００５５】
このlmMultipleJobsは、ランゲージモニタ３６内で使用されるフラグであり、ＭＦＰ３が複数の印刷ジョブを受け付けて順次処理する機能を備えている場合にTRUEがセットされ、それ以外の場合にFALSEがセットされる。ランゲージモニタ３６は、lmRetryに０を代入して初期化する（Ｓ５０６）。このlmRetryは、ランゲージモニタ３６内で使用される変数であり、ＰＣ６０がＭＦＰ３に発行する印刷ジョブ要求のリトライ回数を表す。ランゲージモニタ３６は、lmReceivedIdに”None”を代入して初期化する（Ｓ５０７）。このlmReceivedIdには、図６で後述するＳ６０７、Ｓ６２３において、ＭＦＰ３が印刷ジョブ要求の予約を受け付けた時に発行する印刷予約ＩＤが代入される。
【００５６】
その後、ランゲージモニタ３６は、ポートモニタ３７のPM_StartDocPort()関数をコールする（Ｓ５０８）。この関数内において（Ｓ５０９）、ポートモニタ３７は、必要に応じて適当な処理を行い（Ｓ５１０）、戻り値pmRetにその処理の結果を代入してこの関数を終了し、呼び出し元に戻る（Ｓ５１１）。通常、正常に処理された場合はpmRetにTRUEが代入され、それ以外の場合はpmRetにFALSEが代入される。
【００５７】
ランゲージモニタ３６は、PM_StartDocPort()関数の戻り値を戻り値lmRetに代入して（Ｓ５０８）、LM_StartDocPort()関数を終了し、呼び出し元に戻る（Ｓ５１２）。スプーラ４０は、このLM_StartDocPort()関数の戻り値をspRetに代入する（Ｓ５０３）。spRetがTRUEではない（FALSEである）場合（Ｓ５１３）、Ｓ５０３に戻り、スプーラ４０は、ランゲージモニタ３６のLM_StartDocPort()関数をコールする。Ｓ５１３においてspRetがTRUEの場合、図６のＳ６０１へ進む。図６において、印刷ジョブ要求の発行、予約処理に関して後述する。
【００５８】
最後に、スプーラ４０は、ランゲージモニタ３６のLM_EndDocPort()関数をコールする（Ｓ５２０）。この関数内において（Ｓ５２１）、ランゲージモニタ３６は、lmMultipleJobsにFALSEを代入して初期化する（Ｓ５２２）。ランゲージモニタ３６は、lmRetryに０を代入して初期化する（Ｓ５２３）。ランゲージモニタ３６は、lmReceivedIdに”None”を代入して初期化する（Ｓ５２４）。その後、ランゲージモニタ３６は、ポートモニタ３７のPM_EndDocPort()関数をコールする（Ｓ５２５）。
【００５９】
この関数内において（Ｓ５２６）、ポートモニタ３７は、必要に応じて適当な処理を行い（Ｓ５２７）、戻り値pmRetにその処理の結果を代入してこの関数を終了し、呼び出し元に戻る（Ｓ５２８）。通常、正常に処理された場合はpmRetにTRUEが代入され、それ以外の場合はpmRetにFALSEが代入される。ランゲージモニタ３６は、PM_EndDocPort()関数の戻り値を戻り値lmRetに代入して（Ｓ５２５）、LM_EndDocPort()関数を終了し、呼び出し元に戻る（Ｓ５２９）。スプーラ４０は、このLM_EndDocPort()関数の戻り値をspRetに代入し（Ｓ５２０）、StartPrintJob()関数を終了し、呼び出し元に戻る（Ｓ５３０）。
【００６０】
［印刷ジョブ要求の発行、予約処理］
図６は、ＭＦＰ３とローカルネットワークで接続されたＰＣから印刷時のコーリングシーケンスを示す図である。図６において、スプーラ４０は、ランゲージモニタ３６のLM_WritePort()関数をコールする（Ｓ６０２）。この関数内において（Ｓ６０３）、ランゲージモニタ３６は、lmRetryとlmMultipleJobsの値を確認し（Ｓ６０４）、lmRetryが０より大きく、かつ、lmMultipleJobsがTRUEの場合、Ｓ６０５へ進み、lmRetryが０またはlmMultipleJobsがTRUEではない（FALSEである）場合、Ｓ６０９へ進む。
【００６１】
Ｓ６０５において、ランゲージモニタ３６は、引数にans:ABCCommandをセットして、ＷＳＤを制御するＷＳＤＡＰＩｓのGetPrinterElements()関数をコールする。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのGetPrinterElementsRequestをＭＦＰ３に発行する。このGetPrinterElementsRequestに対して、ＭＦＰ３は、GetPrinterElementsResponseをＰＣ６０に返す（Ｓ６０６）。ＰＣ６０がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元に戻る（Ｓ６０５）。ＰＣ６０がＭＦＰ３に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元に戻る（Ｓ６０５）。
【００６２】
Ｓ６０５において、ランゲージモニタ３６は、GetPrinterElements()関数の戻り値をlmRetに代入する。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。Ｓ６０５でＰＣ６０が発行するGetPrinterElementsRequestと、それに対してＭＦＰ３が返すGetPrinterElementsResponseの詳細に関しては図９、図１０で説明する。
【００６３】
ランゲージモニタ３６は、Ｓ６０５のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の＜ans:ReceivedId＞要素９１２または１０１１にセットされている値を、lmReceivedIdに代入する（Ｓ６０７）。ランゲージモニタ３６は、lmReceivedIdの値を確認し、「None」の場合（Ｓ６２７）、lmRetryに０を代入して印刷ジョブ要求のリトライ回数を初期化する（Ｓ６２８）。lmReceivedIdの値が「None」ではない場合（Ｓ６２９）、ランゲージモニタ３６は、lmRetryに１を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新する（Ｓ６０８）。
【００６４】
Ｓ６０９において、ランゲージモニタ３６は、ポートモニタ３７のPM_WritePort()関数をコールする。この関数内において（Ｓ６１０）、ポートモニタ３７は、ＷＳＤを制御するＷＳＤＡＰＩｓのCreatePrintJob()関数をコールする（Ｓ６１１）。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのCreatePrintJobRequestをＭＦＰ３に発行する。このCreatePrintJobRequestの中に、この印刷ジョブに関する詳細情報が含まれている。このCreatePrintJobRequestに対して、ＭＦＰ３は、CreatePrintJobResponseまたはFault(ServerErrorNotAcceptingJobs)をＰＣ６０に返す（Ｓ６１２）。
【００６５】
例えば、ＭＦＰ３が印刷ジョブを受け付けて、この印刷ジョブを実行することができる状態の時に、その印刷ジョブを受け付けた場合、ＭＦＰ３は、CreatePrintJobResponseをＰＣ６０に返す。ＭＦＰ３が印刷ジョブを受け付けることはできるが、この印刷ジョブを実行することができない状態の時に、その印刷ジョブを受け付けた場合、ＭＦＰ３はFault(ServerErrorNotAcceptingJobs)をＰＣ６０に返す。また、ＭＦＰ３が印刷ジョブを受け付けることができない場合も、ＭＦＰ３は、Fault(ServerErrorNotAcceptingJobs)をＰＣ６０に返す。ＰＣ６０がCreatePrintJobResponseを受け取ると、CreatePrintJob()関数の戻り値にTRUEが代入されて、呼び出し元に戻る（Ｓ６１３）。ＰＣ６０がFault(ServerErrorNotAcceptingJobs)を受け取ると、CreatePrintJob()関数の戻り値にFALSEが代入されて、呼び出し元に戻る（Ｓ６１１）。
【００６６】
ポートモニタ３７は、戻り値pmRetにCreatePrintJob()関数の戻り値を代入して（Ｓ６１１）、PM_WritePort()関数を終了し、呼び出し元に戻る（Ｓ６１３）。ランゲージモニタ３６は、PM_WritePort()関数の戻り値を戻り値lmRetに代入する（Ｓ６０９）。ランゲージモニタ３６は、lmRetの値を確認し（Ｓ６１４）、TRUEの場合、Ｓ６２５へ進み、TRUEではない（FALSEである）場合、lmRetryの値を確認する（Ｓ６１５）。Ｓ６１５において、lmRetryが０の場合、ランゲージモニタ３６は、引数にwprt:PrinterDescriptionをセットして、ＷＳＤを制御するＷＳＤＡＰＩｓのGetPrinterElements()関数をコールする（Ｓ６１６）。
【００６７】
この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのGetPrinterElementsRequestをＭＦＰ３に発行する。このGetPrinterElementsRequestの中に、ＭＦＰ３が複数の印刷ジョブを受け付けることができるか否かを表す＜ans:MultipleJobsControl＞要素８０２（図８（ｂ）で後述）を取得する為に必要な＜wprt:Name＞wprt:PrinterDescription＜/wprt:Name＞要素８０１（図８（Ａ）で後述）が含まれている。このGetPrinterElementsRequestに対して、ＭＦＰ３は、GetPrinterElementsResponseをＰＣ６０に返す（Ｓ６１７）。ＰＣ６０がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元に戻る（Ｓ６１６）。ＰＣ６０がＭＦＰ３に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元に戻る（Ｓ６１６）。
【００６８】
Ｓ６１６において、ランゲージモニタ３６は、GetPrinterElements()関数の戻り値をlmRetに代入する。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。ランゲージモニタ３６は、GetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の＜ans:MultipleJobsControl＞要素８０２にセットされている値を確認する（Ｓ６１８）。Ｓ６１８において、＜ans:MultipleJobsControl＞要素８０２に「true」がセットされている場合、lmMultipleJobsにTRUEを代入する（Ｓ６１９）。Ｓ６１５において、lmRetryが０以外（Ｓ６０８、Ｓ６２４でlmRetryに代入される値は０以上の整数なので、実際には０より大きい整数）の場合、Ｓ６２０へ進む。
【００６９】
Ｓ６２０において、lmMultipleJobsがTRUEの場合、ランゲージモニタ３６は、引数にans:ABCCommandをセットして、ＷＳＤを制御するＷＳＤＡＰＩｓのGetPrinterElements()関数をコールする（Ｓ６２１）。
【００７０】
この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのGetPrinterElementsRequestをＭＦＰ３に発行する。このGetPrinterElementsRequestに対して、ＭＦＰ３は、GetPrinterElementsResponseをＰＣ６０に返す（Ｓ６２２）。ＰＣ６０がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元に戻る（Ｓ６２１）。ＰＣ６０がＭＦＰ３に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元に戻る（Ｓ６２１）。
【００７１】
Ｓ６２１において、ランゲージモニタ３６は、GetPrinterElements()関数の戻り値をlmRetに代入する。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。Ｓ６２１でＰＣ６０が発行するGetPrinterElementsRequestと、それに対してＭＦＰ３が返すGetPrinterElementsResponseの詳細に関しては図９、図１０で説明する。
【００７２】
ランゲージモニタ３６は、Ｓ６２１のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の＜ans:ReceivedId＞要素９１２または１０１１にセットされている値、すなわち印刷予約ＩＤを、lmReceivedIdに代入する（Ｓ６２３）。
【００７３】
ランゲージモニタ３６は、lmReceivedIdの値を確認し、「None」の場合（Ｓ６３０）、lmRetryに０を代入して印刷ジョブ要求のリトライ回数を初期化する（Ｓ６３１）。lmReceivedIdの値が「None」ではない場合（Ｓ６３２）、ランゲージモニタ３６は、lmRetryに１を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新する（Ｓ６２４）。
【００７４】
Ｓ６２０において、lmMultipleJobsがTRUEではない（FALSEである）場合、Ｓ６２５へ進む。Ｓ６２５において、ランゲージモニタ３６は、LM_WritePort()関数を終了し、呼び出し元に戻る。この時、このLM_WritePort()関数の戻り値として、lmRetの値が返される。スプーラ４０は、このLM_WritePort()関数の戻り値をspRetに代入する（Ｓ６０２）。spRetがTRUEではない（FALSEである）場合（Ｓ６２６）、Ｓ６０２に戻り、スプーラ４０は、ランゲージモニタ３６のLM_WritePort()関数をコールする。Ｓ６２６においてspRetがTRUEの場合、スプーラ４０は、引き続き図７に示す印刷データの送信処理を行う。
【００７５】
［印刷データの送信処理］
図７は、印刷時のコーリングシーケンスを示す図である。図６のＳ６２６において、spRetがTRUEの場合、図７において、スプーラ４０は、ランゲージモニタ３６のLM_WritePort()関数をコールする（Ｓ７０１）。この関数内において（Ｓ７０２）、ランゲージモニタ３６は、ポートモニタ３７のPM_WritePort()関数をコールする（Ｓ７０３）。この関数内において（Ｓ７０４）、ポートモニタ３７は、ＷＳＤを制御するＷＳＤＡＰＩｓのSendDocument()関数をコールする（Ｓ７０５）。
【００７６】
この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのSendDocumentRequestをＭＦＰ３に発行し、ＭＴＯＭ（Message Transmission Optimization Mechanism）メッセージエンコーディングを使って、印刷制御コマンドで構成された印刷データを、ＳＯＡＰメッセージを使用して未処理のバイトとしてＭＦＰ３に送信する。ＭＦＰ３は、SendDocumentRequestに対してSendDocumentResponseをＰＣ６０に返す（Ｓ７０６）。ＰＣ６０がSendDocumentResponseを受け取り、全ての印刷データをＭＦＰ３に送信し終わると、SendDocument()関数の戻り値にTRUEが代入されて、呼び出し元に戻る（Ｓ７０５）。
【００７７】
ＰＣ６０がSendDocumentRequestを発行した時、あるいはSendDocumentResponseを受け取った時に何らかのエラーが発生した場合、SendDocument()関数の戻り値にFALSEが代入されて、呼び出し元に戻る（Ｓ７０５）。ポートモニタ３７は、戻り値pmRetにSendDocument()関数の戻り値を代入して（Ｓ７０５）、PM_WritePort()関数を終了し、呼び出し元に戻る（Ｓ７０７）。
【００７８】
ランゲージモニタ３６は、PM_WritePort()関数の戻り値を戻り値lmRetに代入して（Ｓ７０３）、LM_WritePort()関数を終了し、呼び出し元に戻る（Ｓ７０８）。スプーラ４０は、このLM_WritePort()関数の戻り値をspRetに代入する（Ｓ７０１）。spRetがTRUEではない（FALSEである）場合（Ｓ７０９）、Ｓ７０１に戻り、スプーラ４０は、ランゲージモニタ３６のLM_WritePort()関数をコールする。Ｓ７０９においてspRetがTRUEの場合、図５のＳ５２０へ進む。
【００７９】
［ランゲージモニタ３６におけるLM_WritePort()関数の処理］
図１４は、ランゲージモニタ３６におけるLM_WritePort()関数の処理の手順を示すフローチャートである。図１４のフローに係るプログラムは、ＨＤＤ２０２に記憶されており、ＲＡＭ２０１に読み出され、ＣＰＵ２０４により実行される。図６において、スプーラ４０がランゲージモニタ３６のLM_WritePort()関数をコールすると、図１４において、ランゲージモニタ３６がLM_WritePort()関数の処理を開始する（Ｓ１４０１）。ランゲージモニタ３６は、lmRetryとlmMultipleJobsの値を確認し（Ｓ１４０２）、lmRetryが０より大きく、かつ、lmMultipleJobsがTRUEの場合、Ｓ１４０４へ進む。一方、lmRetryが０またはlmMultipleJobsがTRUEではない（FALSEである）場合、Ｓ１４０９へ進む（Ｓ１４０３）。
【００８０】
Ｓ１４０４において、ランゲージモニタ３６は、引数にans:ABCCommandをセットして、ＷＳＤを制御するＷＳＤＡＰＩｓのGetPrinterElements()関数をコールする。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのGetPrinterElementsRequestをＭＦＰ３に発行する（Ｓ１４０４）。このGetPrinterElementsRequestに対して、ＭＦＰ３は、GetPrinterElementsResponseをＰＣ６０に返す（図６のＳ６０６、図１３のＳ１３１９）。
【００８１】
ＰＣ６０がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１４０４）。ＰＣ６０がＭＦＰ３に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１４０４）。ランゲージモニタ３６は、GetPrinterElements()関数の戻り値をlmRetに代入する（Ｓ１４０４）。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。Ｓ１４０４でＰＣ６０が発行するGetPrinterElementsRequestと、それに対してＭＦＰ３が返すGetPrinterElementsResponseの詳細に関しては図９、図１０で説明する。
【００８２】
ランゲージモニタ３６は、Ｓ１４０４のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の＜ans:ReceivedId＞要素９１２または１０１１にセットされている値を、lmReceivedIdに代入する（Ｓ１４０５）。ランゲージモニタ３６は、lmReceivedIdの値を確認し（Ｓ１４０６）、「None」の場合、Ｓ１４０７へ進み、「None」ではない場合、Ｓ１４０８へ進む。
【００８３】
Ｓ１４０７において、ランゲージモニタ３６は、lmRetryに０を代入して印刷ジョブ要求のリトライ回数を初期化し、Ｓ１４０９へ進む。一方、Ｓ１４０８において、ランゲージモニタ３６は、lmRetryに１を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新し、Ｓ１４０９へ進む。
【００８４】
Ｓ１４０９において、ランゲージモニタ３６は、ポートモニタ３７のPM_WritePort()関数をコールする。この関数内におけるポートモニタ３７の処理は、図１５（Ａ）で後述する。ランゲージモニタ３６は、PM_WritePort()関数の戻り値を戻り値lmRetに代入する（Ｓ１４０９）。ランゲージモニタ３６は、lmRetの値を確認し（Ｓ１４１０）、TRUEの場合、Ｓ１４２１へ進み、TRUEではない（FALSEである）場合、Ｓ１４１１へ進む。Ｓ１４１１において、ランゲージモニタ３６は、lmRetryの値を確認し、０の場合、Ｓ１４１２へ進み、０以外の場合、Ｓ１４１５へ進む。０以外の場合とは、Ｓ１４０８、Ｓ１４２０でlmRetryに代入される値は０以上の整数なので、実際には０より大きい整数の場合である。
【００８５】
Ｓ１４１２において、ランゲージモニタ３６は、引数にwprt:PrinterDescriptionをセットして、ＷＳＤを制御するＷＳＤＡＰＩｓのGetPrinterElements()関数をコールする。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのGetPrinterElementsRequestをＭＦＰ３に発行する（Ｓ１４１２）。このGetPrinterElementsRequestの中に、ＭＦＰ３が複数の印刷ジョブを受け付けることができるか否かを表す＜ans:MultipleJobsControl＞要素８０２（図８（Ｂ）で後述）を取得する為に必要な＜wprt:Name＞wprt:PrinterDescription＜/wprt:Name＞要素８０１（図８（Ａ）で後述）が含まれている。このGetPrinterElementsRequestに対して、ＭＦＰ３は、GetPrinterElementsResponseをＰＣ６０に返す（図６のＳ６１７、図１３のＳ１３１９）。
【００８６】
ＰＣ６０がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１４１２）。ＰＣ６０がＭＦＰ３に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１４１２）。ランゲージモニタ３６は、GetPrinterElements()関数の戻り値をlmRetに代入する（Ｓ１４１２）。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。ランゲージモニタ３６は、GetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の＜ans:MultipleJobsControl＞要素８０２にセットされている値を確認する（Ｓ１４１３）。
【００８７】
Ｓ１４１３において、＜ans:MultipleJobsControl＞要素８０２に「true」がセットされている場合、Ｓ１４１４へ進み、それ以外の場合、Ｓ１４１５へ進む。Ｓ１４１４において、ランゲージモニタ３６は、lmMultipleJobsにTRUEを代入し、Ｓ１４１５へ進む。Ｓ１４１５において、ランゲージモニタ３４は、lmMultipleJobsの値を確認し、TRUEの場合、Ｓ１４１６へ進み、TRUEではない（FALSEである）場合、Ｓ１４２１へ進む。
【００８８】
Ｓ１４１６において、ランゲージモニタ３６は、引数にans:ABCCommandをセットして、ＷＳＤを制御するＷＳＤＡＰＩｓのGetPrinterElements()関数をコールする。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのGetPrinterElementsRequestをＭＦＰ３に発行する。このGetPrinterElementsRequestに対して、ＭＦＰ３は、GetPrinterElementsResponseをＰＣ６０に返す（図６のＳ６２２、図１３のＳ１３１９）。ＰＣ６０がGetPrinterElementsResponseを受け取ると、GetPrinterElements()関数の戻り値にTRUEが代入されて、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１４１６）。ＰＣ６０がＭＦＰ３に対してGetPrinterElementsRequestを発行してからある一定時間の間に、GetPrinterElementsResponseを受け取らなかった場合、GetPrinterElements()関数の戻り値にFALSEが代入されて、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１４１６）。ランゲージモニタ３６は、GetPrinterElements()関数の戻り値をlmRetに代入する（Ｓ１４１６）。尚、ここでは、GetPrinterElements()関数の戻り値としてFALSEが返されるようなエラーケースの説明は省略する。Ｓ１４１６でＰＣ６０が発行するGetPrinterElementsRequestと、それに対してＭＦＰ３が返すGetPrinterElementsResponseの詳細に関しては図９、図１０で説明する。
【００８９】
ランゲージモニタ３６は、Ｓ１４１６のGetPrinterElements()関数の引数として渡されたGetPrinterElementsResponse内の＜ans:ReceivedId＞要素９１２または１０１１にセットされている値、すなわち印刷予約ＩＤを、lmReceivedIdに代入し（Ｓ１４１７）、Ｓ１４１８へ進む。ランゲージモニタ３６は、lmReceivedIdの値を確認し（Ｓ１４１８）、「None」の場合、Ｓ１４１９へ進み、「None」ではない場合、Ｓ１４２０へ進む。Ｓ１４１９において、ランゲージモニタ３６は、lmRetryに０を代入して印刷ジョブ要求のリトライ回数を初期化し、Ｓ１４２０へ進む。Ｓ１４２０において、ランゲージモニタ３６は、lmRetryに１を足した値をlmRetryに代入して、印刷ジョブ要求のリトライ回数を更新する。Ｓ１４２１において、ランゲージモニタ３６は、LM_WritePort()関数の戻り値として、lmRetをスプーラ４０にリターンして返し、LM_WritePort()関数の処理を終了して、呼び出し元であるスプーラ４０に戻る（Ｓ１４２２）。
【００９０】
［ポートモニタ３７におけるPM_WritePort()関数の処理］
図１５は、ポートモニタ３７におけるPM_WritePort()関数の処理の手順を示すフローチャートである。図１５のフローに係るプログラムは、ＨＤＤ２０２に記憶されており、ＲＡＭ２０１に読み出され、ＣＰＵ２０４により実行される。図１４のＳ１４０９において、ランゲージモニタ３６がポートモニタ３７のPM_WritePort()関数をコールすると、図１５（Ａ）において、ポートモニタ３７がPM_WritePort()関数の処理を開始する（Ｓ１５０１）。ポートモニタ３７がCreatePrintJobの状況を確認し（Ｓ１５０２）、CreatePrintJobRequestを発行して、それに対する応答としてCreatePrintJobResponseを既に受信済みの場合（Ｓ１５０３）、Ｓ１５０５へ進み、それ以外の場合、Ｓ１５０４へ進む。Ｓ１５０５において、ポートモニタ３７は、戻り値pmRetにTRUEを代入する。
【００９１】
Ｓ１５０４において、ポートモニタ３７は、ＷＳＤを制御するＷＳＤＡＰＩｓのCreatePrintJob()関数をコールする。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのCreatePrintJobRequestをＭＦＰ３に発行する（Ｓ１５０４）。このCreatePrintJobRequestの中に、この印刷ジョブに関する詳細情報が含まれている。このCreatePrintJobRequestに対して、ＭＦＰ３は、CreatePrintJobResponseまたはFault(ServerErrorNotAcceptingJobs)をＰＣ６０に返す（図６のＳ６１２）。例えば、ＭＦＰ３が印刷ジョブを受け付けて、この印刷ジョブを実行することができる状態の時に、その印刷ジョブを受け付けた場合、ＭＦＰ３は、CreatePrintJobResponseをＰＣ６０に返す（図６のＳ６１２）。ＭＦＰ３が印刷ジョブを受け付けることはできるが、この印刷ジョブを実行することができない状態の時に、その印刷ジョブを受け付けた場合、ＭＦＰ３は、Fault(ServerErrorNotAcceptingJobs)をＰＣ６０に返す（図６のＳ６１２）。また、ＭＦＰ３が印刷ジョブを受け付けることができない場合も、ＭＦＰ３は、Fault(ServerErrorNotAcceptingJobs)をＰＣ６０に返す（図６のＳ６１２）。
【００９２】
ＰＣ６０がCreatePrintJobResponseを受け取ると、CreatePrintJob()関数の戻り値にTRUEが代入されて、呼び出し元であるポートモニタ３７に戻る（Ｓ１５０４）。ＰＣ６０がFault(ServerErrorNotAcceptingJobs)を受け取ると、CreatePrintJob()関数の戻り値にFALSEが代入されて、呼び出し元であるポートモニタ３７に戻る（Ｓ１５０４）。ポートモニタ３７は、戻り値pmRetにCreatePrintJob()関数の戻り値を代入する（Ｓ１５０４）。ポートモニタ３７は、PM_WritePort()関数の戻り値として、pmRetをランゲージモニタ３６にリターンして返し（Ｓ１５０６）、PM_WritePort()関数の処理を終了して、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１５０７）。
【００９３】
図７のＳ７０３において、ランゲージモニタ３６がポートモニタ３７のPM_WritePort()関数をコールすると、図１５（Ｂ）において、ポートモニタ３７がPM_WritePort()関数の処理を開始する（Ｓ１５０８）。ポートモニタ３７がSendDocumentの状況を確認し（Ｓ１５０９）、SendDocumentRequestを発行して、それに対する応答としてSendDocumentResponseを既に受信済みの場合（Ｓ１５１０）、Ｓ１５１２へ進み、それ以外の場合、Ｓ１５１１へ進む。
【００９４】
Ｓ１５１２において、ポートモニタ３７は、戻り値pmRetにTRUEを代入する。Ｓ１５１１において、ポートモニタ３７は、ＷＳＤを制御するＷＳＤＡＰＩｓのSendDocument()関数をコールする（図７のＳ７０５）。この関数内において、ＰＣ６０は、ＷＳＤのPrint ServiceのSendDocumentRequestをＭＦＰ３に発行し、ＭＴＯＭ（Message Transmission Optimization Mechanism）メッセージエンコーディングを使って、印刷制御コマンドで構成された印刷データを、ＳＯＡＰメッセージを使用して未処理のバイトとしてＭＦＰ３に送信する（Ｓ１５１１）。ＭＦＰ３は、SendDocumentRequestに対してSendDocumentResponseをＰＣ６０に返す（図７のＳ７０６）。
【００９５】
ＰＣ６０がSendDocumentRequestを発行した時、あるいはSendDocumentResponseを受け取った時に、何らかのエラーが発生した場合、SendDocument()関数の戻り値にFALSEが代入されて、呼び出し元に戻る（Ｓ１５１１）。ポートモニタ３７は、戻り値pmRetにSendDocument()関数の戻り値を代入する（Ｓ２１１１）。ＰＣ６０がSendDocumentResponseを受け取り、全ての印刷データをＭＦＰ３に送信し終わると、SendDocument()関数の戻り値にTRUEが代入されて、呼び出し元であるポートモニタ３７に戻る（Ｓ１５１３）。ポートモニタ３７は、戻り値pmRetにSendDocument()関数の戻り値を代入する（Ｓ１５１３）。ポートモニタ３７は、PM_WritePort()関数の戻り値として、pmRetをランゲージモニタ３６にリターンして返し（Ｓ１５１４）、PM_WritePort()関数の処理を終了して、呼び出し元であるランゲージモニタ３６に戻る（Ｓ１５１５）。
【００９６】
図８〜図１０は、GetPrinterElementsの内容を示す図であり、図１１は、CreatePrintJobの内容を示す図である。GetPrinterElementsオペレーションは、通常、プリンタに関する情報を取得する為に用いられる。CreatePrintJobオペレーションは、印刷ジョブの開始要求である。以下、ＷＳＤのPrint Service Definition Version 1.0で定義されているGetPrinterElements、CreatePrintJobの内容については、説明を省略する。
【００９７】
［CreatePrintJobの内容］
図１１は、CreatePrintJobの内容を示す図であり、図１１（Ａ）は、CreatePrintJobRequest、図１１（Ｂ）は、CreatePrintJobResponseをそれぞれ表す。
【００９８】
図１１（Ａ）は、CreatePrintJobRequestを示す図である。同図に示すCreatePrintJobRequestは、ＰＣ６０からＭＦＰ３に発行されるものの一例である。同図において、記述１１０５は、ＷＳＤのPrint Serviceの名前空間を名前空間名wprtと定義している。名前空間名wprtの有効範囲内は、ＷＳＤのPrint Service Definition Version 1.0で定義されているパブリック情報を示す。以下、名前空間名wprtは同様に取り扱われ、名前空間名wprtの有効範囲内は、ＷＳＤのPrint Service Definition Version 1.0で定義されているパブリック情報を示す。記述１１０１は、＜wprt:JobDescription＞要素であり、また、パブリック情報であり、この中に印刷ジョブに関する情報が含まれている。記述１１０２は、＜wprt:JobName＞要素であり、また、パブリック情報である印刷ジョブ名がセットされる。この例では、「Photo2」という印刷ジョブ名がセットされている。記述１１０３は、＜wprt:JobOriginatingUserName＞要素であり、また、パブリック情報である、この印刷ジョブを発行したユーザ名がセットされる。この例では、「Natsu」というユーザ名がセットされている状態を示す。
【００９９】
図１１（Ｂ）は、CreatePrintJobResponseを示す図である。同図に示すCreatePrintJobResponseは、ＭＦＰ３からＰＣ６０に返されるものの一例である。同図において、記述１１０４は、＜wprt:JobId＞要素であり、また、パブリック情報であり、ＰＣ６０から発行されたCreatePrintJobRequestで要求された印刷ジョブに対して、ＭＦＰ３がこの印刷ジョブを受け付けた時に、この印刷ジョブを識別する為にＭＦＰ３が発行したジョブＩＤがセットされる。この例では、「1234」というジョブＩＤがセットされている状態を示す。
【０１００】
［GetPrinterElementsの内容］
図８は、GetPrinterElementsの内容を示す図であり、図８（Ａ）は、GetPrinterElementsRequestを、図８（Ｂ）は、GetPrinterElementsResponseをそれぞれ示す。
【０１０１】
図８（Ａ）は、GetPrinterElementsRequestを示す図である。同図に示すGetPrinterElementsRequestは、ＰＣ６０からＭＦＰ３に発行されるものの一例である。同図において、記述８０１は、＜wprt:Name＞要素であり、また、パブリック情報であり、その値としてwprt:PrinterDescriptionがセットされている。
【０１０２】
図８（Ｂ）は、GetPrinterElementsResponseを示す図である。同図に示すGetPrinterElementsResponseは、ＭＦＰ３からＰＣ６０に返されるものの一例である。ＭＦＰ３は、wprt:PrinterDescriptionがセットされた＜wprt:Name＞要素８０１を含むGetPrinterElementsRequestを受け取った時、GetPrinterElementsResponseでwprt:PrinterDescriptionをＰＣ６０に返す。同図において、記述８０６は、ＡＢＣ社のＷＳＤを利用したPrint Serviceの名前空間を名前空間名ansと定義している。名前空間名ansの有効範囲内は、ＡＢＣ社のＷＳＤを利用したPrint Serviceで定義されているプライベート情報である。以下、名前空間名ansは同様に取り扱われ、名前空間名ansの有効範囲内は、ＡＢＣ社のＷＳＤを利用したPrint Serviceで定義されているプライベート情報を示す。記述８０３は、＜wprt:ElementData＞要素であり、また、パブリック情報であり、Name属性としてパブリック情報のwprt:PrinterDescriptionがセットされている。これは、このGetPrinterElementsResponseが、＜wprt:Name＞要素８０１で指定されたwprt:PrinterDescriptionを含んでいることを示す。
【０１０３】
記述８０５は、＜wprt:PrinterDescription＞要素であり、また、パブリック情報であり、ＭＦＰ３に搭載されている機能等に関する情報が、この中に含まれている。記述８０４は、＜wprt:DeviceId＞要素であり、また、パブリック情報であり、IEEE 1284-2000ノDevice IDで定義されたデータ（文字列）がセットされている。これは、ＭＦＰ３のDevice IDを示す。この例では、「MFG:ABC;CMD:ABCCommand;MDL:Kmmn;CLS:PRINTER;DES:ABC Kmmn;VER:1.00;INFO:000;」というDevice IDがセットされている状態を示す。記述８０２は、＜ans:MultipleJobsControl＞要素であり、また、プライベート情報であり、ＭＦＰ３が複数印刷ジョブ制御機能を備えるプリンタであるか否かを示す。この複数印刷ジョブ制御機能とは、そのプリンタが複数の印刷ジョブを受け付けることができ、その内の１つの印刷ジョブを処理して印刷を実行することができる、という機能である。プリンタがこの機能を備える場合は「true」が、この機能を備えない場合は「false」が、この要素にセットされる。この例では、「true」がセットされている状態を示す。
【０１０４】
図９は、GetPrinterElementsの内容を示す図であり、図９（Ａ）は、GetPrinterElementsRequest、図９（Ｂ）は、GetPrinterElementsResponseをそれぞれ示す。
【０１０５】
図９（Ａ）は、GetPrinterElementsRequestを示す図である。同図に示すGetPrinterElementsRequestは、ＰＣ６０からＭＦＰ６０に発行されるものの一例である。同図において、記述９０３は、＜wprt:Name＞要素であり、また、パブリック情報であり、その値としてans:ABCCommandがセットされている。このans:ABCCommandは、プライベート情報である。記述９０４は、＜ans:ABCCommand＞要素であり、また、プライベート情報であり、この中に、＜ans:SplJobId＞要素９０５、＜ans:ReceivedId＞要素９０６、＜ans:Retry＞要素９０１、＜ans:OSVersion＞要素９０７、＜ans:DateTime＞要素９０８が含まれている。
【０１０６】
要素９０５、９０６、９０１、９０７、９０８は、全てプライベート情報であり、ランゲージモニタ３６がGetPrinterElementsRequest内のこれらの要素に、それぞれ適切な値をセットする。ランゲージモニタ３６は、図５のＳ５０３でスプーラ４０がLM_StartDocPort()関数をコールした時に渡される第３引数JobIdにセットされている値（ジョブＩＤ）を、＜ans:SplJobId＞要素９０５にセットする。スプーラ４０からランゲージモニタ３６に渡されたこのジョブＩＤは、ＰＣ６０内のＯＳから発行されたものであるので、＜ans:SplJobId＞要素９０５にセットされる値は、ＭＦＰ３から発行されて＜wprt:JobId＞要素１１０４にセットされるジョブＩＤとは全く異なるものである。この例では、「５」という値がセットされている状態を表す。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.
ランゲージモニタ３６とポートモニタ３７のインタフェースである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.
ポートモニタ３７は、図６のＳ６１１（図１５（Ａ）のＳ１５０２）において、ＷＳＤを制御するＷＳＤＡＰＩｓのCreatePrintJob()をコールするが、この関数の引数として参照できる図１１に示す＜wprt:JobName＞要素１１０２、＜wprt:JobOriginatingUserName＞要素１１０３、＜wprt:JobId＞要素１１０４にセットされている値は、PM_WritePort()関数の引数として渡されない為、ランゲージモニタ３６がこれらの要素１１０２、１１０３、１１０４にセットされている値を参照したり、ランゲージモニタ３６がこれらの値を変更したりすることはできない。同じ理由により、ランゲージモニタ３６が、ポートモニタ３７から発行されるCreatePrintJobオペレーションを使って、CreatePrintJobRequestにプライベート情報である要素９０５、９０６、９０１、９０７、９０８を追加することもできない。
【０１０７】
＜ans:ReceivedId＞要素９０６には、ＭＦＰ３が印刷ジョブ要求の予約を受け付けた時に発行する印刷予約ＩＤがセットされる。この例では、ＭＦＰ３から印刷予約ＩＤがまだ発行されていないので、「None」という値がセットされている状態を示す。ランゲージモニタ３６は、ＰＣ６０がＭＦＰ３に印刷ジョブ要求を発行する為のトリガとなる、印刷制御コマンドで構成された印刷データの先頭データをＭＦＰ３に初めて送信しようとする時の初期値として、「None」を＜ans:ReceivedId＞要素９０６にセットする。それ以外の場合は、ＭＦＰ３からＰＣ６０に最後に送られてきたGetPrinterElementsResponseの＜ans:ReceivedId＞要素９１２にセットされている値を、ランゲージモニタ３６がlmReceivedに保存しておき、ランゲージモニタ３６がこの値を＜ans:ReceivedId＞要素９０６にセットする。
【０１０８】
＜ans:Retry＞要素９０１には、ＰＣ６０がＭＦＰ３に発行する印刷ジョブ要求のリトライ回数がセットされる。この例では、ＰＣ６０がＭＦＰ３に印刷ジョブ要求を初めて送信するケースを示す「０」という値がセットされている状態を示す。ランゲージモニタ３６は、ＰＣ６０がＭＦＰ３に印刷ジョブ要求を発行する為のトリガとなる、印刷制御コマンドで構成された印刷データの先頭データの送信を試みる度に、このリトライ回数を１ずつ更新して、その値を＜ans:Retry＞要素９０１にセットする。＜ans:OSVersion＞要素９０７には、ＰＣ６０のＯＳのバージョンがセットされる。ランゲージモニタ３６は、ＯＳのＡＰＩであるGetVersionEx()関数をコールして、その引数で返されるＯＳのバージョン情報を、＜ans:OSVersion＞要素９０７にセットする。この例では、ＯＳがWindows7であることを表す「6.1」という値がセットされている状態を表す。
【０１０９】
ＭＦＰ３は、この＜ans:OSVersion＞要素９０７にセットされている値を確認し、ＰＣのＯＳに応じて（例えば、ＰＣのＯＳがWindows7の場合と、それ以外のＯＳの場合とで）、制御を切り換えることが可能である。例えば、Windows7から新しいWindowsＯＳに変更し、ＷＳＤのプロトコル等のタイミングや制御に変更が入った場合、ＭＦＰ３がそれに合わせてＷＳＤのプロトコル等のタイミングや制御を切り換えることにより、ＰＣにインストールされているＯＳ毎に最適化された安定した制御を行うことができ誤動作等を防止することができる。
【０１１０】
＜ans:DateTime＞要素９０８には、このGetPrinterElementsRequestを発行する時の日時がセットされる。ランゲージモニタ３６は、ＯＳのＡＰＩをコールして、日付と時刻を取得し、この日付と時刻を用いて＜ans:DateTime＞要素９０８に日時をセットする。この例では、「2009-01-01T00:08:00」という値がセットされている状態を示す。ネットワーク１１内に接続されているＰＣ、プリンタ、様々なデバイスの状況に応じて、複数のＰＣ（ＰＣ６０、ＰＣ６０及びその他のＰＣ（不図示））からＭＦＰ３に対して順に発行されたGetPrinterElementsRequestを、ＭＦＰ３が発行された順に受信するとは限らない。その為、ＭＦＰ３は＜ans:DateTime＞要素９０８をもとに、GetPrinterElementsRequestを処理する順序を決定し、その順序に従って、GetPrinterElementsRequestに対する応答として、その発行元のＰＣに対して図９（Ｂ）で後述するGetPrinterElementsResponseを返す。
【０１１１】
図９（Ｂ）は、GetPrinterElementsResponseを示す図である。同図に示すGetPrinterElementsResponseは、ＰＣ６０からＭＦＰ３に発行されるものの一例である。ＭＦＰ３は、ans:ABCCommandがセットされた＜wprt:Name＞要素９０３を含むGetPrinterElementsRequestを受け取った時、GetPrinterElementsResponseでans:ABCCommandをＰＣ６０に返す。同図において、記述９０９は、＜wprt:ElementData＞要素であり、また、パブリック情報であり、Name属性としてプライベート情報のans:ABCCommandがセットされている。これは、このGetPrinterElementsResponseが、＜wprt:Name＞要素９０３で指定されたans:ABCCommandを含んでいることを示す。記述９１０は、＜ans:ABCCommand＞要素であり、また、プライベート情報であり、この中に、＜ans:SplJobId＞要素９１１、＜ans:ReceivedId＞要素９１２、＜ans:Retry＞要素９０２、＜ans:OSVersion＞要素９１３、＜ans:DateTime＞要素９１４が含まれている。要素９１１、９１２、９０２、９１３、９１４は、全てプライベート情報である。ＭＦＰ３は、＜ans:SplJobId＞要素９０５にセットされている値をそのまま＜ans:SplJobId＞要素９１１にセットする。この例では、「５」という値がセットされている状態を示す。
【０１１２】
ＭＦＰ３は、図１３で後述するように＜ans:ReceivedId＞要素９１２に適切な値をセットする。この例では、「00000202」という値がセットされている状態を示す。ＭＦＰ３は、＜ans:Retry＞要素９０１にセットされている値を確認し、「０」がセットされている場合は、新規に発行された印刷ジョブに対するGetPrinterElementsRequestであると判断する。「０」以外の値がセットされている場合は、ＭＦＰ３が予約を受け付けた印刷ジョブの再開始要求に対するGetPrinterElementsRequestであると判断する。ＭＦＰ３は、＜ans:Retry＞要素９０１にセットされていた値をそのまま＜ans:Retry＞要素９０２にセットする。この例では、ランゲージモニタ３６が、ＰＣ６０がＭＦＰ３に印刷ジョブ要求を発行する為のトリガとなる、印刷制御コマンドで構成された印刷データの先頭データをＭＦＰ３に初めて送信しようとしたケースを表す「０」という値がセットされている状態を示す。
【０１１３】
＜ans:OSVersion＞要素９１３は、ＰＣ（ＰＣ６０）のＯＳのバージョン情報を示す。ＭＦＰ３は、＜ans:OSVersion＞要素９０７にセットされていた値をそのまま＜ans:OSVersion＞要素９１３にセットする。この例では、ＯＳがWindows7であることを表す「6.1」という値がセットされている状態を示す。＜ans:DateTime＞要素９１４には、このGetPrinterElementsResponseを発行する時の日時がセットされる。ＭＦＰ３は、内部に装備されているリアルタイムクロックから日付と時刻を取得し、この日付と時刻を用いて＜ans:DateTime＞要素９１４に日時をセットする。この例では、「2009-01-01T00:08:01」という値がセットされている状態を示す。
【０１１４】
ＰＣ６０は、＜ans:DateTime＞要素９０８と＜ans:DateTime＞要素９１４との時間差から、GetPrinterElementsRequestを発行してからGetPrinterElementsResponseを受信する迄の時間を取得することができる。ＰＣ６０は、これを利用してネットワーク１１の通信速度やトラフィックを計算して予想することができ、この時間をもとにＷＳＤのプロトコルの通信やタイミングの制御を最適化することができる。また、ＰＣ６０はＡＰＩを使ってＯＳ内部のタイマーをコールし、このタイマーから計算されたGetPrinterElementsRequestの発行からGetPrinterElementsResponseの返信を受け取る迄の時間と、＜ans:DateTime＞要素９０８と＜ans:DateTime＞要素９１４との時間差から計算された時間を比較することもできる。この比較結果をもとに、ＰＣ６０は、ＭＦＰ３のリアルタイムクロックの日付や時刻を補正したり、ＰＣ６０内の日付や時刻を補正したりすることができる。
【０１１５】
図９（Ａ）の説明の中で前述した通り、ポートモニタ３７は、図５のＳ５１５や図６のＳ６１１（図１５（Ａ）のＳ１５０２）において、ＷＳＤを制御するＷＳＤＡＰＩｓのCreatePrintJob()をコールするが、この関数の引数として参照できる図１１に示す＜wprt:JobName＞要素１１０２、＜wprt:JobOriginatingUserName＞要素１１０３、＜wprt:JobId＞要素１１０４にセットされている値は、PM_WritePort()関数の引数として渡されない為、ランゲージモニタ３６がこれらの要素１１０２、１１０３、１１０４にセットされている値を参照したり、ランゲージモニタ３６がこれらの値を変更したりすることはできない。同じ理由により、ランゲージモニタ３６が、ポートモニタ３７から発行されるCreatePrintJobオペレーションを使って、CreatePrintJobResponseからプライベート情報である要素９１１、９１２、９０２、９１３、９１４を参照することもできない。
【０１１６】
図１０は、GetPrinterElementsの内容を示す図であり、図１０（Ａ）は、GetPrinterElementsRequest、図１０（Ｂ）は、GetPrinterElementsResponseをそれぞれ示す。
【０１１７】
図１０（Ａ）は、GetPrinterElementsRequestを示す図である。同図に示すGetPrinterElementsRequestは、ＰＣ６０からＭＦＰ３に発行されるものの一例である。同図において、図９（Ａ）と同様な内容に関しては、その詳細説明を省略する。
【０１１８】
記述１００１は、＜wprt:Name＞要素であり、また、パブリック情報であり、その値としてans:ABCCommandがセットされている。このans:ABCCommandは、プライベート情報である。記述１００２は、＜ans:ABCCommand＞要素であり、また、プライベート情報であり、この中に、＜ans:SplJobId＞要素１００３、＜ans:ReceivedId＞要素１００４、＜ans:Retry＞要素１００５、＜ans:OSVersion＞要素１００６、＜ans:DateTime＞要素１００７が含まれている。要素１００３、１００４、１００５、１００６、１００７は、全てプライベート情報であり、ランゲージモニタ３６がGetPrinterElementsRequest内のこれらの要素に、それぞれ適切な値をセットする。ランゲージモニタ３６は、図５のＳ５０３でスプーラ４０がLM_StartDocPort()関数をコールした時に渡される第３引数ＪｏｂＩｄにセットされている値を、＜ans:SplJobId＞要素１００３にセットする。この例では、「５」という値がセットされている状態を示す。
【０１１９】
＜ans:ReceivedId＞要素１００４には、ＭＦＰ３が印刷ジョブ要求の予約を受け付けた時に発行する印刷予約ＩＤがセットされる。この例では、ＭＦＰ３がこの印刷ジョブ要求の予約を既に受け付けていて、受け付けた時に発行された「00000202」という値がセットされている状態を示す。＜ans:Retry＞要素１００５には、ＰＣ６０がＭＦＰ３に発行する印刷ジョブ要求のリトライ回数がセットされる。この例では、ＰＣ６０がＭＦＰ３に印刷ジョブ要求を１回目のリトライとして送信するケースを示す「１」という値がセットされている状態である。
【０１２０】
ランゲージモニタ３６は、ＰＣ６０がＭＦＰ３に印刷ジョブ要求を発行する為のトリガとなる、最初の印刷制御コマンドで構成された印刷データの送信を試みる度に、このリトライ回数を１ずつ更新して、その値を＜ans:Retry＞要素１００５にセットする。＜ans:OSVersion＞要素１００６には、ＰＣ６０のＯＳのバージョンがセットされる。この例では、ＯＳがWindows7であることを表す「6.1」という値がセットされている状態を示す。＜ans:DateTime＞要素１００７には、このGetPrinterElementsRequestを発行する時の日時がセットされる。この例では、「2009-01-01T00:08:04」という値がセットされている状態を示す。
【０１２１】
図１０（Ｂ）は、GetPrinterElementsResponseを表す図である。同図に示すGetPrinterElementsResponseは、ＰＣ６０からＭＦＰ３に発行されるものの一例である。ＭＦＰ３は、ans:ABCCommandがセットされた＜wprt:Name＞要素１００１を含むGetPrinterElementsRequestを受け取った時、GetPrinterElementsResponseでans:ABCCommandをＰＣ６０に返す。同図において、図９（Ｂ）と同様な内容に関しては、その詳細説明を省略する。
【０１２２】
記述１００８は、＜wprt:ElementData＞要素であり、また、パブリック情報であり、Name属性としてプライベート情報のans:ABCCommandがセットされている。これは、このGetPrinterElementsResponseが、＜wprt:Name＞要素１００１で指定されたans:ABCCommandを含んでいることを示す。記述１００９は、＜ans:ABCCommand＞要素であり、また、プライベート情報であり、この中に、＜ans:SplJobId＞要素１０１０、＜ans:ReceivedId＞要素１０１１、＜ans:Retry＞要素１０１２、＜ans:OSVersion＞要素１０１３、＜ans:DateTime＞要素１０１４が含まれている。要素１０１０、１０１１、１０１２、１０１３、１０１４は、全てプライベート情報である。ＭＦＰ３は、＜ans:SplJobId＞要素１００３にセットされている値をそのまま＜ans:SplJobId＞要素１０１０にセットする。この例では、「５」という値がセットされている状態を示す。ＭＦＰ３は、図１３で後述するように＜ans:ReceivedId＞要素１０１１に適切な値をセットする。この例では、「00000202」という値がセットされている状態を示す。ＭＦＰ３は、＜ans:Retry＞要素１００５にセットされていた値をそのまま＜ans:Retry＞要素１０１２にセットする。この例では、「１」という値がセットされている状態を示す。
【０１２３】
ＭＦＰ３は、＜ans:OSVersion＞要素１００６にセットされていた値をそのまま＜ans:OSVersion＞要素１０１３にセットする。この例では、「6.1」という値がセットされている状態を示す。ＭＦＰ３は、内部に装備されているリアルタイムクロックから日付と時刻を取得し、この日付と時刻を用いて＜ans:DateTime＞要素１０１４に日時をセットする。この例では、「2009-01-01T00:08:05」という値がセットされている状態を示す。
【０１２４】
［ＭＦＰ３の印刷キューデータベース］
図２６は、ＭＦＰ３が受け付けた印刷ジョブ要求を管理する印刷キューデータベースを示す図である。図２６（Ａ）は、ＭＦＰ３内に装備された印刷キューデータベースであり。本実施形態では、受け付けることができる印刷ジョブの数はＭＦＰが実行している印刷ジョブも含めて合計４つ管理することができ、さらに４つの印刷ジョブ要求を予約することができる。ここで、印刷ジョブ要求とは、印刷ジョブの印刷要求を指し、印刷画像を含まないものである。この印刷キューデータベースは、ローカルネットワーク（例えば、ＷＳＤプロトコル）を利用した印刷ジョブ（及び印刷ジョブ要求）と、ワイドエリアネットワークを利用したクラウド印刷ジョブ（及び印刷ジョブ要求）とを混在して管理する。すなわち、図２６（Ａ）に示すＭＦＰ３内の印刷キューデータベースは、異なるプロトコル、具体的には、ローカルエリアネットワークを介して印刷指示された印刷ジョブ要求と、ワイエリアネットワークを介して印刷指示された印刷ジョブ要求を一元管理するものである。図２６（Ｂ）は、クラウド印刷を提供するアプリケーションサーバー側が持つ印刷キューデータベースである。本実施形態では、サーバーとして機能するＰＣ２が図２６（Ｂ）に示す印刷キューデータベースを備える。この印刷キューデータベースは、ＷＳＤプロトコルを利用した印刷ジョブと、クラウド印刷ジョブとが混在したネットワーク印刷をローカルネットワーク上で接続された端末から制御する為の印刷キューデータベースである。すなわち、図２６（Ｂ）に示すアプリケーションサーバー内の印刷キューデータベースは、具体的には、ローカルエリアネットワークを介して印刷指示された印刷ジョブ要求と、ワイエリアネットワークを介して印刷指示された印刷ジョブ要求を一元管理するものである。図２６（Ｂ）は、印刷装置（本実施形態では、ＭＦＰ３）内の印刷キューデータベースに登録可能な印刷ジョブ数が上限数を超えた際に、印刷ジョブ要求を登録するために使用する。
【０１２５】
図２６（Ａ）、（Ｂ）において、「Null」はデータが存在しない空領域であることを示し、「−」はデータが不定（利用不可）であることを示す。
【０１２６】
図２６（Ａ）において、「Ｎｏ．」欄は、実行中の印刷ジョブ、または、予約されている印刷ジョブ要求の順番を示す。すなわち、図２６（Ａ）において、Ｎｏ．は、印刷を実行する予定の印刷ジョブの優先順位を表す。Ｎｏ．１は、現在印刷を実行中の印刷ジョブであり、Ｎｏ．２は、次に印刷を実行する予定の最優先の印刷ジョブを示す。Ｎｏ．３、５〜８は、印刷ジョブ要求の予約を示す。Ｎｏ．５〜８において、Ｎｏ．５はＮｏ．４の次に優先順位の高い印刷ジョブ要求の予約を示し、Ｎｏ．８は最後に印刷を実行する予定の、最も優先順位の低い印刷ジョブ要求の予約を示す。
【０１２７】
図２６（Ｂ）において、「Ｎｏ．」欄は、予約されている印刷ジョブ要求の順番を表す。すなわち、図２６（Ｂ）においてＮｏ．は、図２６（Ａ）の印刷キューデータベースに印刷ジョブが新たに登録できるようになった際に、図２６（Ａ）の印刷キューデータベースに登録する印刷ジョブ要求の優先順位を表す。図２６（Ａ）、（Ｂ）において、「Protocol」欄は、ＰＣとＭＦＰ３との間のネットワーク通信に使用される通信プロトコルを示す。本実施形態では、ＷＳＤあるいはＨＴＴＰの何れかがセットされる。
【０１２８】
図２６（Ａ）、（Ｂ）において、「Computer Name」欄は、印刷ジョブ要求を発行したコンピュータ名を示す。「wprt:JobName」欄は、＜wprt:JobName＞要素（例えば、記述１１０２）にセットされている印刷ジョブ名を示す。「wprt:JobOriginatingUserName」欄は、＜wprt:JobOriginatingUserName＞要素（例えば、記述１１０３）にセットされているユーザ名を示す。「wprt:JobId」欄は、＜wprt:JobId＞要素（例えば、記述１１０４）にセットされている、ＭＦＰ３から発行されたジョブＩＤを示す。すなわち、ジョブＩＤは、ＭＦＰ３においてジョブの受付が完了した際にＭＦＰ３から発行されるＩＤである。例えば、図２６（Ａ）のＮｏ．１の行の「wprt:JobId」欄には、「６０」というジョブＩＤがセットされている。これは、ＭＦＰ３がこの印刷ジョブの印刷を実行しており、ジョブＩＤを発行済みの状態であることを示している。Ｎｏ．２、４は、ジョブＩＤがＭＦＰ３から発行済みの状態であるが印刷実行前の印刷ジョブ、すなわち、受付が完了し且つ印刷待機中の印刷ジョブである。
【０１２９】
図２６（Ａ）のＮｏ．５の行、（Ｂ）のＮｏ．１、２の「wprt:JobId」欄には、「Null」がセットされている。これは、ＭＦＰ３がこの印刷ジョブ要求の予約を受け付けただけで、印刷が実行されておらず、ジョブＩＤを発行していない状態であることを示している。尚、図２６（Ａ）、のＮｏ．３、６、７、８行、（Ｂ）のＮｏ．３の「wprt:JobId」欄には「−」がセットされているが、これは、クラウド印刷のジョブにおいては、＜wprt:JobId＞要素が存在しないので、不定（利用不可）であることを示している。
【０１３０】
図２６（Ａ）、（Ｂ）の「ans:SplJobId」欄は、＜ans:SplJobId＞要素（例えば、記述９０５、１００３）にセットされている、スプーラ４０から発行されたジョブＩＤを示す。例えば、１台のＰＣからあるユーザが同じドキュメントを何度も繰り返して連続印刷するようなケースがある。スプーラ４０がこれらの印刷ジョブを複数のスレッド等により並列処理できる場合、これら複数の印刷ジョブ要求、すなわち複数のCreatePrintJobRequest内の＜wprt:JobName＞要素（例えば、記述１１０２）にセットされている印刷ジョブ名と＜wprt:JobOriginatingUserName＞要素（例えば、記述１１０３）にセットされているユーザ名とが各印刷ジョブ要求間で同一の印刷ジョブ名とユーザ名になってしまう為、これらの印刷ジョブ要求を区別することができない、という問題がある。このような問題に対して、スプーラ４０から発行されたジョブＩＤを印刷キューデータベース内に保持する情報に含めることで、これらの印刷ジョブを識別することができ、上記問題を解決することができる。図２６（Ａ）、（Ｂ）の、「ans:ReceivedId」欄は、＜ans:ReceivedId＞要素（例えば、記述９１２、１０１１）にセットされている印刷予約ＩＤを表す。図２６（Ａ）、（Ｂ）の「Time」欄は、ＰＣから発行された印刷ジョブ要求または印刷ジョブ要求の予約確認要求を、ＭＦＰ３が受け付けた時刻を表すタイムカウント値を表す。
【０１３１】
本実施形態においては、例えば、ネットワーク１１上のＰＣ６０とＰＣ６１のそれぞれのＰＣから発行されたＷＳＤのプロトコルを利用した印刷ジョブと、ネットワーク４のＰＣ１から発行されたクラウド印刷の印刷ジョブとが混在することになる。このような、異なる経路で発行された印刷ジョブ、言い換えれば、複数のプロトコルの印刷ジョブが混在している環境においても、図２６（Ａ）、（Ｂ）のような印刷キューデータベースを利用することで、印刷装置（ここでは、ＭＦＰ３）において、各ＰＣから発行された印刷ジョブの発行順序に従って正しく印刷させることができる。
【０１３２】
［ＭＦＰ３におけるCreatePrintJobの処理］
図１２は、ＭＦＰ３におけるCreatePrintJobの処理の手順を示すフローチャートである。図１２の処理を実行するためのプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出されてＣＰＵ１５により実行される。ＭＦＰ３は、その起動時に、ＲＡＭ１７等に確保されたnew_jobフラグを「０」で初期化している。例えばＰＣ６０からＭＦＰ３にCreatePrintJobRequest（例えば、図１１（Ａ））が発行されて、ＭＦＰ３がそれを受け付けると、Ｓ１２０１が開始される。ＭＦＰ３は、CreatePrintJobRequestを受信すると（Ｓ１２０２）、ＭＦＰ３に内蔵されているタイマーから時刻や経過時間を計測可能なカウント値を取得し、Time1として記憶する（Ｓ１２０３）。そのカウント値の単位は、例えば、「秒」である。
【０１３３】
ＭＦＰ３は、受信したCreatePrintJobRequestから、＜wprt:JobName＞要素１１０２にセットされている印刷ジョブ名と、＜wprt:JobOriginatingUserName＞要素１１０３にセットされているユーザ名とを取得する（Ｓ１２０４）。また、ＭＦＰ３は、CreatePrintJobRequestを発行したコンピュータのコンピュータ名（Computer Name）を取得する（Ｓ１２０５）。ここでは、ＰＣ６０のコンピュータ名が取得される。本実施形態では、ＷＳＤのPrint Service宛てのHTTP POSTでのＴＣＰ受信ソケットからＩＰアドレスを取得し、そのＩＰアドレスに基づいてコンピュータ名を取得する。本実施形態では説明を簡易にする為に、ＩＰアドレスからコンピュータ名を取得し、そのコンピュータ名を用いてＰＣを特定して各処理を行うが、ＩＰアドレスからＰＣを直接に特定して各処理を行うようにしても良い。ＭＦＰ３は、取得した印刷ジョブ名とユーザ名とコンピュータ名とを一時的に保存する（Ｓ１２０６）。
【０１３４】
ＭＦＰ３は、印刷ジョブ名、ユーザ名、コンピュータ名に基づいて、図２６（Ａ）に示す印刷キューデータベース内に既にＳ１２０２で受信したCreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求の予約が既に存在する可能性があるか否かを判定する（Ｓ１２０７）。例えば、印刷ジョブ名等上記の３つのうちのいずれかの要素に基づいて、印刷キューデータベース内を検索し、同じ、例えば印刷ジョブ名が検索された場合には、可能性があると判定するようにしても良い。その場合、印刷ジョブ名が検索されなかった場合には、可能性がないと判定される。
【０１３５】
図２６（Ａ）に示す印刷キューデータベース内に、印刷ジョブ要求の予約が既に存在する可能性があると判定された場合、Ｓ１２１３へ進み、存在する可能性がないと判定された場合、Ｓ１２０９へ進む（Ｓ１２０８）。Ｓ１２０９において、図２６（Ａ）に示す印刷キューデータベース内に、Ｓ１２０２で受信したCreatePrintJobRequestで開始要求された印刷ジョブより優先順位の高い他の印刷ジョブ要求の予約があるか否かを判定する。ここで、あると判定された場合、Ｓ１２２０へ進み、ないと判定された場合、Ｓ１２１０へ進む。
【０１３６】
Ｓ１２１０において、ＭＦＰ３は、ＭＦＰ３内の印刷キューデータベースに、空領域があり、Ｓ１２０２で受信したCreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求を登録可能か否かを判定する。ここで、登録可能と判定された場合、Ｓ１２１１に進み、登録可能でないと判定された場合、Ｓ１２２１へ進む。Ｓ１２１１において、ＭＦＰ３は、図２６（Ａ）に示すＭＦＰ３内の印刷キューデータベースに、Ｓ１２０２で受信したCreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求を登録する。ＭＦＰ３は、Ｓ１２０２で受信した印刷ジョブ要求CreatePrintJobRequestの印刷ジョブを受け付けて実行することを示す応答として、CreatePrintJobResponse（例えば、図１１（ｂ））をＰＣ６０に返信し（Ｓ１２１２）、CreatePrintJobの処理を終了する（Ｓ１２２３）。
【０１３７】
Ｓ１２２１において、ＭＦＰ３は、印刷ジョブ要求をプロキシＡＰＰ１４３に送信する。ここで、図１６（Ｂ）において後述するように、プロキシＡＰＰ１４３の印刷キューデータベースに、CreatePrintJobRequestで開始要求された印刷ジョブの印刷ジョブ要求を登録する。Ｓ１２２１の処理後、Ｓ１２２２へ進む。
【０１３８】
Ｓ１２０８で、図２６（Ａ）に示す印刷キューデータベース内に、印刷ジョブ要求の予約が既に存在する可能性があると判定された場合、Ｓ１２１３へ進む。Ｓ１２１３において、ＭＦＰ３は、new_jobフラグの値を参照し、「１」がセットされているか否かを判定する。ここで、「１」がセットされていると判定された場合、Ｓ１２２２へ進み、「１」がセットされていない（「０」がセットされている等）と判定された場合、Ｓ１２１４へ進む。
【０１３９】
Ｓ１２１４において、ＭＦＰ３は、Ｓ１２０３で保存されたカウント値Time1から図１３のＳ１３０３で保存されたカウント値Time2を減算する。つまり、ＭＦＰ３が図１３のＳ１３０２でGetPrinterElementsRequestを受信してからＳ１２０２でCreatePrintJobRequestを受信するまでの経過時間を求める。Ｓ１２１４において、ＭＦＰ３は、その経過時間が５秒を超えているか否かを判定する。経過時間が５秒を超えていると判定された場合、Ｓ１２２２へ進み、５秒を超えていないと判定された場合、Ｓ１２１５へ進む。
【０１４０】
Ｓ１２１５において、ＭＦＰ３は、Ｓ１２０６で記憶した印刷ジョブ名とユーザ名とコンピュータ名に基づいて、図２６（Ａ）に示す印刷キューデータベース内で、それらの情報と同じ情報を持つ印刷ジョブ要求の予約を検索する。印刷キューデータベース内から「ans:ReceivedId」欄にセットされている印刷予約ＩＤと、「ans:SplJobId」欄にセットされているスプーラ４０から発行されたジョブＩＤを取得して、一時的に保存する。
【０１４１】
ＭＦＰ３は、図１３のＳ１３０９で保存されている＜ans:ABCCommand＞要素（例えば、記述９０４、１００２）に含まれている情報から、＜ans:ReceivedId＞要素にセットされている印刷予約ＩＤ（例えば、記述１００４）と、＜ans:SplJobId＞要素にセットされているスプーラ４０から発行されたジョブＩＤ（例えば、記述１００３）とを取得する（Ｓ１２１６）。ＭＦＰ３は、Ｓ１２１６で取得した印刷予約ＩＤとスプーラ４０から発行されたジョブＩＤとを、Ｓ１２１５で一時的に保存した印刷予約ＩＤ及びスプーラ４０から発行されたジョブＩＤとそれぞれ比較する。さらに、ＭＦＰ３は、Ｓ１２１５で一時的に保存した印刷予約ＩＤに基づいて、印刷キューデータベースから取得した印刷ジョブ名とユーザ名とコンピュータ名を、Ｓ１２０６で一時的に保存した印刷ジョブ名、ユーザ名及びコンピュータ名とそれぞれ比較する（Ｓ１２１７）。
【０１４２】
ＭＦＰ３は、比較対象の全ての情報を比較した結果、全ての比較対象情報がそれぞれ一致したか否かを判定する（Ｓ１２１８）。ここで、一致したと判定された場合、Ｓ１２１９へ進み、少なくとも１つ以上の情報が一致しないと判定された場合、Ｓ１２２０へ進む。
【０１４３】
Ｓ１２１９において、ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベースを確認し、Ｓ１２０２で受信したCreatePrintJobRequestで開始要求された印刷ジョブより優先順位の高い他の印刷ジョブ要求の予約がこの印刷キューデータベース内にあるか否かを判定する（Ｓ１２１９）。ここで、あると判定された場合、Ｓ１２２２へ進み、ないと判定された場合、Ｓ１２１０へ進む。
【０１４４】
Ｓ１２２０において、ＭＦＰ３は、new_jobフラグに「１」をセットする。Ｓ１２２２において、ＭＦＰ３は、Ｓ１２０２で受信した印刷ジョブ要求CreatePrintJobRequestに対して、この印刷ジョブを受け付けることができなかったことを示すFault(ServerErrorNotAcceptingJobs)をＰＣ６０に返信し、Ｓ１２２３において、CreatePrintJobの処理を終了する。
【０１４５】
［ＭＦＰ３におけるGetPrinterElementsの処理］
図１３は、ＭＦＰ３におけるGetPrinterElementsの処理の手順を示すフローチャートである。図１３のフローに係るプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出され、ＣＰＵ１５により実行される。ＰＣ６０からＭＦＰ３にGetPrinterElementsRequest（例えば図８（Ａ）、図９（Ａ）、図１０（Ａ））が発行されて、ＭＦＰ３がこれを受け付けると、同図のＳ１３０１が開始される。ＭＦＰ３は、GetPrinterElementsRequestを受信した後（Ｓ１３０２）、GetPrinterElementsRequestから＜wprt:Name＞要素（例えば８０１、９０３、１００１）にセットされている値を確認する（Ｓ１３０４）。Ｓ１３０４において、GetPrinterElementsRequestの中に複数の＜wprt:Name＞要素が存在する場合があるので、ＭＦＰ３は取得した全ての＜wprt:Name＞要素にセットされている値を一時的に保存しておく。＜wprt:Name＞要素にセットされている値として、wprt:PrinterDescriptionが見つかった場合、Ｓ１３０６へ進み、見つからなかった場合、Ｓ１３０８へ進む（Ｓ１３０５）。
【０１４６】
Ｓ１３０６において、ＭＦＰ３は＜ans:MultipleJobsControl＞要素８０２に「true」をセットし、Ｓ１３０８へ進む。Ｓ１３０８において、ＭＦＰ３は、Ｓ１３０４で一時的に保存された＜wprt:Name＞要素にセットされている全ての値を確認し、ans:ABCCommandが見つかった場合、Ｓ１３０３へ進み、見つからなかった場合、Ｓ１３１９へ進む。Ｓ１３０３において、ＭＦＰ３は内蔵されているタイマーから時刻や経過時間を計算可能なカウント値を取得してTime2に保存する。このカウント値の単位は「秒」である。
【０１４７】
Ｓ１３０９において、ＭＦＰ３は、GetPrinterElementsRequest内の＜ans:ABCCommand＞要素（例えば９０４、１００２）に含まれている全ての情報を取得して保存する。ＭＦＰ３はnew_jobフラグの値を確認し、「１」がセットされている場合、Ｓ１３０７へ進み、それ以外（「０」がセットされている）の場合、Ｓ１３１１へ進む（Ｓ１３２０）。Ｓ１３０７において、Time2から図１２のＳ１２０３で保存されたTime1を減算して、図１２のＳ１２０２でＭＦＰ３がCreatePrintJobRequestを受信してからＳ１３０２でＭＦＰ３がGetPrinterElementsRequestを受信するまでの経過時間を計測する。この経過時間が５秒を超えている場合、Ｓ１３２１へ進み、５秒以内の場合、Ｓ１３１０へ進む。
【０１４８】
Ｓ１３１０において、ＭＦＰ３は、＜ans:Retry＞要素（例えば、９０１、１００５）にセットされている値を確認し、この値が「０」の場合、Ｓ１３１７へ進み、「０」以外（実際には０より大きい整数）の場合、Ｓ１３１１へ進む。Ｓ１３１７において、ＭＦＰ３は、図１６（Ａ）に示す印刷予約ＩＤの発行処理を実行する。ＭＦＰ３は、図１６（Ａ）で＜ans:ReceivedId＞要素（例えば、９１２、１０１１）にセットされた値を確認し、「None」の場合、Ｓ１３２１へ進み、「None」ではない場合、Ｓ１３１８へ進む（Ｓ１３２３）。Ｓ１３１８において、ＭＦＰ３は、図１６（Ａ）のＳ１７０４で新規に発行した印刷予約ＩＤ（ans:ReceivedId）をもとに、図２６（Ａ）に示す印刷キューデータベースに新規の印刷ジョブ要求の予約として各情報を登録して、印刷キューデータベースを更新する。この時、ＭＦＰ３は、「Time」欄にセットされているタイムカウント値をTime2に保存されている値で更新する。
【０１４９】
Ｓ１３２１において、ＭＦＰ３はｎｅｗ＿ｊｏｂフラグを「０」で初期化する。ＭＦＰ３は、Ｓ１３０６でセットされた情報、図１６（Ａ）のＳ１７０５でセットされた情報、図２６（Ａ）に示す印刷キューデータベース内にセットされている情報等を用いて、GetPrinterElementsResponseに各情報をセットして、Ｓ１３０２で受信したGetPrinterElementsRequestに対する応答として、GetPrinterElementsResponseをＰＣ（ＰＣ６０）に返す（Ｓ１３１９）。そして、GetPrinterElementsの処理を終了する（Ｓ１３２２）。
【０１５０】
一方、Ｓ１３１１において、ＭＦＰ３は、＜ans:ReceivedId＞要素にセットされている印刷予約ＩＤ（例えば、１００４）を取得する。ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベース内の「ans:ReceivedId」に、この印刷予約ＩＤが存在するか否かを判定する（Ｓ１３１２）。ＭＦＰ３が、この印刷ジョブ要求の予約を表す印刷予約ＩＤを図２６（Ａ）に示す印刷キューデータベース内で発見した場合、Ｓ１３１４へ進み、発見しなかった場合、Ｓ１３１７へ進む（Ｓ１３１３）。
【０１５１】
Ｓ１３１４において、ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベースから、その印刷予約ＩＤで予約されている印刷ジョブ予約の「Time」欄にセットされているタイムカウント値を取得し、Ｓ１３０３で保存されたTime2からこのタイムカウント値を減算して、最後にこの印刷ジョブ予約が更新された時からの経過時間を計測する。ＭＦＰ３は、この経過時間が既定時間（ここでは２０秒に設定）を超える場合、Ｓ１３１６へ進み、既定時間以内の場合、Ｓ１３２３へ進む（Ｓ１３１５）。Ｓ１３１６において、ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベース内において、この印刷ジョブ要求の印刷予約ＩＤ（ans:ReceivedId）を一旦削除し、この印刷ジョブ要求をその印刷キューデータベース内の最後尾に移動して、最も優先順位の低い印刷ジョブ要求の予約となるように変更し、Ｓ１３１７へ進む。
【０１５２】
図１２のＳ１２１２、図１３のＳ１３０７において、一定時間の経過を判断する値として５秒の固定のタイムアウト値を設定したが、これらの例に限られることはない。例えば、ＭＦＰ３の使用環境やユーザが使用するネットワークの環境に応じて、例えば、３秒、８秒、１０秒というような固定のタイムアウト値を設定しても良い。また、ＭＦＰ３の表示部２１のタッチパネルや操作部２０のボタン操作により、使用環境に応じた任意の適切な値を設定したりするように構成してもよい。また、ＭＦＰ３がネットワーク１１上のＰＣをモニタし、その数に応じてネットワークの混雑状況を把握し、その混雑状況から最適なタイムアウト値を設定するように構成してもよい。さらに、図１２のＳ１２１２におけるタイムアウト値と、図１３のＳ１３０７におけるタイムアウト値を、同一の値ではなく、それぞれ異なる値としてもよい。この場合、例えば、図１２のＳ１２１２におけるタイムアウト値を５秒とし、図１３のＳ１３０７におけるタイムアウト値を３秒とする、というようにしても良い。
【０１５３】
図１６は、ＭＦＰ３における印刷予約ＩＤの発行の処理の手順を示すフローチャートとプロキシＡＰＰ１４３に印刷ジョブ要求を登録する処理の手順を示すフローチャートである。図１６（Ａ）のフローに係るプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出され、ＣＰＵ１５により実行される。ＭＦＰ３が図１３のＳ１３１７の印刷予約ＩＤの発行処理を実行すると、図１６のＳ１６０１が開始される。ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベースの空領域の状況を確認し（Ｓ１６０２）、空領域が有る場合、Ｓ１６０４へ進み、空領域が無い場合、Ｓ１６０５へ進む（Ｓ１６０３）。
【０１５４】
Ｓ１６０４において、ＭＦＰ３は印刷予約ＩＤ（ans:ReceivedId）を新規に発行し、＜ans:ReceivedId＞要素（例えば９１２、１０１１）にこの印刷予約ＩＤをセットし、印刷予約ＩＤの発行処理を終了して（Ｓ１６０６）、図１３のＳ１３２３へ進む。Ｓ１７０４で発行される印刷予約ＩＤは、ＭＦＰ３内で管理されるものであり、ＭＦＰ３内で一意に決定される値である。一方、Ｓ１６０５において、ＭＦＰ３は＜ans:ReceivedId＞要素（例えば９１２、１０１１）に「None」をセットし、印刷予約ＩＤの発行処理を終了して（Ｓ１６０６）、図１３のＳ１３２３へ進む。
【０１５５】
図１６（Ｂ）は、プロキシＡＰＰ１４３がＭＦＰ３から受信した印刷ジョブ要求を登録する処理の手順を示すフローチャートである。図１２のＳ１２２２においてサーバーの印刷キューデータベースに登録処理が開始されると、図１６のＳ１６１０が開始される。Ｓ１６１１において、プロキシＡＰＰ１４３の印刷キューデータベースを確認する。Ｓ１６１２において、登録済みの印刷ジョブ要求であれば、終了し（Ｓ１６１４）、登録済みでない印刷ジョブ要求であると判定された場合、Ｓ１６１３に進む。Ｓ１６１３において、プロキシＡＰＰ１４３がＭＦＰ３から受信した印刷ジョブ要求を図２６（Ｂ）に示すプロキシＡＰＰ１４３の印刷キューデータベースに登録し、終了する（Ｓ１６１４）。
【０１５６】
図１７は、ＰＣ７の文書作成ＡＰＰ１４５の画面をＷｅｂブラウザで表示した一例を示す図である。図１７は、ある文書を開いている状態を示す。文書作成ＡＰＰ１４５は、この画面の情報をモバイル端末１４、ＰＣ１、ＭＦＰ３、ＭＦＰ１０３に送信し、モバイル端末１４、ＰＣ１、ＭＦＰ３、ＭＦＰ１０３がその情報を受信してＷｅｂブラウザ９、２５、２７、２８でその画面を表示する。このように、文書作成ＡＰＰ１４５の画面は、Ｗｅｂブラウザ９、２５、２７、２８を利用して、そのＷｅｂブラウザ上に表示される。ファイルメニュー４０２は、コンテンツ（文書）選択画面（不図示）を表示して予め保存されている文書やコンテンツを開いたり、新規文書を作成したりするためのサブメニューを備えていて、ユーザが文書やコンテンツを選択したり、新規文書を作成することができる。尚、コンテンツ（文書）選択画面は、ＰＣ等で一般的なファイル選択画面と同様な画面で構成されるものであり、ここではその説明を省略する。印刷メニュー４０１は、印刷に関する各種の操作を受け付ける。例えば、ユーザがＫＢＤ２０３または操作部２０等の入力部を操作し、開いている文書を印刷するときに印刷メニュー４０１を押下すると、図１８に示す印刷画面１４２が表示される。
【０１５７】
図１８は、印刷画面１４２の一例を示す図である。印刷画面１４２は、ユーザに対するＭＦＰ３、１０３用の印刷設定画面として、文書作成ＡＰＰ１４５により制御され、文書作成ＡＰＰ１４５は、印刷画面１４２の画面の情報をモバイル端末１４、ＰＣ１、ＭＦＰ３、ＭＦＰ１０３に送信し、モバイル端末１４、ＰＣ１、ＭＦＰ３、ＭＦＰ１０３がその情報を受信してＷｅｂブラウザ９、２５、２７、２８でその画面を表示する。このように、印刷画面１４２は、Ｗｅｂブラウザ９、２５、２７、２８を利用して、そのＷｅｂブラウザ上に表示される。デバイス選択肢５３５、５３６、５３７の各々は、選択可能なデバイスの選択肢である。デバイス選択肢５３５、５３６、５３７は、それぞれ、ＧＨＩ社製のＡＣＢＸＤＦというモデル名のＭＦＰ、ＡＢＣ社製のＫｍｍｎというモデル名のＭＦＰ（ＭＦＰ３）、ＤＥＦ社製のＸｙｚというモデル名のＭＦＰに該当する選択肢を表す。図１８では、ＭＦＰ３を表すデバイス選択肢５３６が選択されている状態が示されている。
【０１５８】
ＭＦＰ３（１０３）内のＷｅｂブラウザ２７（２８）上に印刷画面１４２が表示される場合、文書作成ＡＰＰ１４５はデバイス選択肢５３６だけを表示する情報をＭＦＰ３（１０３）に送信して、ユーザがそれ以外のデバイスを選択できないようにする。モバイル端末１４内のＷｅｂブラウザ９またはＰＣ１内のＷｅｂブラウザ２５上に印刷画面１４２が表示される場合、文書作成ＡＰＰ１４５はデバイス選択肢５３５、５３６、５３７を表示する情報をモバイル端末１４またはＰＣ１に送信して、モバイル端末１４またはＰＣ１がその情報を受信してＷｅｂブラウザ９または２５で表示する。これにより、ユーザが、モバイル端末１４またはＰＣ１のＷｅｂブラウザ９または２５を操作する場合、文書作成ＡＰＰ１４５は、そのユーザが全てのデバイスを選択できるように制御する。
【０１５９】
用紙サイズ選択部５３０では、Ａ５、Ａ４、Ｂ５、Ｌｅｔｔｅｒの各選択肢の中からＭＦＰ３で印刷する用紙のサイズがユーザ操作に応じて選択される。図１８では、「Ｌｅｔｔｅｒ」が選択されている状態が示されている。種類選択部５３１では、Ｐｌａｉｎ  Ｐａｐｅｒ、Ｐｈｏｔｏ  Ｐａｐｅｒ、Ｐｏｓｔｃａｒｄの各選択肢の中からＭＦＰ３で印刷する用紙の種類がユーザ操作に応じて選択される。図１８では、「Ｐｌａｉｎ  Ｐａｐｅｒ」が選択されている状態が示されている。印刷品位選択部５３２では、Ｈｉｇｈ、Ｓｔａｎｄａｒｄ、Ｆａｓｔの各選択肢の中からＭＦＰ３で印刷する印刷品位がユーザ操作に応じて選択される。図１８では、「Ｓｔａｎｄａｒｄ」が選択されている状態が示されている。色／濃度選択部５３３では、Ａｕｔｏ、Ｍａｎｕａｌの各選択肢の中からＭＦＰ３で印刷する色や濃度がユーザ操作に応じて選択される。図１８では、「Ａｕｔｏ」が選択されている状態が示されている。
【０１６０】
印刷ボタン５３４は、印刷の開始の指示を受け付ける。ユーザ操作により印刷ボタン５３４が押下されると、文書作成ＡＰＰ１４５は、デバイス選択肢５３６に関連付けられているＭＦＰ３用の印刷ジョブを生成し、クラウド印刷ＡＰＰ１４６にその印刷ジョブを発行する。クローズボタン５３８は、印刷画面１４２を閉じる指示を受け付ける。ユーザ操作によりクローズボタン５３８が押下されると、文書作成ＡＰＰ１４５は、印刷画面１４２を閉じる。
【０１６１】
［クラウド印刷処理］
図１９〜図２４は、クラウド印刷処理の手順を示すフローチャートである。これらのフローチャートに係るプログラムは、ＰＣまたはＭＦＰ内に記憶されている。ＰＣ上で動作するアプリケーションのプログラムは、ＨＤＤ２０２に記憶されており、ＣＰＵ２０４によりＲＡＭ２０１に読み出されて実行される。ＭＦＰ上で動作するアプリケーションのプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出されてＣＰＵ１５により実行される。
【０１６２】
図１９において、縦の列が処理の実行元を表し、左側から、ＰＣ１（Ｗｅｂブラウザ２５）、クラウド印刷ＡＰＰ１４６、プロキシＡＰＰ１４３、文書作成ＡＰＰ１４５または読取ＡＰＰ１４７、ＭＦＰ３（Ｗｅｂブラウザ２７）に対応している。図２１、図２３において、縦の列が処理の実行元を表し、左側から、文書作成ＡＰＰ１４５、プロキシＡＰＰ１４３、画像変換ＡＰＰ１４４に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図２４において、縦の列が処理の実行元を表し、左側から、ＭＦＰ３、プロキシＡＰＰ１４３に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。
【０１６３】
以下、ユーザがＰＣ１またはＭＦＰ３を使って、ドキュメントの印刷をＭＦＰ３で行うケース（ドキュメント印刷に係る一連の処理）での通信制御方法について説明する。
【０１６４】
図１９は、ＰＣ１内のＷｅｂブラウザ２５から文書作成ＡＰＰ１４５を実行して印刷を行う際の処理の手順を示すフローチャートである。同図において、ユーザが、ＰＣ１内のＷｅｂブラウザ２５を起動して文書作成ＡＰＰ１４５を実行すると（Ｓ１９０１）、Ｗｅｂブラウザ２５は、文書作成ＡＰＰ１４５にホーム画面を要求する（Ｓ１９０２）。文書作成ＡＰＰ１４５は、ＰＣ１にホーム画面の情報を送信し（Ｓ１９０３）、ＰＣ１は、Ｗｅｂブラウザ２５でその画面を表示する（Ｓ１９０２）。
【０１６５】
ユーザが、Ｗｅｂブラウザ２５を操作して、ファイルメニュー４０２内のサブメニューを利用して印刷対象のコンテンツ（文書）の選択を開始したのを検知すると、Ｗｅｂブラウザ２５は、文書作成ＡＰＰ１４５にコンテンツ（文書）選択画面を要求する（Ｓ１９０４）。文書作成ＡＰＰ１４５は、ＰＣ１にコンテンツ（文書）選択画面の情報を送信し（Ｓ１９０５）、ＰＣ１内のＷｅｂブラウザ２５は、その画面を表示する（Ｓ１９０４）。ユーザが、コンテンツ（文書）を選択した状態で、図１７に示す印刷メニュー４０１を押下したのを検知すると、Ｗｅｂブラウザ２５は、文書作成ＡＰＰ１４５に図１８に示す印刷画面１４２を要求する（Ｓ１９０４）。文書作成ＡＰＰ１４５は、ＰＣ１に印刷画面１４２の情報を送信し（Ｓ１９０５）、ＰＣ１内のＷｅｂブラウザ２５は、その画面を表示する（Ｓ１９０４）。
【０１６６】
デバイス選択肢５３６が選択されている（ＭＦＰ３が選択されている）状態で、ユーザが印刷ボタン５３４を押下したのを検知すると、Ｗｅｂブラウザ２５は、文書作成ＡＰＰ１４５に印刷要求を発行する（Ｓ１９０６）。その際、この印刷要求が発行されたホストがＰＣである旨を表す情報（host=PC）と、この印刷要求がＭＦＰ３へのジョブ通知を必要とする旨を表す情報（notification=yes）が、この印刷要求の中に含まれている。
【０１６７】
文書作成ＡＰＰ１４５は、印刷要求を受け付けると、クラウド印刷ＡＰＰ１４６に印刷ジョブを発行する（Ｓ１９０７）。その際、この印刷ジョブの印刷要求が発行されたホストがＰＣである旨を表す情報（host=PC）と、この印刷ジョブがＭＦＰ３へのジョブ通知を必要とする旨を表す情報（notification=yes）が、この印刷ジョブの中に含まれている。
【０１６８】
クラウド印刷ＡＰＰ１４６は、プロキシＡＰＰ１４３のプリントキューに印刷ジョブを入稿する（Ｓ１９０８）。その際、クラウド印刷ＡＰＰ１４６は、この印刷ジョブの印刷要求が発行されたホストがＰＣである旨を表す情報（host=PC）、この印刷ジョブがＭＦＰ３へのジョブ通知を必要とする旨を表す情報（notification=yes）、この印刷ジョブの発行年月日・時刻（発行時間）を、印刷ジョブに付加する。プロキシＡＰＰ１４３は、図２０（Ａ）に示すジョブのスタック処理を実行して、ジョブＩＤ（印刷ジョブＩＤ）をクラウド印刷ＡＰＰ１４６に返し（Ｓ１９０９）、ＭＦＰ３からの印刷ジョブ取得要求待ち状態となる（Ｓ１９１０）。
【０１６９】
Ｓ１９０８において、クラウド印刷ＡＰＰ１４６は、プロキシＡＰＰ１４３から返されたジョブＩＤ（印刷ジョブＩＤ）を文書作成ＡＰＰ１４５に返す。ＰＣ１内のＷｅｂブラウザ２５が、文書作成ＡＰＰ１４５に発行された印刷要求のレスポンスを受信すると、文書作成ＡＰＰ１４５にホーム画面を要求する（Ｓ１９１１）。文書作成ＡＰＰ１４５は、ＰＣ１にホーム画面の情報を送信し（Ｓ１９１２）、ＰＣ１は、Ｗｅｂブラウザ２５でその画面を表示し（Ｓ１９１１）、ユーザの入力操作待ち状態となる（Ｓ１９１３）。
【０１７０】
図２１で後述するように、図２１のＳ２１０８において、プロキシＡＰＰ１４３は、ＭＦＰ３にジョブ（印刷ジョブ）通知を送信し、ＭＦＰ３は、このジョブ（印刷ジョブ）通知を受信すると（Ｓ１９１４）、図２４で後述するように印刷ジョブ要求を印刷キューデータベースに登録する（Ｓ１９１５）。その後、オンラインでのスタンバイ状態となる（Ｓ１９１６）。
【０１７１】
印刷開始時においては、表示部２１に「印刷準備中」または「印刷中」というような印刷関連処理を実行中である旨を表すメッセージを表示して、印刷モードに移行したことをユーザに知らせる。ＭＦＰ３は、Ｗｅｂブラウザ２７を介さずにこのメッセージを表示する。ＭＦＰ３は、プロキシＡＰＰ１４３にジョブ（印刷ジョブ）取得要求を発行する（Ｓ１９１７）。プロキシＡＰＰ１４３は、図２０（Ｂ）に示すジョブ情報の返信処理を実行し、その結果として次に示すような印刷ジョブ情報をＭＦＰ３へ返信する（Ｓ１９１８）。
【０１７２】
［印刷ジョブ情報の例］
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
ＭＦＰ３は、印刷ジョブ情報から印刷設定を表す印刷設定ファイルの格納先と印刷画像ファイルの格納先（ticketUriとdataUri）を取得する。ＭＦＰ３は、ｔｉｃｋｅｔＵｒｉ、ｄａｔａＵｒｉで指定されたパス（ＵＲＩ）にそれぞれアクセスして、印刷ジョブ（印刷設定ファイルと印刷画像ファイル）を取得する。ＭＦＰ３は、印刷設定ファイルと印刷画像ファイルの内容に従って印刷を実行し、印刷を完了または終了した時に印刷が終了したことをＡＰＰ１４３に通知をする（Ｓ１９１９）。Ｓ１９２０において、プロキシＡＰＰ１４３は、図２３に示すジョブの削除の処理を実行し、そのジョブに関する一連の処理を終了する（Ｓ１９２１）。ＭＦＰ３は、印刷を完了または終了した後、オンラインでのスタンバイ状態となる（Ｓ１９２２）。
【０１７３】
［プロキシＡＰＰ１４３におけるジョブのスタック処理とジョブ情報の返信処理］
図２０は、プロキシＡＰＰ１４３におけるジョブのスタック処理とジョブ情報の返信処理の手順を示すフローチャートである。図２０（Ａ）は、プロキシＡＰＰ１４３におけるジョブのスタック処理の手順を示すフローチャートである。
【０１７４】
図１９のＳ１９０９においてジョブのスタック処理が実行されると、同図において、プロキシＡＰＰ１４３は、ジョブのスタック処理を開始する（Ｓ２００１）。プロキシＡＰＰ１４３は、図２２（Ａ）に示すジョブキューにジョブをスタックし、図２２（Ｂ）に示すジョブ情報を格納可能なテーブルに各情報を保存する（Ｓ２００２）。プロキシＡＰＰ１４３は、ジョブＩＤを生成し（Ｓ２００３）、ジョブＩＤ（印刷ジョブＩＤまたは読取ジョブＩＤ）をこの処理の呼び出し元に返し、この処理の呼び出し元に戻る（Ｓ２００４）。
【０１７５】
図２０（Ｂ）は、プロキシＡＰＰ１４３におけるジョブ情報の返信処理の手順を示すフローチャートである。図１９のＳ１９１８においてジョブ情報の返信処理が実行されると、同図において、プロキシＡＰＰ１４３は、ジョブ情報の返信処理を開始する（Ｓ２０１０）。プロキシＡＰＰ１４３は、デバイスＩＤで、対象のデバイス（ＭＦＰ３）のジョブキューを特定し（Ｓ２０１１）、そのジョブキューにおいて、ジョブＩＤが一致するジョブを検索する（Ｓ２０１２）。
【０１７６】
ここで、ジョブキューの例としては、図２２（Ａ）が挙げられる。プロキシＡＰＰ１４３がジョブキュー内にジョブが有ると判定した場合、Ｓ２０１４へ進み、ジョブが無いと判定した場合、Ｓ２０１６へ進む（Ｓ２０１３）。
【０１７７】
Ｓ２０１４において、プロキシＡＰＰ１４３は、ジョブキュー内にスタックされているジョブＩＤのジョブ情報を取得してＳ２０１５へ進む。Ｓ２０１５において、プロキシＡＰＰ１４３は、Ｓ２０１４で取得したジョブ情報をそのデバイスに返信し、この処理の読み出し元に戻る（Ｓ２０１７）。
【０１７８】
Ｓ２０１６において、プロキシＡＰＰ１４３は、対象のデバイスのジョブキュー内にジョブＩＤのジョブが無い為、ジョブ情報が存在しない旨をそのデバイスに返信し、この処理の読み出し元に戻る（Ｓ２０１７）。
【０１７９】
［プロキシＡＰＰ１４３におけるジョブ通知処理］
図２１は、プロキシＡＰＰ１４３におけるジョブ通知処理の手順を示すフローチャートである。プロキシＡＰＰ１４３は、常時起動していて、管理／制御対象のデバイス（プリンタやＭＦＰ）に対して順に、同図に示す処理を実行し、必要に応じて対象のデバイスにジョブ通知（印刷ジョブ通知）を送信する。同図では、対象のデバイスが特定された後の処理を示す。ここでは、対象のデバイスとして、ＭＦＰ３が特定された例で説明する。
【０１８０】
プロキシＡＰＰ１４３は、対象のデバイスをＭＦＰ３と特定して、ジョブ通知処理を実行すると、同図に示す処理を開始する（Ｓ２１０１）。プロキシＡＰＰ１４３は、デバイス（ＭＦＰ３）の状態を確認し（Ｓ２１０２）、オンライン状態であると判定した場合、Ｓ２１０４へ進み、オンライン状態でないと判定した場合、Ｓ２１０９へ進む（Ｓ２１０３）。
【０１８１】
Ｓ２１０４において、プロキシＡＰＰ１４３は、図２２（Ａ）に示すジョブキューを参照して、ＭＦＰ３の印刷ジョブの有無を確認し、印刷ジョブが有ると判定した場合、Ｓ２１０５へ進み、印刷ジョブが無いと判定した場合、Ｓ２１０９へ進む。
【０１８２】
Ｓ２１０５において、プロキシＡＰＰ１４３は、画像変換ＡＰＰ１４４に画像変換を要求する。画像変換ＡＰＰ１４４は、プロキシＡＰＰ１４３からの画像変換要求に従って、印刷対象の画像を、ＭＦＰ３が印刷できるファイル形式であるＪＰＥＧファイルに変換する（Ｓ２１０６）。ここで、印刷対象の画像とは、文書作成ＡＰＰ１４５がＨＤＤ２０２に一時的に保存している、印刷対象のコンテンツまたは印刷用に生成したＰＤＦファイルである。
【０１８３】
画像変換ＡＰＰ１４４の画像変換処理が完了すると、プロキシＡＰＰ１４３は、処理中の印刷ジョブのジョブＩＤをキーとして、図２２（Ｂ）に示すその印刷ジョブの詳細情報を参照してジョブ通知（印刷ジョブ通知）の必要性の有無を確認する。プロキシＡＰＰ１４３は、ジョブ通知が必要（notification=yes）と判定した場合、Ｓ２１０８へ進み、ジョブ通知が必要でない（notification=no）と判定した場合、Ｓ２１０９へ進む（Ｓ２１０７）。Ｓ２１０７において、プロキシＡＰＰ１４３は、判定結果を、図２２（Ｂ）に示すジョブ情報を格納するテーブル内のジョブ通知の必要性の有無を表す情報として保存する。Ｓ２１０８において、プロキシＡＰＰ１４３は、ＭＦＰ３にジョブ通知（印刷ジョブ通知）を送信し、この処理を終了する（Ｓ２１０９）。
【０１８４】
［プロキシＡＰＰ１４３内のジョブキューと、ジョブキューにスタックされるジョブの印刷ジョブ情報］
図２２は、プロキシＡＰＰ１４３内のジョブキューを表す図と、プロキシＡＰＰ１４３内のジョブキューにスタックされるジョブの印刷ジョブ情報を格納するテーブルを表す図である。ジョブキューは、一般的なデータベースで構成されている。同図において、「ｐｒｎ」の付いたジョブＩＤは、印刷ジョブのジョブＩＤを示し、プロキシＡＰＰ１４３は、これらのジョブＩＤを生成する。発行年月日・時刻は、例えば、図２２（Ａ）に示すｐｒｎ００１０のジョブＩＤの例の場合では、このジョブが２０１２年０８月１４日７時７分１５秒の時刻に発行されたものであることを表す。図２２（Ａ）のジョブキューは、１つのジョブキューだけで構成された例であり、優先順位１位、容量制限は制限無しとして設定されているジョブキューの例である。
【０１８５】
図２２（Ｂ）に示すテーブルに格納される印刷ジョブ情報として、例えば、発行年月日・時刻、ホスト、オーナー名、デバイスＩＤ、ジョブチケットのパス（ＵＲＩ）、印刷画像データのパス（ＵＲＬ）、ステータス、ジョブ通知の必要性の有無、ジョブの優先順位がある。
【０１８６】
［プロキシＡＰＰ１４３における印刷ジョブの削除処理］
図２３は、プロキシＡＰＰ１４３における印刷ジョブの削除処理の手順を示すフローチャートである。図１９のＳ１９２０において印刷ジョブの削除処理が実行されると、プロキシＡＰＰ１４３は、印刷ジョブの削除処理を開始する（Ｓ２３０１）。プロキシＡＰＰ１４３は、画像変換ＡＰＰ１４４に印刷画像ファイルの削除要求を発行すると（Ｓ２３０２）、画像変換ＡＰＰ１４４は、ｄａｔａＵｒｉで指定されたパス（ＵＲＩ）に格納されている印刷画像ファイルを削除する（Ｓ２３０３）。
【０１８７】
プロキシＡＰＰ１４３は、文書作成ＡＰＰ１４５に印刷対象画像削除要求を発行すると（Ｓ２３０４）、文書作成ＡＰＰ１４５は、印刷対象の画像、即ちＨＤＤ２０２に一時的に保存している印刷対象コンテンツまたは印刷用に生成したＰＤＦファイルを削除する（Ｓ２３０５）。プロキシＡＰＰ１４３は、ジョブチケット削除要求を発行すると（Ｓ２３０６）、文書作成ＡＰＰ１４５は、印刷設定ファイル（ジョブチケット）を削除する（Ｓ２３０７）。プロキシＡＰＰ１４３は、ジョブ情報を削除し、図２２に示すジョブキューからもそのジョブを削除し（Ｓ２３０８）、この処理の呼び出し元に戻る（Ｓ２３０９）。
【０１８８】
［クラウド印刷の印刷ジョブ要求の印刷キューデータベースへの登録］
図２４は、クラウド印刷の印刷ジョブ要求を印刷キューデータベースに登録する処理の手順を示すフローチャートである。図２４のフローに係るプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出されてＣＰＵ１５により実行される。
【０１８９】
図１９のＳ１９１５において、印刷ジョブ要求の登録処理が実行されると、ＭＦＰ３は、印刷ジョブ要求を印刷キューデータベースに登録する処理を開始する（Ｓ２４０１）。Ｓ２４０１において、ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベースを確認する。Ｓ２４０２において、印刷キューデータベースに空領域があって印刷ジョブ要求が登録可能である場合、Ｓ２４０４に進み、空領域がなく登録不可である場合、Ｓ２４０５に進む。
【０１９０】
Ｓ２４０４において、クラウド印刷ジョブの印刷ジョブ要求を図２６（Ａ）に示す印刷キューデータベースに、Ｐｒｏｔｏｃｏｌ名を「ＨＴＴＰ」にして登録し、この処理を終了する（Ｓ２４０６）。
【０１９１】
Ｓ２４０５において、ＭＦＰ３は、プロキシＡＰＰ１４３に印刷ジョブ要求を送信し、この処理を終了する（Ｓ２４０６）。プロキシＡＰＰ１４３は、印刷ジョブ要求を受信し（Ｓ２４０７）、図２６（Ｂ）に示す印刷キューデータベースに印刷ジョブ要求を登録し（Ｓ２４０８）、この処理を終了する（Ｓ２４０９）。
【０１９２】
［ＭＦＰ３における印刷キューデータベースの最優先印刷ジョブ要求の確認処理］
図２５は、ＭＦＰ３における印刷キューデータベースの最優先印刷ジョブ要求の確認処理の手順を示すフローチャートである。縦の列が処理の実行元を表し、左側からＭＦＰ３、プロキシＡＰＰ１４３に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図２５のフローに係るプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出されてＣＰＵ１５により実行される。
【０１９３】
プロキシＡＰＰ１４３の図２６（Ｂ）に示す印刷キューデータベースに印刷ジョブ要求が予約されている状態において、ＭＦＰ３が印刷ジョブ要求を図２６（Ａ）に示す印刷キューデータベースに登録した際、または、最優先印刷ジョブ要求が更新された際に、同図に示す処理が実行される（Ｓ２５０１）。Ｓ２５０２において、ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベースに予約されている最も優先順位の高い印刷ジョブ要求の「Ｐｒｏｔｏｃｏｌ」欄を確認し、クラウド印刷であるか否かを判定する。ここで、「ＨＴＴＰ」であればクラウド印刷であると判定してＳ２５０３に進み、「ＷＳＤ」であればクラウド印刷でないと判定してＳ２５０４に進む。
【０１９４】
Ｓ２５０３において、図１９のＳ１９１７〜Ｓ１９２１のクラウド印刷処理を行い、印刷を終了する（Ｓ２５０５）。一方、Ｓ２５０４において、図１４で示すようにＰＣからの印刷ジョブを受けて印刷を開始し、印刷を終了する（Ｓ２５０５）。
【０１９５】
印刷終了後、印刷が終了した（実行済みの）印刷ジョブ要求を印刷キューデータベースから削除し（Ｓ２５０６）、ＭＦＰ３は、プロキシＡＰＰ１４３に印刷ジョブ要求の取得要求を発行する（Ｓ２５０７）。
【０１９６】
プロキシＡＰＰ１４３は、ＭＦＰ３から印刷ジョブ要求の取得要求を受信すると（Ｓ２５０８）、プロキシＡＰＰ１４３の図２６（Ｂ）の印刷キューデータベースに予約されている印刷ジョブ要求の中で最も優先順位の高い印刷ジョブ要求をＭＦＰ３に送信する。プロキシＡＰＰ１４３は、送信した印刷ジョブ要求を印刷キューデータベースから削除する（Ｓ２５０９）。ＭＦＰ３は、プロキシＡＰＰ１４３から受信した印刷ジョブ要求（Ｓ２５１０）を、ＭＦＰ３の印刷キューデータベースに登録し（Ｓ２５１１）、Ｓ２５１２において印刷キューデータベースを更新し、終了する（Ｓ２５１３）。
【０１９７】
［ＭＦＰ３における印刷キューデータベースの更新割込処理］
図２７は、ＭＦＰ３における印刷キューデータベースの更新割り込みの処理の手順を示すフローチャートである。縦の列が処理の実行元を表し、左側からＭＦＰ３、プロキシＡＰＰ１４３に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図２７のフローに係るプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出されてＣＰＵ１５により実行される。
【０１９８】
ＭＦＰ３に内蔵されているタイマーにより、１８０秒毎にこの割り込みが発生し、同図に示す処理が実行される。ＭＦＰ３に内蔵されているタイマーにより、この割り込み処理が発生すると、同図のＳ２７００が開始される。ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベース内の予約されている印刷ジョブ要求の中から、最も優先順位の高いものの内容を確認し（Ｓ２７０１）、クラウド印刷であるか否かを判定する（Ｓ２７０２）。ここで、Ｓ２７０１で確認した印刷ジョブ要求の「Ｐｒｏｔｏｃｏｌ」欄が「ＨＴＴＰ」であればクラウド印刷と判定してＳ２７０８に進み、「ＷＳＤ」であればクラウド印刷でないと判定してＳ２７０３に進む。
【０１９９】
Ｓ２７０３において、ＭＦＰ３は、内蔵されているタイマーから時刻や経過時間を計測可能なカウント値をTime2としてＲＡＭ等に保存する（Ｓ２７０３）。このカウント値の単位は「秒」である。ＭＦＰ３は、Time2と印刷キューデータベースの「Time」欄に設定されているタイムカウント値を減算する。ＭＦＰ３は、その減算結果が既定時間（６０秒）を超える場合、Ｓ２７０５へ進み、既定時間（６０秒）以内の場合、Ｓ２７０６へ進む（Ｓ２７０４）。
【０２００】
Ｓ２７０５において、ＭＦＰ３は、Ｓ２７０１で確認した印刷ジョブ要求の予約を図２６（Ａ）に示す印刷キューデータベース内から削除してＳ２７０８へ進む。その際、ＭＦＰ３は、この印刷ジョブ要求の印刷予約ＩＤ（ans:ReceivedId）も削除する。
【０２０１】
Ｓ２７０６において、ＭＦＰ３は、Ｓ２７０４で求めた減算結果が既定時間（２０秒）を超えるか否かを判定する（Ｓ２７０６）。ここで、超えると判定された場合、Ｓ２７０７へ進み、既定時間（２０秒）を超えないと判定された場合、Ｓ２７０８へ進む。本実施形態では、この既定時間（２０秒）は、図１３のＳ１３１５で設定している２０秒と同一の値である。Ｓ２７０７において、ＭＦＰ３は、Ｓ２７０１で対象とした印刷ジョブ要求の印刷予約ＩＤ（ans:ReceivedId）を一旦削除する。そして、この印刷ジョブ要求を印刷キューデータベース内の最後尾に移動して、最も優先順位の低い印刷ジョブ要求の予約となるように変更し、Ｓ２７０８へ進む。
【０２０２】
Ｓ２７０８において、ＭＦＰ３が、全ての印刷ジョブ要求の予約の確認を完了した場合、Ｓ２７１０に進み、完了していない場合、Ｓ２７０９へ進む。Ｓ２７０９において、ＭＦＰ３は、図２６（Ａ）に示す印刷キューデータベース内の、次の優先順位の印刷ジョブ要求の確認に進み、Ｓ２７０２へ戻る。
【０２０３】
Ｓ２７１０において、ＭＦＰ３の図２６（Ａ）に示す印刷キューデータベースに、空領域があって印刷ジョブ要求を登録可能であれば、Ｓ２７１１へ進み、空領域がなく登録不可であれば、印刷キューデータベースの更新割り込みの処理を終了する（Ｓ２７１５）。
【０２０４】
Ｓ２７１１において、ＭＦＰ３は、印刷ジョブ要求の取得要求をプロキシＡＰＰ１４３に発行する。Ｓ２７１２において、Ｓ２７１１でＭＦＰ３から発行された印刷ジョブ要求の取得要求を受信する。Ｓ２７１３において、プロキシＡＰＰ１４３は、図２６（Ｂ）に示す印刷キューデータベースに予約されている印刷ジョブ要求の中で、最も優先順位の高い印刷ジョブ要求をＭＦＰ３に送信し、送信した印刷ジョブ要求を印刷キューデータベースから削除する。Ｓ２７１４において、ＭＦＰ３は、プロキシＡＰＰ１４３から送信された印刷ジョブ要求を図２６（Ａ）に示す印刷キューデータベースに登録して、印刷キューデータベースの更新割り込みの処理を終了する（Ｓ２７１５）。
【０２０５】
［印刷キューデータベースの更新処理］
図２８は、印刷キューデータベースの更新処理の手順を示すフローチャートである。縦の列が処理の実行元を表し、左側からＭＦＰ３、プロキシＡＰＰ１４３に対応している。但し、ある実行元の処理が実在しない図面においては、その実行元を図示していない場合がある。図２８のフローに係るプログラムは、ＲＯＭ１６に記憶されており、ＲＡＭ１７に読み出されてＣＰＵ１５により実行される。
【０２０６】
本処理は、図２６（Ａ）に示す印刷キューデータベースをＲＡＭ１７に示すような揮発性メモリに実装した場合に行う処理である。図２６（Ａ）に示す印刷キューデータベースを不揮発性メモリ（不図示）に実装した場合は、本処理を行わなくても良い。
【０２０７】
ＭＦＰ３の電源がＯＮになると、同図に示す処理が開始される（Ｓ２８０１）。Ｓ２８０２において、ＭＦＰ３は、プロキシＡＰＰ１４３に印刷ジョブ要求の取得要求を発行する。プロキシＡＰＰ１４３は、ＭＦＰ３からの印刷ジョブ要求の取得要求を受信すると（Ｓ２８０３）、プロキシＡＰＰ１４３の図２６（Ｂ）に示す印刷キューデータベースに予約されている印刷ジョブ要求の中で、ＭＦＰ３の印刷キューデータベースに登録できる数だけ、印刷ジョブ要求をＭＦＰ３に送信する。送信した印刷ジョブ要求は、印刷キューデータベースから削除し（Ｓ２８０４）、この処理を終了する（Ｓ２８０８）。
【０２０８】
ＭＦＰ３は、プロキシＡＰＰ１４３から送信された印刷ジョブ要求を受信すると（Ｓ２８０５）、受信した印刷ジョブ要求を印刷キューデータベースに登録して（Ｓ２８０６）、印刷キューデータベースの更新処理を終了する（Ｓ２８０７）。
本実施形態では、異なるプロトコルの印刷ジョブを同一の印刷キューデータベースで管理することにより、発行順に印刷をすることができる。より具体的には、例えば、ローカルネットワークにより接続された情報処理装置からのＷＳＤ印刷と、ワイドエリアネットワークを介して接続された情報処理装置からのクラウド印刷を同一の印刷キューデータベースで管理することにより、ＷＳＤ印刷とクラウド印刷を発行順に印刷することができる。
【０２０９】
また、本実施形態では、印刷を実行する装置（ここでは、ＭＦＰ３）が印刷キューデータベース（印刷キュー管理テーブル）を備えるだけでなく、印刷を実行するＭＦＰ３とワイドエリアネットワークを介して接続する外部装置（ここでは、ＰＣ２）に、ＭＦＰ３用の印刷キューデータベースを備える。そして、ＰＣ２のプロキシＡＰＰ１４３の印刷キューデータベースも異なるプロトコルの印刷ジョブ要求を一元管理することができる。これにより、ＭＦＰ３に印刷ジョブの印刷要求を送信した際に、ＭＦＰ３の印刷キューデータベースに送信した印刷ジョブ要求を登録できなかった場合、ＰＣ２に当該印刷ジョブを転送し、ＰＣ２の印刷キューデータベースに登録する。これにより、より多くの印刷ジョブの予約要求を管理することができる。すなわち、ＭＦＰ３の印刷キューデータベースの容量が小さく、ＭＦＰ３の印刷キューデータベースに予約要求を登録することができない場合でも、印刷の予約をしておくことができる。
【０２１０】
［実施形態２］
実施形態１において、図１９、図２１では、ＰＣ１内のＷｅｂブラウザ２５から文書作成ＡＰＰ１４５を実行して印刷を行う例を挙げた。この例の場合、プロキシＡＰＰ１４３がＭＦＰ３に印刷ジョブ通知を発行する前に、図２１のＳ２１０５とＳ２１０６の画像変換処理が行なわれる。その為、ＭＦＰ３は、図１９のＳ１９１７の処理が開始されると、変換された画像データをすぐに取得でき印刷可能である。
【０２１１】
しかしながら、図１９のＳ１９１７の処理が開始されない場合、図２１のＳ２１０６において変換された画像データは、ＰＣ２内に存在し続け、その間ＰＣ２のディスク容量を占有することになる。そこで、特定時間以上その画像データが印刷されない場合には、ディスク容量、セキュリティの観点から、ＰＣ２内から削除するほうが好ましいと考えられる。
【０２１２】
ここで、図２１のＳ２１０６の画像変換から特定時間以上経過した際に、ＰＣ２から画像データを削除する場合、特定時間以上経過後（画像データ削除後）に図１９のＳ１９１７の印刷ジョブ取得要求を開始すると印刷に失敗してしまう、ということがある。本実施形態では、このことを解決するための周辺装置制御システムの一例を説明する。実施形態１で既に説明した内容に関しては、その説明を省略する。
【０２１３】
本実施形態では、図２１のＳ２１０５の画像変換要求とＳ２１０６の画像変換処理を、図１９のＳ１９１７のＭＦＰ３からプロキシＡＰＰ１４３に印刷ジョブ要求の取得が発行された後に行うようにする。このようにすることで、ＭＦＰ３が印刷を開始できる状態になってから、Ｓ２１０５の画像変換要求とＳ２１０６の画像変換処理を行うことになる。その為、ＭＦＰ３は、変換された画像をすぐに印刷することができる。
【０２１４】
［他の実施形態］
本発明は、上述した実施形態に限定されるものではない。例えば、上述した実施形態では、印刷を実行する装置（ＭＦＰ３）以外の印刷キューデータベースとして、クラウド印刷を提供するアプリケーションサーバーが印刷キューデータベースを有するものとしたが、これに限定されるものではない。すなわち、印刷を実行する装置とネットワークを介して接続可能な外部装置が印刷を実行する装置用の印刷キューデータベースを有していればよい。また、印刷を実行する装置用の印刷キューデータベースは、複数の外部装置が備えるようにしてもよい。これにより、より多くの印刷ジョブを登録することができる。
【０２１５】
本実施形態では、ローカルエリアネットワークを介して発行された第１のジョブとしてＷＳＤ印刷を例にあげたが、これに限定されず、他のプロトコルの印刷であってもよい。また、この場合、ＭＦＰ３が備える印刷キューデータベースは、ローカルエリアネットワークを介して受け付けたＷＳＤ印刷と他のプロトコルの印刷と、ワイドエリアネットワークを介して受け付けたクラウド印刷を受け付け、情報処理装置からの発行順に従って、印刷ジョブ（印刷ジョブ要求）を管理するようにすればよい。
【０２１６】
上述した実施形態では、プロキシＡＰＰ１４３が印刷ジョブの削除処理を行うものとしたが、これに限定されず、例えば、ＭＦＰ３が印刷ジョブの削除処理を行うようにしてもよい。
【０２１７】
上述した実施形態では、ＰＣ１、ＰＣ２、ＰＣ５、ＰＣ７、ＰＣ６０，ＰＣ６１、ＰＣ７４１、ＭＦＰ３、ＭＦＰ１０３が利用するネットワークのインタフェースとして、Ｅｔｈｅｒｎｅｔ（登録商標）を採用した。しかしながら、このインタフェースに限られることなく、例えば、無線ＬＡＮ、ＩＥＥＥ１３９４、Ｂｌｕｅｔｏｏｔｈ（登録商標）、ＵＳＢ等の任意のインタフェースを用いるようにしてもよい。また、各種のアプリケーション（ファームウェア）における機能、上述したフローチャートに係る処理の一部、又は全部を専用のハードウェアを用いて構成してもよい。
【０２１８】
上述した実施形態では、情報処理装置としてパーソナルコンピュータを想定した。しかしながら、この例に限られるものではなく、例えばＤＶＤプレーヤー、ゲーム、セットトップボックス、インターネット家電等、同様な使用方法が可能な任意の情報処理装置（端末）に対して適用することができ、有効である。
【０２１９】
上述した実施形態では、周辺装置としてＭＦＰを例示した。しかしながら、周辺装置として他に、複写機、ファクシミリ、スキャナ、デジタルカメラ、及びこれらの複合機能を備える装置等の何れかであってもよい。上述した実施形態では、ＯＳの例としてＷｉｎｄｏｗｓと同等のＯＳを使用したが、このＯＳに限られるものではなく、任意のＯＳを使用することができる。上述した実施形態では、ネットワーク４の構成例としてＥｔｈｅｒｎｅｔ（登録商標）を用いたが、この例に限られるものではなく、他の任意のネットワーク構成であってもよい。
【０２２０】
上述した実施形態は、ＰＣ６０からＷＳＤのプロトコルを利用した印刷システムを利用した例を説明したが、ＰＣ６０からベンダー独自のプロトコルを利用した印刷システムまたは、ＯＳが提供するその他のローカルまたはネットワーク印刷システム等の任意の印刷システムや、任意のプロトコルを利用した場合も同様に適用することができる。上述した実施形態は、ＰＣ１からＧＣＰを利用した印刷システムを利用した例を説明したが、Internet Printing Protocolや、Universal Plug and Playなどの任意の印刷サービスを利用した印刷システムも同様に適用することができる。
【０２２１】
本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア（プログラム）を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ等）がプログラムを読み出して実行する処理である。また、プログラムは、１つのコンピュータで実行させても、複数のコンピュータを連動させて実行させるようにしてもよい。また、上記した処理の全てをソフトウェアで実現する必要はなく、処理の一部または全部をＡＳＩＣ等のハードウェアで実現するようにしてもよい。また、ＣＰＵも１つのＣＰＵで全ての処理を行うものに限らず、複数のＣＰＵが適宜連携をしながら処理を行うものとしてもよい。
【図１】
2015150706.tif 000003
【図２】
2015150706.tif 000004
【図３】
2015150706.tif 000005
【図４】
2015150706.tif 000006
【図５】
2015150706.tif 000007
【図６】
2015150706.tif 000008
【図７】
2015150706.tif 000009
【図８】
2015150706.tif 000010
【図９】
2015150706.tif 000011
【図１０】
2015150706.tif 000012
【図１１】
2015150706.tif 000013
【図１２】
2015150706.tif 000014
【図１３】
2015150706.tif 000015
【図１４】
2015150706.tif 000016
【図１５】
2015150706.tif 000017
【図１６】
2015150706.tif 000018
【図１７】
2015150706.tif 000019
【図１８】
2015150706.tif 000020
【図１９】
2015150706.tif 000021
【図２０】
2015150706.tif 000022
【図２１】
2015150706.tif 000023
【図２２】
2015150706.tif 000024
【図２３】
2015150706.tif 000025
【図２４】
2015150706.tif 000026
【図２５】
2015150706.tif 000027
【図２６】
2015150706.tif 000028
【図２７】
2015150706.tif 000029
【図２８】
2015150706.tif 000030