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