Index: chrome/browser/printing/cloud_print/job_status_updater.cc |
=================================================================== |
--- chrome/browser/printing/cloud_print/job_status_updater.cc (revision 0) |
+++ chrome/browser/printing/cloud_print/job_status_updater.cc (revision 0) |
@@ -0,0 +1,90 @@ |
+// 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. |
+ |
+#include "chrome/browser/printing/cloud_print/job_status_updater.h" |
+ |
+#include "base/json/json_reader.h" |
+#include "base/string_util.h" |
+#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
+#include "chrome/browser/printing/cloud_print/cloud_print_consts.h" |
+#include "chrome/browser/printing/cloud_print/cloud_print_helpers.h" |
+#include "googleurl/src/gurl.h" |
+ |
+JobStatusUpdater::JobStatusUpdater(const std::string& printer_name, |
+ const std::string& job_id, |
+ cloud_print::PlatformJobId& local_job_id, |
+ const std::string& auth_token, |
+ Delegate* delegate) |
+ : printer_name_(printer_name), job_id_(job_id), |
+ local_job_id_(local_job_id), auth_token_(auth_token), |
+ delegate_(delegate), stopped_(false) { |
+ DCHECK(delegate_); |
+} |
+ |
+// Start checking the status of the local print job. |
+void JobStatusUpdater::UpdateStatus() { |
+ // It does not matter if we had already sent out an update and are waiting for |
+ // a response. This is a new update and we will simply cancel the old request |
+ // and send a new one. |
+ if (!stopped_) { |
+ bool need_update = false; |
+ // If the job has already been completed, we just need to update the server |
+ // with that status. The *only* reason we would come back here in that case |
+ // is if our last server update attempt failed. |
+ if (last_job_details_.status == cloud_print::PRINT_JOB_STATUS_COMPLETED) { |
+ need_update = true; |
+ } else { |
+ cloud_print::PrintJobDetails details; |
+ if (cloud_print::GetJobDetails(printer_name_, local_job_id_, &details)) { |
+ if (details != last_job_details_) { |
+ last_job_details_ = details; |
+ need_update = true; |
+ } |
+ } else { |
+ // If GetJobDetails failed, the most likely case is that the job no |
+ // longer exists in the OS queue. We are going to assume it is done in |
+ // this case. |
+ last_job_details_.Clear(); |
+ last_job_details_.status = cloud_print::PRINT_JOB_STATUS_COMPLETED; |
+ need_update = true; |
+ } |
+ } |
+ if (need_update) { |
+ GURL update_url = CloudPrintHelpers::GetUrlForJobStatusUpdate( |
+ job_id_, last_job_details_); |
+ request_.reset(new URLFetcher(update_url, URLFetcher::GET, this)); |
+ CloudPrintHelpers::PrepCloudPrintRequest(request_.get(), auth_token_); |
+ request_->Start(); |
+ } |
+ } |
+} |
+ |
+void JobStatusUpdater::Stop() { |
+ request_.reset(); |
+ DCHECK(delegate_); |
+ stopped_ = true; |
+ delegate_->OnJobCompleted(this); |
+} |
+ |
+// URLFetcher::Delegate implementation. |
+void JobStatusUpdater::OnURLFetchComplete(const URLFetcher* source, |
+ const GURL& url, |
+ const URLRequestStatus& status, |
+ int response_code, |
+ const ResponseCookies& cookies, |
+ const std::string& data) { |
+ int64 next_update_interval = kJobStatusUpdateInterval; |
+ if (!status.is_success() || (response_code != 200)) { |
+ next_update_interval *= 10; |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, NewRunnableMethod(this, &JobStatusUpdater::UpdateStatus), |
+ next_update_interval); |
+ } else if (last_job_details_.status == |
+ cloud_print::PRINT_JOB_STATUS_COMPLETED) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, NewRunnableMethod(this, &JobStatusUpdater::Stop)); |
+ } |
+} |
+ |
Property changes on: chrome\browser\printing\cloud_print\job_status_updater.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |