| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/service/cloud_print/cloud_print_connector.h" | 5 #include "chrome/service/cloud_print/cloud_print_connector.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/md5.h" | 9 #include "base/md5.h" |
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 : client_(client), | 27 : client_(client), |
| 28 proxy_id_(proxy_id), | 28 proxy_id_(proxy_id), |
| 29 cloud_print_server_url_(cloud_print_server_url), | 29 cloud_print_server_url_(cloud_print_server_url), |
| 30 next_response_handler_(NULL) { | 30 next_response_handler_(NULL) { |
| 31 if (print_system_settings) { | 31 if (print_system_settings) { |
| 32 // It is possible to have no print settings specified. | 32 // It is possible to have no print settings specified. |
| 33 print_system_settings_.reset(print_system_settings->DeepCopy()); | 33 print_system_settings_.reset(print_system_settings->DeepCopy()); |
| 34 } | 34 } |
| 35 } | 35 } |
| 36 | 36 |
| 37 CloudPrintConnector::~CloudPrintConnector() { | |
| 38 } | |
| 39 | |
| 40 bool CloudPrintConnector::Start() { | 37 bool CloudPrintConnector::Start() { |
| 41 DCHECK(!print_system_.get()); | 38 DCHECK(!print_system_.get()); |
| 42 VLOG(1) << "CP_CONNECTOR: Starting connector, id: " << proxy_id_; | 39 VLOG(1) << "CP_CONNECTOR: Starting connector, id: " << proxy_id_; |
| 43 | 40 |
| 44 pending_tasks_.clear(); | 41 pending_tasks_.clear(); |
| 45 | 42 |
| 46 print_system_ = | 43 print_system_ = |
| 47 cloud_print::PrintSystem::CreateInstance(print_system_settings_.get()); | 44 cloud_print::PrintSystem::CreateInstance(print_system_settings_.get()); |
| 48 if (!print_system_.get()) { | 45 if (!print_system_.get()) { |
| 49 NOTREACHED(); | 46 NOTREACHED(); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 const GURL& url, | 135 const GURL& url, |
| 139 DictionaryValue* json_data, | 136 DictionaryValue* json_data, |
| 140 bool succeeded) { | 137 bool succeeded) { |
| 141 if (!IsRunning()) // Orphant response. Connector has been stopped already. | 138 if (!IsRunning()) // Orphant response. Connector has been stopped already. |
| 142 return CloudPrintURLFetcher::STOP_PROCESSING; | 139 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 143 | 140 |
| 144 DCHECK(next_response_handler_); | 141 DCHECK(next_response_handler_); |
| 145 return (this->*next_response_handler_)(source, url, json_data, succeeded); | 142 return (this->*next_response_handler_)(source, url, json_data, succeeded); |
| 146 } | 143 } |
| 147 | 144 |
| 145 CloudPrintURLFetcher::ResponseAction CloudPrintConnector::OnRequestAuthError() { |
| 146 OnAuthError(); |
| 147 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 148 } |
| 149 |
| 150 std::string CloudPrintConnector::GetAuthHeader() { |
| 151 return CloudPrintHelpers::GetCloudPrintAuthHeader(); |
| 152 } |
| 153 |
| 154 CloudPrintConnector::~CloudPrintConnector() {} |
| 155 |
| 148 CloudPrintURLFetcher::ResponseAction | 156 CloudPrintURLFetcher::ResponseAction |
| 149 CloudPrintConnector::HandlePrinterListResponse( | 157 CloudPrintConnector::HandlePrinterListResponse( |
| 150 const content::URLFetcher* source, | 158 const content::URLFetcher* source, |
| 151 const GURL& url, | 159 const GURL& url, |
| 152 DictionaryValue* json_data, | 160 DictionaryValue* json_data, |
| 153 bool succeeded) { | 161 bool succeeded) { |
| 154 DCHECK(succeeded); | 162 DCHECK(succeeded); |
| 155 if (!succeeded) | 163 if (!succeeded) |
| 156 return CloudPrintURLFetcher::RETRY_REQUEST; | 164 return CloudPrintURLFetcher::RETRY_REQUEST; |
| 157 | 165 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 DictionaryValue* printer_data = NULL; | 247 DictionaryValue* printer_data = NULL; |
| 240 if (printer_list->GetDictionary(0, &printer_data)) | 248 if (printer_list->GetDictionary(0, &printer_data)) |
| 241 InitJobHandlerForPrinter(printer_data); | 249 InitJobHandlerForPrinter(printer_data); |
| 242 } | 250 } |
| 243 } | 251 } |
| 244 ContinuePendingTaskProcessing(); // Continue processing background tasks. | 252 ContinuePendingTaskProcessing(); // Continue processing background tasks. |
| 245 return CloudPrintURLFetcher::STOP_PROCESSING; | 253 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 246 } | 254 } |
| 247 | 255 |
| 248 | 256 |
| 249 CloudPrintURLFetcher::ResponseAction CloudPrintConnector::OnRequestAuthError() { | |
| 250 OnAuthError(); | |
| 251 return CloudPrintURLFetcher::STOP_PROCESSING; | |
| 252 } | |
| 253 | |
| 254 std::string CloudPrintConnector::GetAuthHeader() { | |
| 255 return CloudPrintHelpers::GetCloudPrintAuthHeader(); | |
| 256 } | |
| 257 | |
| 258 void CloudPrintConnector::StartGetRequest(const GURL& url, | 257 void CloudPrintConnector::StartGetRequest(const GURL& url, |
| 259 int max_retries, | 258 int max_retries, |
| 260 ResponseHandler handler) { | 259 ResponseHandler handler) { |
| 261 next_response_handler_ = handler; | 260 next_response_handler_ = handler; |
| 262 request_ = new CloudPrintURLFetcher; | 261 request_ = new CloudPrintURLFetcher; |
| 263 request_->StartGetRequest(url, this, max_retries, std::string()); | 262 request_->StartGetRequest(url, this, max_retries, std::string()); |
| 264 } | 263 } |
| 265 | 264 |
| 266 void CloudPrintConnector::StartPostRequest(const GURL& url, | 265 void CloudPrintConnector::StartPostRequest(const GURL& url, |
| 267 int max_retries, | 266 int max_retries, |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 OnPrinterRegister(task.printer_info); | 401 OnPrinterRegister(task.printer_info); |
| 403 break; | 402 break; |
| 404 case PENDING_PRINTER_DELETE : | 403 case PENDING_PRINTER_DELETE : |
| 405 OnPrinterDelete(task.printer_id); | 404 OnPrinterDelete(task.printer_id); |
| 406 break; | 405 break; |
| 407 default: | 406 default: |
| 408 NOTREACHED(); | 407 NOTREACHED(); |
| 409 } | 408 } |
| 410 } | 409 } |
| 411 | 410 |
| 411 void CloudPrintConnector::ContinuePendingTaskProcessing() { |
| 412 if (pending_tasks_.size() == 0) |
| 413 return; // No pending tasks. |
| 414 |
| 415 // Delete current task and repost if we have more task available. |
| 416 pending_tasks_.pop_front(); |
| 417 if (pending_tasks_.size() != 0) { |
| 418 MessageLoop::current()->PostTask( |
| 419 FROM_HERE, base::Bind(&CloudPrintConnector::ProcessPendingTask, this)); |
| 420 } |
| 421 } |
| 422 |
| 412 void CloudPrintConnector::OnPrintersAvailable() { | 423 void CloudPrintConnector::OnPrintersAvailable() { |
| 413 GURL printer_list_url = | 424 GURL printer_list_url = |
| 414 CloudPrintHelpers::GetUrlForPrinterList(cloud_print_server_url_, | 425 CloudPrintHelpers::GetUrlForPrinterList(cloud_print_server_url_, |
| 415 proxy_id_); | 426 proxy_id_); |
| 416 StartGetRequest(printer_list_url, | 427 StartGetRequest(printer_list_url, |
| 417 kCloudPrintRegisterMaxRetryCount, | 428 kCloudPrintRegisterMaxRetryCount, |
| 418 &CloudPrintConnector::HandlePrinterListResponse); | 429 &CloudPrintConnector::HandlePrinterListResponse); |
| 419 } | 430 } |
| 420 | 431 |
| 421 void CloudPrintConnector::OnPrinterRegister( | 432 void CloudPrintConnector::OnPrinterRegister( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 448 // TODO(gene): We probably should not try indefinitely here. Just once or | 459 // TODO(gene): We probably should not try indefinitely here. Just once or |
| 449 // twice should be enough. | 460 // twice should be enough. |
| 450 // Bug: http://code.google.com/p/chromium/issues/detail?id=101850 | 461 // Bug: http://code.google.com/p/chromium/issues/detail?id=101850 |
| 451 GURL url = CloudPrintHelpers::GetUrlForPrinterDelete(cloud_print_server_url_, | 462 GURL url = CloudPrintHelpers::GetUrlForPrinterDelete(cloud_print_server_url_, |
| 452 printer_id); | 463 printer_id); |
| 453 StartGetRequest(url, | 464 StartGetRequest(url, |
| 454 kCloudPrintAPIMaxRetryCount, | 465 kCloudPrintAPIMaxRetryCount, |
| 455 &CloudPrintConnector::HandlePrinterDeleteResponse); | 466 &CloudPrintConnector::HandlePrinterDeleteResponse); |
| 456 } | 467 } |
| 457 | 468 |
| 458 void CloudPrintConnector::ContinuePendingTaskProcessing() { | |
| 459 if (pending_tasks_.size() == 0) | |
| 460 return; // No pending tasks. | |
| 461 | |
| 462 // Delete current task and repost if we have more task available. | |
| 463 pending_tasks_.pop_front(); | |
| 464 if (pending_tasks_.size() != 0) { | |
| 465 MessageLoop::current()->PostTask( | |
| 466 FROM_HERE, base::Bind(&CloudPrintConnector::ProcessPendingTask, this)); | |
| 467 } | |
| 468 } | |
| 469 | |
| 470 void CloudPrintConnector::OnReceivePrinterCaps( | 469 void CloudPrintConnector::OnReceivePrinterCaps( |
| 471 bool succeeded, | 470 bool succeeded, |
| 472 const std::string& printer_name, | 471 const std::string& printer_name, |
| 473 const printing::PrinterCapsAndDefaults& caps_and_defaults) { | 472 const printing::PrinterCapsAndDefaults& caps_and_defaults) { |
| 474 if (!IsRunning()) | 473 if (!IsRunning()) |
| 475 return; // Orphant call. | 474 return; // Orphant call. |
| 476 DCHECK(pending_tasks_.size() > 0 && | 475 DCHECK(pending_tasks_.size() > 0 && |
| 477 pending_tasks_.front().type == PENDING_PRINTER_REGISTER); | 476 pending_tasks_.front().type == PENDING_PRINTER_REGISTER); |
| 478 | 477 |
| 479 if (!succeeded) { | 478 if (!succeeded) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 mime_type, | 535 mime_type, |
| 537 post_data, | 536 post_data, |
| 538 &CloudPrintConnector::HandleRegisterPrinterResponse); | 537 &CloudPrintConnector::HandleRegisterPrinterResponse); |
| 539 } | 538 } |
| 540 | 539 |
| 541 bool CloudPrintConnector::IsSamePrinter(const std::string& name1, | 540 bool CloudPrintConnector::IsSamePrinter(const std::string& name1, |
| 542 const std::string& name2) const { | 541 const std::string& name2) const { |
| 543 return (0 == base::strcasecmp(name1.c_str(), name2.c_str())); | 542 return (0 == base::strcasecmp(name1.c_str(), name2.c_str())); |
| 544 } | 543 } |
| 545 | 544 |
| OLD | NEW |