Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2996)

Unified Diff: chrome/browser/printing/cloud_print/printer_job_handler.h

Issue 1566047: First cut of Cloud Print Proxy implementation. The code is not enabled for no... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Final review changes Created 10 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/printing/cloud_print/printer_job_handler.h
===================================================================
--- chrome/browser/printing/cloud_print/printer_job_handler.h (revision 0)
+++ chrome/browser/printing/cloud_print/printer_job_handler.h (revision 0)
@@ -0,0 +1,240 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PRINTING_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_
+#define CHROME_BROWSER_PRINTING_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_
+
+#include <list>
+#include <string>
+
+#include "base/file_path.h"
+#include "base/ref_counted.h"
+#include "base/thread.h"
+#include "chrome/browser/printing/cloud_print/job_status_updater.h"
+#include "chrome/browser/printing/cloud_print/printer_info.h"
+#include "chrome/browser/net/url_fetcher.h"
+#include "net/url_request/url_request_status.h"
+
+// A class that handles cloud print jobs for a particular printer. This class
+// imlements a state machine that transitions from Start to various states. The
+// various states are shown in the below diagram.
+// the status on the server.
+
+// Start --> No pending tasks --> Done
+// |
+// |
+// | Have Pending tasks
+// |
+// |
+// <----Delete Pending -- | ---Update Pending----->
+// | | |
+// | | |
+// | | |
+// Delete Printer from server | Update Printer info on server
+// Shutdown | Go to Stop
+// |
+// | Job Available
+// |
+// |
+// Fetch Next Job Metadata
+// Fetch Print Ticket
+// Fetch Print Data
+// Spool Print Job
+// Create Job StatusUpdater for job
+// Mark job as "in progress" on server
+// (On any unrecoverable error in any of the above steps go to Stop)
+// Go to Stop
+// |
+// |
+// |
+// |
+// |
+// |
+// |
+// Stop
+// (If there are pending tasks go back to Start)
+
+typedef URLFetcher::Delegate URLFetcherDelegate;
+
+class PrinterJobHandler : public base::RefCountedThreadSafe<PrinterJobHandler>,
+ public URLFetcherDelegate,
+ public JobStatusUpdaterDelegate,
+ public cloud_print::PrinterChangeNotifierDelegate {
+ enum PrintJobError {
+ SUCCESS,
+ JOB_DOWNLOAD_FAILED,
+ INVALID_JOB_DATA,
+ PRINT_FAILED,
+ };
+ struct JobDetails {
+ std::string job_id_;
+ std::string job_title_;
+ std::string print_ticket_;
+ FilePath print_data_file_path_;
+ std::string print_data_mime_type_;
+ void Clear() {
+ job_id_.clear();
+ job_title_.clear();
+ print_ticket_.clear();
+ print_data_mime_type_.clear();
+ print_data_file_path_ = FilePath();
+ }
+ };
+
+ public:
+ class Delegate {
+ public:
+ virtual void OnPrinterJobHandlerShutdown(
+ PrinterJobHandler* job_handler, const std::string& printer_id) = 0;
+ };
+
+ // Begin public interface
+ PrinterJobHandler(const cloud_print::PrinterBasicInfo& printer_info,
+ const std::string& printer_id,
+ const std::string& caps_hash,
+ const std::string& auth_token,
+ Delegate* delegate);
+ ~PrinterJobHandler();
+ bool Initialize();
+ // Notifies the JobHandler that a job is available
+ void NotifyJobAvailable();
+ // Shutdown everything (the process is exiting).
+ void Shutdown();
+ // End public interface
+
+ // Begin Delegate implementations
+
+ // URLFetcher::Delegate implementation.
+ virtual void OnURLFetchComplete(const URLFetcher* source, const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ // JobStatusUpdater::Delegate implementation
+ virtual bool OnJobCompleted(JobStatusUpdater* updater);
+ // cloud_print::PrinterChangeNotifier::Delegate implementation
+ virtual void OnPrinterAdded();
+ virtual void OnPrinterDeleted();
+ virtual void OnPrinterChanged();
+ virtual void OnJobChanged();
+
+ // End Delegate implementations
+
+ private:
+ // Prototype for a response handler. The return value indicates whether the
+ // request should be retried, false means "retry", true means "do not retry"
+ typedef bool (PrinterJobHandler::*ResponseHandler)(
+ const URLFetcher* source, const GURL& url,
+ const URLRequestStatus& status, int response_code,
+ const ResponseCookies& cookies, const std::string& data);
+ // Begin request handlers for each state in the state machine
+ bool HandlePrinterUpdateResponse(const URLFetcher* source, const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ bool HandlePrinterDeleteResponse(const URLFetcher* source, const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ bool HandleJobMetadataResponse(const URLFetcher* source, const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ bool HandlePrintTicketResponse(const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ bool HandlePrintDataResponse(const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ bool HandleSuccessStatusUpdateResponse(const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ bool HandleFailureStatusUpdateResponse(const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+ // End request handlers for each state in the state machine
+
+ // Start the state machine. Based on the flags set this could mean updating
+ // printer information, deleting the printer from the server or looking for
+ // new print jobs
+ void Start();
+
+ // End the state machine. If there are pending tasks, we will post a Start
+ // again.
+ void Stop();
+
+ void StartPrinting();
+ void HandleServerError(const GURL& url);
+ void Reset();
+ void UpdateJobStatus(cloud_print::PrintJobStatus status, PrintJobError error);
+ void MakeServerRequest(const GURL& url, ResponseHandler response_handler);
+ void JobFailed(PrintJobError error);
+ void JobSpooled(cloud_print::PlatformJobId local_job_id);
+ // Returns false if printer info is up to date and no updating is needed.
+ bool UpdatePrinterInfo();
+ bool HavePendingTasks();
+
+ static void DoPrint(const JobDetails& job_details,
+ const std::string& printer_name,
+ PrinterJobHandler* job_handler,
+ MessageLoop* job_message_loop);
+
+
+ scoped_ptr<URLFetcher> request_;
+ cloud_print::PrinterBasicInfo printer_info_;
+ std::string printer_id_;
+ std::string auth_token_;
+ std::string last_caps_hash_;
+ std::string print_data_url_;
+ JobDetails job_details_;
+ Delegate* delegate_;
+ // Once the job has been spooled to the local spooler, this specifies the
+ // job id of the job on the local spooler.
+ cloud_print::PlatformJobId local_job_id_;
+ ResponseHandler next_response_handler_;
+ // The number of consecutive times that connecting to the server failed.
+ int server_error_count_;
+ // The thread on which the actual print operation happens
+ base::Thread print_thread_;
+ // There may be pending tasks in the message queue when Shutdown is called.
+ // We set this flag so as to do nothing in those tasks.
+ bool shutting_down_;
+
+ // Flags that specify various pending server updates
+ bool server_job_available_;
+ bool printer_update_pending_;
+ bool printer_delete_pending_;
+
+ // Some task in the state machine is in progress.
+ bool task_in_progress_;
+ cloud_print::PrinterChangeNotifier printer_change_notifier_;
+ typedef std::list< scoped_refptr<JobStatusUpdater> > JobStatusUpdaterList;
+ JobStatusUpdaterList job_status_updater_list_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrinterJobHandler);
+};
+
+// This typedef is to workaround the issue with certain versions of
+// Visual Studio where it gets confused between multiple Delegate
+// classes and gives a C2500 error. (I saw this error on the try bots -
+// the workaround was not needed for my machine).
+typedef PrinterJobHandler::Delegate PrinterJobHandlerDelegate;
+
+#endif // CHROME_BROWSER_PRINTING_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_
+
Property changes on: chrome\browser\printing\cloud_print\printer_job_handler.h
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome/browser/printing/cloud_print/printer_info_win.cc ('k') | chrome/browser/printing/cloud_print/printer_job_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698