1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_SERVICE_CLOUD_PRINT_JOB_STATUS_UPDATER_H_ 6 #define CHROME_SERVICE_CLOUD_PRINT_JOB_STATUS_UPDATER_H_ 7 8 #include <string> 9 10 #include "base/compiler_specific.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/threading/thread.h" 13 #include "chrome/service/cloud_print/cloud_print_url_fetcher.h" 14 #include "chrome/service/cloud_print/print_system.h" 15 #include "net/url_request/url_request_status.h" 16 #include "url/gurl.h" 17 18 namespace cloud_print { 19 20 // Periodically monitors the status of a local print job and updates the 21 // cloud print server accordingly. When the job has been completed this 22 // object releases the reference to itself which should cause it to 23 // self-destruct. 24 class JobStatusUpdater : public base::RefCountedThreadSafe<JobStatusUpdater>, 25 public CloudPrintURLFetcherDelegate { 26 public: 27 class Delegate { 28 public: 29 virtual bool OnJobCompleted(JobStatusUpdater* updater) = 0; 30 virtual void OnAuthError() = 0; 31 32 protected: ~Delegate()33 virtual ~Delegate() {} 34 }; 35 36 JobStatusUpdater(const std::string& printer_name, 37 const std::string& job_id, 38 PlatformJobId& local_job_id, 39 const GURL& cloud_print_server_url, 40 PrintSystem* print_system, 41 Delegate* delegate); 42 43 // Checks the status of the local print job and sends an update. 44 void UpdateStatus(); 45 void Stop(); 46 47 // CloudPrintURLFetcher::Delegate implementation. 48 virtual CloudPrintURLFetcher::ResponseAction HandleJSONData( 49 const net::URLFetcher* source, 50 const GURL& url, 51 base::DictionaryValue* json_data, 52 bool succeeded) OVERRIDE; 53 virtual CloudPrintURLFetcher::ResponseAction OnRequestAuthError() OVERRIDE; 54 virtual std::string GetAuthHeader() OVERRIDE; 55 start_time()56 base::Time start_time() const { 57 return start_time_; 58 } 59 60 private: 61 friend class base::RefCountedThreadSafe<JobStatusUpdater>; 62 virtual ~JobStatusUpdater(); 63 64 base::Time start_time_; 65 std::string printer_name_; 66 std::string job_id_; 67 PlatformJobId local_job_id_; 68 PrintJobDetails last_job_details_; 69 scoped_refptr<CloudPrintURLFetcher> request_; 70 GURL cloud_print_server_url_; 71 scoped_refptr<PrintSystem> print_system_; 72 Delegate* delegate_; 73 // A flag that is set to true in Stop() and will ensure the next scheduled 74 // task will do nothing. 75 bool stopped_; 76 DISALLOW_COPY_AND_ASSIGN(JobStatusUpdater); 77 }; 78 79 // This typedef is to workaround the issue with certain versions of 80 // Visual Studio where it gets confused between multiple Delegate 81 // classes and gives a C2500 error. (I saw this error on the try bots - 82 // the workaround was not needed for my machine). 83 typedef JobStatusUpdater::Delegate JobStatusUpdaterDelegate; 84 85 } // namespace cloud_print 86 87 #endif // CHROME_SERVICE_CLOUD_PRINT_JOB_STATUS_UPDATER_H_ 88