| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/browser/local_discovery/privet_http_impl.h" | 5 #include "chrome/browser/local_discovery/privet_http_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/rand_util.h" | 12 #include "base/rand_util.h" |
| 13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "chrome/browser/local_discovery/privet_constants.h" | 15 #include "chrome/browser/local_discovery/privet_constants.h" |
| 16 #include "net/base/url_util.h" | 16 #include "net/base/url_util.h" |
| 17 #include "url/gurl.h" | 17 #include "url/gurl.h" |
| 18 | 18 |
| 19 #if defined(ENABLE_PRINT_PREVIEW) | 19 #if defined(ENABLE_PRINT_PREVIEW) |
| 20 #include "chrome/browser/local_discovery/pwg_raster_converter.h" | 20 #include "chrome/browser/local_discovery/pwg_raster_converter.h" |
| 21 #include "components/cloud_devices/common/printer_description.h" | 21 #include "components/cloud_devices/common/printer_description.h" |
| 22 #include "printing/pdf_render_settings.h" | 22 #include "printing/pdf_render_settings.h" |
| 23 #include "printing/pwg_raster_settings.h" | 23 #include "printing/pwg_raster_settings.h" |
| 24 #include "printing/units.h" | |
| 25 #include "ui/gfx/geometry/rect.h" | |
| 26 #include "ui/gfx/text_elider.h" | 24 #include "ui/gfx/text_elider.h" |
| 27 #endif // ENABLE_PRINT_PREVIEW | 25 #endif // ENABLE_PRINT_PREVIEW |
| 28 | 26 |
| 29 namespace cloud_print { | 27 namespace cloud_print { |
| 30 extern const char kContentTypeJSON[]; | 28 extern const char kContentTypeJSON[]; |
| 31 } | 29 } |
| 32 | 30 |
| 33 namespace local_discovery { | 31 namespace local_discovery { |
| 34 | 32 |
| 35 namespace { | 33 namespace { |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 #if defined(ENABLE_PRINT_PREVIEW) | 390 #if defined(ENABLE_PRINT_PREVIEW) |
| 393 PrivetLocalPrintOperationImpl::PrivetLocalPrintOperationImpl( | 391 PrivetLocalPrintOperationImpl::PrivetLocalPrintOperationImpl( |
| 394 PrivetHTTPClient* privet_client, | 392 PrivetHTTPClient* privet_client, |
| 395 PrivetLocalPrintOperation::Delegate* delegate) | 393 PrivetLocalPrintOperation::Delegate* delegate) |
| 396 : privet_client_(privet_client), | 394 : privet_client_(privet_client), |
| 397 delegate_(delegate), | 395 delegate_(delegate), |
| 398 use_pdf_(false), | 396 use_pdf_(false), |
| 399 has_extended_workflow_(false), | 397 has_extended_workflow_(false), |
| 400 started_(false), | 398 started_(false), |
| 401 offline_(false), | 399 offline_(false), |
| 402 dpi_(printing::kDefaultPdfDpi), | |
| 403 invalid_job_retries_(0), | 400 invalid_job_retries_(0), |
| 404 weak_factory_(this) { | 401 weak_factory_(this) { |
| 405 } | 402 } |
| 406 | 403 |
| 407 PrivetLocalPrintOperationImpl::~PrivetLocalPrintOperationImpl() { | 404 PrivetLocalPrintOperationImpl::~PrivetLocalPrintOperationImpl() { |
| 408 } | 405 } |
| 409 | 406 |
| 410 void PrivetLocalPrintOperationImpl::Start() { | 407 void PrivetLocalPrintOperationImpl::Start() { |
| 411 DCHECK(!started_); | 408 DCHECK(!started_); |
| 412 | 409 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 } | 442 } |
| 446 | 443 |
| 447 StartInitialRequest(); | 444 StartInitialRequest(); |
| 448 } else { | 445 } else { |
| 449 delegate_->OnPrivetPrintingError(this, -1); | 446 delegate_->OnPrivetPrintingError(this, -1); |
| 450 } | 447 } |
| 451 } | 448 } |
| 452 | 449 |
| 453 void PrivetLocalPrintOperationImpl::StartInitialRequest() { | 450 void PrivetLocalPrintOperationImpl::StartInitialRequest() { |
| 454 use_pdf_ = false; | 451 use_pdf_ = false; |
| 455 using namespace cloud_devices::printer; | 452 cloud_devices::printer::ContentTypesCapability content_types; |
| 456 ContentTypesCapability content_types; | |
| 457 if (content_types.LoadFrom(capabilities_)) { | 453 if (content_types.LoadFrom(capabilities_)) { |
| 458 use_pdf_ = content_types.Contains(kPrivetContentTypePDF) || | 454 use_pdf_ = content_types.Contains(kPrivetContentTypePDF) || |
| 459 content_types.Contains(kPrivetContentTypeAny); | 455 content_types.Contains(kPrivetContentTypeAny); |
| 460 } | 456 } |
| 461 | 457 |
| 462 if (use_pdf_) { | 458 if (use_pdf_) { |
| 463 StartPrinting(); | 459 StartPrinting(); |
| 464 } else { | 460 } else { |
| 465 DpiCapability dpis; | |
| 466 if (dpis.LoadFrom(capabilities_)) { | |
| 467 dpi_ = std::max(dpis.GetDefault().horizontal, dpis.GetDefault().vertical); | |
| 468 } | |
| 469 StartConvertToPWG(); | 461 StartConvertToPWG(); |
| 470 } | 462 } |
| 471 } | 463 } |
| 472 | 464 |
| 473 void PrivetLocalPrintOperationImpl::DoCreatejob() { | 465 void PrivetLocalPrintOperationImpl::DoCreatejob() { |
| 474 current_response_ = base::Bind( | 466 current_response_ = base::Bind( |
| 475 &PrivetLocalPrintOperationImpl::OnCreatejobResponse, | 467 &PrivetLocalPrintOperationImpl::OnCreatejobResponse, |
| 476 base::Unretained(this)); | 468 base::Unretained(this)); |
| 477 | 469 |
| 478 url_fetcher_ = privet_client_->CreateURLFetcher( | 470 url_fetcher_ = privet_client_->CreateURLFetcher( |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 } | 531 } |
| 540 | 532 |
| 541 void PrivetLocalPrintOperationImpl::StartPrinting() { | 533 void PrivetLocalPrintOperationImpl::StartPrinting() { |
| 542 if (has_extended_workflow_ && jobid_.empty()) { | 534 if (has_extended_workflow_ && jobid_.empty()) { |
| 543 DoCreatejob(); | 535 DoCreatejob(); |
| 544 } else { | 536 } else { |
| 545 DoSubmitdoc(); | 537 DoSubmitdoc(); |
| 546 } | 538 } |
| 547 } | 539 } |
| 548 | 540 |
| 549 void PrivetLocalPrintOperationImpl::FillPwgRasterSettings( | |
| 550 printing::PwgRasterSettings* transform_settings) { | |
| 551 using namespace cloud_devices::printer; | |
| 552 PwgRasterConfigCapability raster_capability; | |
| 553 // If the raster capability fails to load, raster_capability will contain | |
| 554 // the default value. | |
| 555 raster_capability.LoadFrom(capabilities_); | |
| 556 | |
| 557 DuplexTicketItem duplex_item; | |
| 558 DuplexType duplex_value = NO_DUPLEX; | |
| 559 | |
| 560 DocumentSheetBack document_sheet_back = | |
| 561 raster_capability.value().document_sheet_back; | |
| 562 | |
| 563 if (duplex_item.LoadFrom(ticket_)) { | |
| 564 duplex_value = duplex_item.value(); | |
| 565 } | |
| 566 | |
| 567 transform_settings->odd_page_transform = printing::TRANSFORM_NORMAL; | |
| 568 switch (duplex_value) { | |
| 569 case NO_DUPLEX: | |
| 570 transform_settings->odd_page_transform = printing::TRANSFORM_NORMAL; | |
| 571 break; | |
| 572 case LONG_EDGE: | |
| 573 if (document_sheet_back == ROTATED) { | |
| 574 transform_settings->odd_page_transform = printing::TRANSFORM_ROTATE_180; | |
| 575 } else if (document_sheet_back == FLIPPED) { | |
| 576 transform_settings->odd_page_transform = | |
| 577 printing::TRANSFORM_FLIP_VERTICAL; | |
| 578 } | |
| 579 break; | |
| 580 case SHORT_EDGE: | |
| 581 if (document_sheet_back == MANUAL_TUMBLE) { | |
| 582 transform_settings->odd_page_transform = printing::TRANSFORM_ROTATE_180; | |
| 583 } else if (document_sheet_back == FLIPPED) { | |
| 584 transform_settings->odd_page_transform = | |
| 585 printing::TRANSFORM_FLIP_HORIZONTAL; | |
| 586 } | |
| 587 } | |
| 588 | |
| 589 transform_settings->rotate_all_pages = | |
| 590 raster_capability.value().rotate_all_pages; | |
| 591 | |
| 592 transform_settings->reverse_page_order = | |
| 593 raster_capability.value().reverse_order_streaming; | |
| 594 } | |
| 595 | |
| 596 void PrivetLocalPrintOperationImpl::StartConvertToPWG() { | 541 void PrivetLocalPrintOperationImpl::StartConvertToPWG() { |
| 597 printing::PwgRasterSettings transform_settings; | |
| 598 | |
| 599 FillPwgRasterSettings(&transform_settings); | |
| 600 | |
| 601 if (!pwg_raster_converter_) | 542 if (!pwg_raster_converter_) |
| 602 pwg_raster_converter_ = PWGRasterConverter::CreateDefault(); | 543 pwg_raster_converter_ = PWGRasterConverter::CreateDefault(); |
| 603 | 544 |
| 604 double scale = dpi_; | |
| 605 scale /= printing::kPointsPerInch; | |
| 606 // Make vertical rectangle to optimize streaming to printer. Fix orientation | |
| 607 // by autorotate. | |
| 608 gfx::Rect area(std::min(page_size_.width(), page_size_.height()) * scale, | |
| 609 std::max(page_size_.width(), page_size_.height()) * scale); | |
| 610 pwg_raster_converter_->Start( | 545 pwg_raster_converter_->Start( |
| 611 data_.get(), | 546 data_.get(), |
| 612 printing::PdfRenderSettings(area, dpi_, true), | 547 PWGRasterConverter::GetConversionSettings(capabilities_, page_size_), |
| 613 transform_settings, | 548 PWGRasterConverter::GetBitmapSettings(capabilities_, ticket_), |
| 614 base::Bind(&PrivetLocalPrintOperationImpl::OnPWGRasterConverted, | 549 base::Bind(&PrivetLocalPrintOperationImpl::OnPWGRasterConverted, |
| 615 base::Unretained(this))); | 550 base::Unretained(this))); |
| 616 } | 551 } |
| 617 | 552 |
| 618 void PrivetLocalPrintOperationImpl::OnSubmitdocResponse( | 553 void PrivetLocalPrintOperationImpl::OnSubmitdocResponse( |
| 619 bool has_error, | 554 bool has_error, |
| 620 const base::DictionaryValue* value) { | 555 const base::DictionaryValue* value) { |
| 621 std::string error; | 556 std::string error; |
| 622 // This error is only relevant in the case of extended workflow: | 557 // This error is only relevant in the case of extended workflow: |
| 623 // If the print job ID is invalid, retry createjob and submitdoc, | 558 // If the print job ID is invalid, retry createjob and submitdoc, |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 PrivetLocalPrintOperation::Delegate* delegate) { | 791 PrivetLocalPrintOperation::Delegate* delegate) { |
| 857 #if defined(ENABLE_PRINT_PREVIEW) | 792 #if defined(ENABLE_PRINT_PREVIEW) |
| 858 return scoped_ptr<PrivetLocalPrintOperation>( | 793 return scoped_ptr<PrivetLocalPrintOperation>( |
| 859 new PrivetLocalPrintOperationImpl(info_client(), delegate)); | 794 new PrivetLocalPrintOperationImpl(info_client(), delegate)); |
| 860 #else | 795 #else |
| 861 return scoped_ptr<PrivetLocalPrintOperation>(); | 796 return scoped_ptr<PrivetLocalPrintOperation>(); |
| 862 #endif // ENABLE_PRINT_PREVIEW | 797 #endif // ENABLE_PRINT_PREVIEW |
| 863 } | 798 } |
| 864 | 799 |
| 865 } // namespace local_discovery | 800 } // namespace local_discovery |
| OLD | NEW |