Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_proxy_backend.h" | 5 #include "chrome/service/cloud_print/cloud_print_proxy_backend.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/md5.h" | 8 #include "base/md5.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 283 proxy_id); | 283 proxy_id); |
| 284 } | 284 } |
| 285 } | 285 } |
| 286 } | 286 } |
| 287 | 287 |
| 288 void CloudPrintProxyBackend::Core::DoInitializeWithToken( | 288 void CloudPrintProxyBackend::Core::DoInitializeWithToken( |
| 289 const std::string cloud_print_token, | 289 const std::string cloud_print_token, |
| 290 const std::string cloud_print_xmpp_token, | 290 const std::string cloud_print_xmpp_token, |
| 291 const std::string email, const std::string& proxy_id) { | 291 const std::string email, const std::string& proxy_id) { |
| 292 DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop()); | 292 DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop()); |
| 293 LOG(INFO) << "CP_PROXY: Starting proxy, id: " << proxy_id; | |
| 293 | 294 |
| 294 print_system_ = | 295 print_system_ = |
| 295 cloud_print::PrintSystem::CreateInstance(print_system_settings_.get()); | 296 cloud_print::PrintSystem::CreateInstance(print_system_settings_.get()); |
| 296 if (!print_system_.get()) { | 297 if (!print_system_.get()) { |
| 297 NOTREACHED(); | 298 NOTREACHED(); |
| 298 return; // No print system available, fail initalization. | 299 return; // No print system available, fail initalization. |
| 299 } | 300 } |
| 300 | 301 |
| 301 // TODO(sanjeevr): Validate the tokens. | 302 // TODO(sanjeevr): Validate the tokens. |
| 302 auth_token_ = cloud_print_token; | 303 auth_token_ = cloud_print_token; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 332 | 333 |
| 333 void CloudPrintProxyBackend::Core::EndRegistration() { | 334 void CloudPrintProxyBackend::Core::EndRegistration() { |
| 334 request_.reset(); | 335 request_.reset(); |
| 335 if (new_printers_available_) { | 336 if (new_printers_available_) { |
| 336 new_printers_available_ = false; | 337 new_printers_available_ = false; |
| 337 StartRegistration(); | 338 StartRegistration(); |
| 338 } | 339 } |
| 339 } | 340 } |
| 340 | 341 |
| 341 void CloudPrintProxyBackend::Core::DoShutdown() { | 342 void CloudPrintProxyBackend::Core::DoShutdown() { |
| 343 LOG(INFO) << "CP_PROXY: Shutdown proxy."; | |
|
sanjeevr
2010/06/25 20:39:42
Trace proxy id here as well
| |
| 342 if (print_server_watcher_ != NULL) | 344 if (print_server_watcher_ != NULL) |
| 343 print_server_watcher_->StopWatching(); | 345 print_server_watcher_->StopWatching(); |
| 344 | 346 |
| 345 // Need to kill all running jobs. | 347 // Need to kill all running jobs. |
| 346 while (!job_handler_map_.empty()) { | 348 while (!job_handler_map_.empty()) { |
| 347 JobHandlerMap::iterator index = job_handler_map_.begin(); | 349 JobHandlerMap::iterator index = job_handler_map_.begin(); |
| 348 // Shutdown will call our OnPrinterJobHandlerShutdown method which will | 350 // Shutdown will call our OnPrinterJobHandlerShutdown method which will |
| 349 // remove this from the map. | 351 // remove this from the map. |
| 350 index->second->Shutdown(); | 352 index->second->Shutdown(); |
| 351 } | 353 } |
| 352 } | 354 } |
| 353 | 355 |
| 354 void CloudPrintProxyBackend::Core::DoRegisterSelectedPrinters( | 356 void CloudPrintProxyBackend::Core::DoRegisterSelectedPrinters( |
| 355 const cloud_print::PrinterList& printer_list) { | 357 const cloud_print::PrinterList& printer_list) { |
| 356 if (!print_system_.get()) | 358 if (!print_system_.get()) |
| 357 return; // No print system available. | 359 return; // No print system available. |
| 358 server_error_count_ = 0; | 360 server_error_count_ = 0; |
| 359 printer_list_.assign(printer_list.begin(), printer_list.end()); | 361 printer_list_.assign(printer_list.begin(), printer_list.end()); |
| 360 DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop()); | 362 DCHECK(MessageLoop::current() == backend_->core_thread_.message_loop()); |
| 361 next_upload_index_ = 0; | 363 next_upload_index_ = 0; |
| 362 RegisterNextPrinter(); | 364 RegisterNextPrinter(); |
| 363 } | 365 } |
| 364 | 366 |
| 365 void CloudPrintProxyBackend::Core::DoHandlePrinterNotification( | 367 void CloudPrintProxyBackend::Core::DoHandlePrinterNotification( |
| 366 const std::string& printer_id) { | 368 const std::string& printer_id) { |
| 369 LOG(INFO) << "CP_PROXY: Handle printer notification, id: " << printer_id; | |
| 367 JobHandlerMap::iterator index = job_handler_map_.find(printer_id); | 370 JobHandlerMap::iterator index = job_handler_map_.find(printer_id); |
| 368 if (index != job_handler_map_.end()) | 371 if (index != job_handler_map_.end()) |
| 369 index->second->NotifyJobAvailable(); | 372 index->second->NotifyJobAvailable(); |
| 370 } | 373 } |
| 371 | 374 |
| 372 void CloudPrintProxyBackend::Core::GetRegisteredPrinters() { | 375 void CloudPrintProxyBackend::Core::GetRegisteredPrinters() { |
| 373 request_.reset( | 376 request_.reset( |
| 374 new URLFetcher( | 377 new URLFetcher( |
| 375 CloudPrintHelpers::GetUrlForPrinterList(cloud_print_server_url_, | 378 CloudPrintHelpers::GetUrlForPrinterList(cloud_print_server_url_, |
| 376 proxy_id_), | 379 proxy_id_), |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 mime_boundary, | 414 mime_boundary, |
| 412 std::string() , &post_data); | 415 std::string() , &post_data); |
| 413 CloudPrintHelpers::AddMultipartValueForUpload( | 416 CloudPrintHelpers::AddMultipartValueForUpload( |
| 414 kPrinterStatusValue, StringPrintf("%d", info.printer_status), | 417 kPrinterStatusValue, StringPrintf("%d", info.printer_status), |
| 415 mime_boundary, std::string(), &post_data); | 418 mime_boundary, std::string(), &post_data); |
| 416 // Add printer options as tags. | 419 // Add printer options as tags. |
| 417 std::map<std::string, std::string>::const_iterator it; | 420 std::map<std::string, std::string>::const_iterator it; |
| 418 for (it = info.options.begin(); it != info.options.end(); ++it) { | 421 for (it = info.options.begin(); it != info.options.end(); ++it) { |
| 419 // TODO(gene) Escape '=' char from name. Warning for now. | 422 // TODO(gene) Escape '=' char from name. Warning for now. |
| 420 if (it->first.find('=') != std::string::npos) { | 423 if (it->first.find('=') != std::string::npos) { |
| 421 LOG(WARNING) << "CUPS option name contains '=' character"; | 424 LOG(WARNING) << "CP_PROXY: CUPS option name contains '=' character"; |
| 422 NOTREACHED(); | 425 NOTREACHED(); |
| 423 } | 426 } |
| 424 std::string msg(it->first); | 427 std::string msg(it->first); |
| 425 msg += "="; | 428 msg += "="; |
| 426 msg += it->second; | 429 msg += it->second; |
| 427 CloudPrintHelpers::AddMultipartValueForUpload( | 430 CloudPrintHelpers::AddMultipartValueForUpload( |
| 428 kPrinterTagValue, msg, mime_boundary, std::string(), &post_data); | 431 kPrinterTagValue, msg, mime_boundary, std::string(), &post_data); |
| 429 } | 432 } |
| 430 CloudPrintHelpers::AddMultipartValueForUpload( | 433 CloudPrintHelpers::AddMultipartValueForUpload( |
| 431 kPrinterCapsValue, last_uploaded_printer_info_.printer_capabilities, | 434 kPrinterCapsValue, last_uploaded_printer_info_.printer_capabilities, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 449 new URLFetcher( | 452 new URLFetcher( |
| 450 CloudPrintHelpers::GetUrlForPrinterRegistration( | 453 CloudPrintHelpers::GetUrlForPrinterRegistration( |
| 451 cloud_print_server_url_), | 454 cloud_print_server_url_), |
| 452 URLFetcher::POST, this)); | 455 URLFetcher::POST, this)); |
| 453 CloudPrintHelpers::PrepCloudPrintRequest(request_.get(), auth_token_); | 456 CloudPrintHelpers::PrepCloudPrintRequest(request_.get(), auth_token_); |
| 454 request_->set_upload_data(mime_type, post_data); | 457 request_->set_upload_data(mime_type, post_data); |
| 455 next_response_handler_ = | 458 next_response_handler_ = |
| 456 &CloudPrintProxyBackend::Core::HandleRegisterPrinterResponse; | 459 &CloudPrintProxyBackend::Core::HandleRegisterPrinterResponse; |
| 457 request_->Start(); | 460 request_->Start(); |
| 458 } else { | 461 } else { |
| 459 LOG(ERROR) << "CP: Failed to get printer info for: " << info.printer_name; | 462 LOG(ERROR) << "CP_PROXY: Failed to get printer info for: " << |
| 463 info.printer_name; | |
| 460 next_upload_index_++; | 464 next_upload_index_++; |
| 461 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(this, | 465 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(this, |
| 462 &CloudPrintProxyBackend::Core::RegisterNextPrinter)); | 466 &CloudPrintProxyBackend::Core::RegisterNextPrinter)); |
| 463 } | 467 } |
| 464 } else { | 468 } else { |
| 465 EndRegistration(); | 469 EndRegistration(); |
| 466 } | 470 } |
| 467 } | 471 } |
| 468 | 472 |
| 469 // URLFetcher::Delegate implementation. | 473 // URLFetcher::Delegate implementation. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 539 HandleServerError(NewRunnableMethod(this, &Core::GetRegisteredPrinters)); | 543 HandleServerError(NewRunnableMethod(this, &Core::GetRegisteredPrinters)); |
| 540 } | 544 } |
| 541 } | 545 } |
| 542 | 546 |
| 543 void CloudPrintProxyBackend::Core::InitJobHandlerForPrinter( | 547 void CloudPrintProxyBackend::Core::InitJobHandlerForPrinter( |
| 544 DictionaryValue* printer_data) { | 548 DictionaryValue* printer_data) { |
| 545 DCHECK(printer_data); | 549 DCHECK(printer_data); |
| 546 std::string printer_id; | 550 std::string printer_id; |
| 547 printer_data->GetString(kIdValue, &printer_id); | 551 printer_data->GetString(kIdValue, &printer_id); |
| 548 DCHECK(!printer_id.empty()); | 552 DCHECK(!printer_id.empty()); |
| 553 LOG(INFO) << "CP_PROXY: Init job handler for printer id: " << printer_id; | |
| 549 JobHandlerMap::iterator index = job_handler_map_.find(printer_id); | 554 JobHandlerMap::iterator index = job_handler_map_.find(printer_id); |
| 550 // We might already have a job handler for this printer | 555 // We might already have a job handler for this printer |
| 551 if (index == job_handler_map_.end()) { | 556 if (index == job_handler_map_.end()) { |
| 552 cloud_print::PrinterBasicInfo printer_info; | 557 cloud_print::PrinterBasicInfo printer_info; |
| 553 printer_data->GetString(kNameValue, &printer_info.printer_name); | 558 printer_data->GetString(kNameValue, &printer_info.printer_name); |
| 554 DCHECK(!printer_info.printer_name.empty()); | 559 DCHECK(!printer_info.printer_name.empty()); |
| 555 printer_data->GetString(UTF8ToWide(kPrinterDescValue), | 560 printer_data->GetString(UTF8ToWide(kPrinterDescValue), |
| 556 &printer_info.printer_description); | 561 &printer_info.printer_description); |
| 557 printer_data->GetInteger(UTF8ToWide(kPrinterStatusValue), | 562 printer_data->GetInteger(UTF8ToWide(kPrinterStatusValue), |
| 558 &printer_info.printer_status); | 563 &printer_info.printer_status); |
| 559 std::string caps_hash; | 564 std::string caps_hash; |
| 560 printer_data->GetString(kPrinterCapsHashValue, &caps_hash); | 565 printer_data->GetString(kPrinterCapsHashValue, &caps_hash); |
| 561 scoped_refptr<PrinterJobHandler> job_handler; | 566 scoped_refptr<PrinterJobHandler> job_handler; |
| 562 job_handler = new PrinterJobHandler(printer_info, printer_id, caps_hash, | 567 job_handler = new PrinterJobHandler(printer_info, printer_id, caps_hash, |
| 563 auth_token_, cloud_print_server_url_, | 568 auth_token_, cloud_print_server_url_, |
| 564 print_system_.get(), this); | 569 print_system_.get(), this); |
| 565 job_handler_map_[printer_id] = job_handler; | 570 job_handler_map_[printer_id] = job_handler; |
| 566 job_handler->Initialize(); | 571 job_handler->Initialize(); |
| 567 } | 572 } |
| 568 } | 573 } |
| 569 | 574 |
| 570 void CloudPrintProxyBackend::Core::HandleRegisterPrinterResponse( | 575 void CloudPrintProxyBackend::Core::HandleRegisterPrinterResponse( |
| 571 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 576 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
| 572 int response_code, const ResponseCookies& cookies, | 577 int response_code, const ResponseCookies& cookies, |
| 573 const std::string& data) { | 578 const std::string& data) { |
| 579 LOG(INFO) << "CP_PROXY: Handle register printer response, code: " << | |
| 580 response_code; | |
| 574 Task* next_task = | 581 Task* next_task = |
| 575 NewRunnableMethod(this, | 582 NewRunnableMethod(this, |
| 576 &CloudPrintProxyBackend::Core::RegisterNextPrinter); | 583 &CloudPrintProxyBackend::Core::RegisterNextPrinter); |
| 577 if (status.is_success() && (response_code == 200)) { | 584 if (status.is_success() && (response_code == 200)) { |
| 578 bool succeeded = false; | 585 bool succeeded = false; |
| 579 DictionaryValue* response_dict = NULL; | 586 DictionaryValue* response_dict = NULL; |
| 580 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); | 587 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); |
| 581 if (succeeded) { | 588 if (succeeded) { |
| 582 DCHECK(response_dict); | 589 DCHECK(response_dict); |
| 583 ListValue* printer_list = NULL; | 590 ListValue* printer_list = NULL; |
| 584 response_dict->GetList(kPrinterListValue, &printer_list); | 591 response_dict->GetList(kPrinterListValue, &printer_list); |
| 585 // There should be a "printers" value in the JSON | 592 // There should be a "printers" value in the JSON |
| 586 DCHECK(printer_list); | 593 DCHECK(printer_list); |
| 587 if (printer_list) { | 594 if (printer_list) { |
| 588 DictionaryValue* printer_data = NULL; | 595 DictionaryValue* printer_data = NULL; |
| 589 if (printer_list->GetDictionary(0, &printer_data)) { | 596 if (printer_list->GetDictionary(0, &printer_data)) { |
| 590 InitJobHandlerForPrinter(printer_data); | 597 InitJobHandlerForPrinter(printer_data); |
| 591 } | 598 } |
| 592 } | 599 } |
| 593 } | 600 } |
| 594 server_error_count_ = 0; | 601 server_error_count_ = 0; |
| 595 next_upload_index_++; | 602 next_upload_index_++; |
| 596 MessageLoop::current()->PostTask(FROM_HERE, next_task); | 603 MessageLoop::current()->PostTask(FROM_HERE, next_task); |
| 597 } else { | 604 } else { |
| 598 HandleServerError(next_task); | 605 HandleServerError(next_task); |
| 599 } | 606 } |
| 600 } | 607 } |
| 601 | 608 |
| 602 void CloudPrintProxyBackend::Core::HandleServerError(Task* task_to_retry) { | 609 void CloudPrintProxyBackend::Core::HandleServerError(Task* task_to_retry) { |
| 610 LOG(INFO) << "CP_PROXY: Server error."; | |
| 603 CloudPrintHelpers::HandleServerError( | 611 CloudPrintHelpers::HandleServerError( |
| 604 &server_error_count_, -1, kMaxRetryInterval, kBaseRetryInterval, | 612 &server_error_count_, -1, kMaxRetryInterval, kBaseRetryInterval, |
| 605 task_to_retry, NULL); | 613 task_to_retry, NULL); |
| 606 } | 614 } |
| 607 | 615 |
| 608 bool CloudPrintProxyBackend::Core::RemovePrinterFromList( | 616 bool CloudPrintProxyBackend::Core::RemovePrinterFromList( |
| 609 const std::string& printer_name) { | 617 const std::string& printer_name) { |
| 610 bool ret = false; | 618 bool ret = false; |
| 611 for (cloud_print::PrinterList::iterator index = printer_list_.begin(); | 619 for (cloud_print::PrinterList::iterator index = printer_list_.begin(); |
| 612 index != printer_list_.end(); index++) { | 620 index != printer_list_.end(); index++) { |
| 613 if (0 == base::strcasecmp(index->printer_name.c_str(), | 621 if (0 == base::strcasecmp(index->printer_name.c_str(), |
| 614 printer_name.c_str())) { | 622 printer_name.c_str())) { |
| 615 index = printer_list_.erase(index); | 623 index = printer_list_.erase(index); |
| 616 ret = true; | 624 ret = true; |
| 617 break; | 625 break; |
| 618 } | 626 } |
| 619 } | 627 } |
| 620 return ret; | 628 return ret; |
| 621 } | 629 } |
| 622 | 630 |
| 623 void CloudPrintProxyBackend::Core::OnNotificationStateChange( | 631 void CloudPrintProxyBackend::Core::OnNotificationStateChange( |
| 624 bool notification_enabled) {} | 632 bool notification_enabled) {} |
| 625 | 633 |
| 626 void CloudPrintProxyBackend::Core::OnIncomingNotification( | 634 void CloudPrintProxyBackend::Core::OnIncomingNotification( |
| 627 const IncomingNotificationData& notification_data) { | 635 const IncomingNotificationData& notification_data) { |
| 636 LOG(INFO) << "CP_PROXY: Incoming notification."; | |
| 628 if (0 == base::strcasecmp(kCloudPrintTalkServiceUrl, | 637 if (0 == base::strcasecmp(kCloudPrintTalkServiceUrl, |
| 629 notification_data.service_url.c_str())) { | 638 notification_data.service_url.c_str())) { |
| 630 backend_->core_thread_.message_loop()->PostTask( | 639 backend_->core_thread_.message_loop()->PostTask( |
| 631 FROM_HERE, | 640 FROM_HERE, |
| 632 NewRunnableMethod( | 641 NewRunnableMethod( |
| 633 this, &CloudPrintProxyBackend::Core::DoHandlePrinterNotification, | 642 this, &CloudPrintProxyBackend::Core::DoHandlePrinterNotification, |
| 634 notification_data.service_specific_data)); | 643 notification_data.service_specific_data)); |
| 635 } | 644 } |
| 636 } | 645 } |
| 637 | 646 |
| 638 void CloudPrintProxyBackend::Core::OnOutgoingNotification() {} | 647 void CloudPrintProxyBackend::Core::OnOutgoingNotification() {} |
| 639 | 648 |
| 640 // cloud_print::PrinterChangeNotifier::Delegate implementation | 649 // cloud_print::PrinterChangeNotifier::Delegate implementation |
| 641 void CloudPrintProxyBackend::Core::OnPrinterAdded() { | 650 void CloudPrintProxyBackend::Core::OnPrinterAdded() { |
| 642 if (request_.get()) { | 651 if (request_.get()) { |
| 643 new_printers_available_ = true; | 652 new_printers_available_ = true; |
| 644 } else { | 653 } else { |
| 645 StartRegistration(); | 654 StartRegistration(); |
| 646 } | 655 } |
| 647 } | 656 } |
| 648 | 657 |
| 649 // PrinterJobHandler::Delegate implementation | 658 // PrinterJobHandler::Delegate implementation |
| 650 void CloudPrintProxyBackend::Core::OnPrinterJobHandlerShutdown( | 659 void CloudPrintProxyBackend::Core::OnPrinterJobHandlerShutdown( |
| 651 PrinterJobHandler* job_handler, const std::string& printer_id) { | 660 PrinterJobHandler* job_handler, const std::string& printer_id) { |
| 661 LOG(INFO) << "CP_PROXY: Printer job handle shutdown, id " << printer_id; | |
| 652 job_handler_map_.erase(printer_id); | 662 job_handler_map_.erase(printer_id); |
| 653 } | 663 } |
| 654 | 664 |
| OLD | NEW |