Home | History | Annotate | Download | only in printing
      1 // Copyright (c) 2011 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 #include "printing/printing_context_no_system_dialog.h"
      6 
      7 #include <unicode/ulocdata.h>
      8 
      9 #include "base/logging.h"
     10 #include "base/values.h"
     11 #include "printing/metafile.h"
     12 #include "printing/print_job_constants.h"
     13 #include "printing/units.h"
     14 
     15 namespace printing {
     16 
     17 // static
     18 PrintingContext* PrintingContext::Create(const std::string& app_locale) {
     19   return static_cast<PrintingContext*>(
     20       new PrintingContextNoSystemDialog(app_locale));
     21 }
     22 
     23 PrintingContextNoSystemDialog::PrintingContextNoSystemDialog(
     24     const std::string& app_locale) : PrintingContext(app_locale) {
     25 }
     26 
     27 PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() {
     28   ReleaseContext();
     29 }
     30 
     31 void PrintingContextNoSystemDialog::AskUserForSettings(
     32     gfx::NativeView parent_view,
     33     int max_pages,
     34     bool has_selection,
     35     const PrintSettingsCallback& callback) {
     36   // We don't want to bring up a dialog here.  Ever.  Just signal the callback.
     37   callback.Run(OK);
     38 }
     39 
     40 PrintingContext::Result PrintingContextNoSystemDialog::UseDefaultSettings() {
     41   DCHECK(!in_print_job_);
     42 
     43   ResetSettings();
     44   // TODO(abodenha): Fetch these settings from the OS where possible.  See
     45   // bug 102583.
     46   // TODO(sanjeevr): We need a better feedback loop between the cloud print
     47   // dialog and this code.
     48   int dpi = 300;
     49   gfx::Size physical_size_device_units;
     50   gfx::Rect printable_area_device_units;
     51   int32_t width = 0;
     52   int32_t height = 0;
     53   UErrorCode error = U_ZERO_ERROR;
     54   ulocdata_getPaperSize(app_locale_.c_str(), &height, &width, &error);
     55   if (error > U_ZERO_ERROR) {
     56     // If the call failed, assume a paper size of 8.5 x 11 inches.
     57     LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: "
     58                  << error;
     59     width = static_cast<int>(8.5 * dpi);
     60     height = static_cast<int>(11 * dpi);
     61   } else {
     62     // ulocdata_getPaperSize returns the width and height in mm.
     63     // Convert this to pixels based on the dpi.
     64     width = static_cast<int>(ConvertUnitDouble(width, 25.4, 1.0) * dpi);
     65     height = static_cast<int>(ConvertUnitDouble(height, 25.4, 1.0) * dpi);
     66   }
     67 
     68   physical_size_device_units.SetSize(width, height);
     69 
     70   // Assume full page is printable for now.
     71   printable_area_device_units.SetRect(0, 0, width, height);
     72 
     73   settings_.set_dpi(dpi);
     74   settings_.SetPrinterPrintableArea(physical_size_device_units,
     75                                     printable_area_device_units,
     76                                     dpi);
     77 
     78   return OK;
     79 }
     80 
     81 PrintingContext::Result PrintingContextNoSystemDialog::UpdatePrinterSettings(
     82     const base::DictionaryValue& job_settings, const PageRanges& ranges) {
     83   bool landscape = false;
     84 
     85   if (!job_settings.GetBoolean(kSettingLandscape, &landscape))
     86     return OnError();
     87 
     88   if (settings_.dpi() == 0)
     89     UseDefaultSettings();
     90 
     91   settings_.SetOrientation(landscape);
     92   settings_.ranges = ranges;
     93 
     94   return OK;
     95 }
     96 
     97 PrintingContext::Result PrintingContextNoSystemDialog::InitWithSettings(
     98     const PrintSettings& settings) {
     99   DCHECK(!in_print_job_);
    100 
    101   settings_ = settings;
    102 
    103   return OK;
    104 }
    105 
    106 PrintingContext::Result PrintingContextNoSystemDialog::NewDocument(
    107     const string16& document_name) {
    108   DCHECK(!in_print_job_);
    109   in_print_job_ = true;
    110 
    111   return OK;
    112 }
    113 
    114 PrintingContext::Result PrintingContextNoSystemDialog::NewPage() {
    115   if (abort_printing_)
    116     return CANCEL;
    117   DCHECK(in_print_job_);
    118 
    119   // Intentional No-op.
    120 
    121   return OK;
    122 }
    123 
    124 PrintingContext::Result PrintingContextNoSystemDialog::PageDone() {
    125   if (abort_printing_)
    126     return CANCEL;
    127   DCHECK(in_print_job_);
    128 
    129   // Intentional No-op.
    130 
    131   return OK;
    132 }
    133 
    134 PrintingContext::Result PrintingContextNoSystemDialog::DocumentDone() {
    135   if (abort_printing_)
    136     return CANCEL;
    137   DCHECK(in_print_job_);
    138 
    139   ResetSettings();
    140   return OK;
    141 }
    142 
    143 void PrintingContextNoSystemDialog::Cancel() {
    144   abort_printing_ = true;
    145   in_print_job_ = false;
    146 }
    147 
    148 void PrintingContextNoSystemDialog::ReleaseContext() {
    149   // Intentional No-op.
    150 }
    151 
    152 gfx::NativeDrawingContext PrintingContextNoSystemDialog::context() const {
    153   // Intentional No-op.
    154   return NULL;
    155 }
    156 
    157 }  // namespace printing
    158 
    159