Home | History | Annotate | Download | only in printing
      1 // Copyright 2014 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_linux.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/values.h"
      9 #include "printing/metafile.h"
     10 #include "printing/print_dialog_gtk_interface.h"
     11 #include "printing/print_job_constants.h"
     12 #include "printing/units.h"
     13 
     14 namespace {
     15 
     16 // Function pointer for creating print dialogs. |callback| is only used when
     17 // |show_dialog| is true.
     18 printing::PrintDialogGtkInterface* (*create_dialog_func_)(
     19     printing::PrintingContextLinux* context) = NULL;
     20 
     21 // Function pointer for determining paper size.
     22 gfx::Size (*get_pdf_paper_size_)(
     23     printing::PrintingContextLinux* context) = NULL;
     24 
     25 }  // namespace
     26 
     27 namespace printing {
     28 
     29 // static
     30 PrintingContext* PrintingContext::Create(const std::string& app_locale) {
     31   return static_cast<PrintingContext*>(new PrintingContextLinux(app_locale));
     32 }
     33 
     34 PrintingContextLinux::PrintingContextLinux(const std::string& app_locale)
     35     : PrintingContext(app_locale),
     36       print_dialog_(NULL) {
     37 }
     38 
     39 PrintingContextLinux::~PrintingContextLinux() {
     40   ReleaseContext();
     41 
     42   if (print_dialog_)
     43     print_dialog_->ReleaseDialog();
     44 }
     45 
     46 // static
     47 void PrintingContextLinux::SetCreatePrintDialogFunction(
     48     PrintDialogGtkInterface* (*create_dialog_func)(
     49         PrintingContextLinux* context)) {
     50   DCHECK(create_dialog_func);
     51   DCHECK(!create_dialog_func_);
     52   create_dialog_func_ = create_dialog_func;
     53 }
     54 
     55 // static
     56 void PrintingContextLinux::SetPdfPaperSizeFunction(
     57     gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) {
     58   DCHECK(get_pdf_paper_size);
     59   DCHECK(!get_pdf_paper_size_);
     60   get_pdf_paper_size_ = get_pdf_paper_size;
     61 }
     62 
     63 void PrintingContextLinux::PrintDocument(const Metafile* metafile) {
     64   DCHECK(print_dialog_);
     65   DCHECK(metafile);
     66   print_dialog_->PrintDocument(metafile, document_name_);
     67 }
     68 
     69 void PrintingContextLinux::AskUserForSettings(
     70     gfx::NativeView parent_view,
     71     int max_pages,
     72     bool has_selection,
     73     const PrintSettingsCallback& callback) {
     74   if (!print_dialog_) {
     75     // Can only get here if the renderer is sending bad messages.
     76     // http://crbug.com/341777
     77     NOTREACHED();
     78     callback.Run(FAILED);
     79     return;
     80   }
     81 
     82   print_dialog_->ShowDialog(parent_view, has_selection, callback);
     83 }
     84 
     85 PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
     86   DCHECK(!in_print_job_);
     87 
     88   ResetSettings();
     89 
     90   if (!create_dialog_func_)
     91     return OK;
     92 
     93   if (!print_dialog_) {
     94     print_dialog_ = create_dialog_func_(this);
     95     print_dialog_->AddRefToDialog();
     96   }
     97   print_dialog_->UseDefaultSettings();
     98 
     99   return OK;
    100 }
    101 
    102 gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
    103   if (get_pdf_paper_size_)
    104     return get_pdf_paper_size_(this);
    105 
    106   return gfx::Size();
    107 }
    108 
    109 PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings(
    110     bool external_preview) {
    111   DCHECK(!in_print_job_);
    112   DCHECK(!external_preview) << "Not implemented";
    113 
    114   if (!create_dialog_func_)
    115     return OK;
    116 
    117   if (!print_dialog_) {
    118     print_dialog_ = create_dialog_func_(this);
    119     print_dialog_->AddRefToDialog();
    120   }
    121 
    122   if (!print_dialog_->UpdateSettings(&settings_))
    123     return OnError();
    124 
    125   return OK;
    126 }
    127 
    128 PrintingContext::Result PrintingContextLinux::InitWithSettings(
    129     const PrintSettings& settings) {
    130   DCHECK(!in_print_job_);
    131 
    132   settings_ = settings;
    133 
    134   return OK;
    135 }
    136 
    137 PrintingContext::Result PrintingContextLinux::NewDocument(
    138     const base::string16& document_name) {
    139   DCHECK(!in_print_job_);
    140   in_print_job_ = true;
    141 
    142   document_name_ = document_name;
    143 
    144   return OK;
    145 }
    146 
    147 PrintingContext::Result PrintingContextLinux::NewPage() {
    148   if (abort_printing_)
    149     return CANCEL;
    150   DCHECK(in_print_job_);
    151 
    152   // Intentional No-op.
    153 
    154   return OK;
    155 }
    156 
    157 PrintingContext::Result PrintingContextLinux::PageDone() {
    158   if (abort_printing_)
    159     return CANCEL;
    160   DCHECK(in_print_job_);
    161 
    162   // Intentional No-op.
    163 
    164   return OK;
    165 }
    166 
    167 PrintingContext::Result PrintingContextLinux::DocumentDone() {
    168   if (abort_printing_)
    169     return CANCEL;
    170   DCHECK(in_print_job_);
    171 
    172   ResetSettings();
    173   return OK;
    174 }
    175 
    176 void PrintingContextLinux::Cancel() {
    177   abort_printing_ = true;
    178   in_print_job_ = false;
    179 }
    180 
    181 void PrintingContextLinux::ReleaseContext() {
    182   // Intentional No-op.
    183 }
    184 
    185 gfx::NativeDrawingContext PrintingContextLinux::context() const {
    186   // Intentional No-op.
    187   return NULL;
    188 }
    189 
    190 }  // namespace printing
    191