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
Create(Delegate * delegate)30 scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
31 return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate));
32 }
33
PrintingContextLinux(Delegate * delegate)34 PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
35 : PrintingContext(delegate), print_dialog_(NULL) {
36 }
37
~PrintingContextLinux()38 PrintingContextLinux::~PrintingContextLinux() {
39 ReleaseContext();
40
41 if (print_dialog_)
42 print_dialog_->ReleaseDialog();
43 }
44
45 // static
SetCreatePrintDialogFunction(PrintDialogGtkInterface * (* create_dialog_func)(PrintingContextLinux * context))46 void PrintingContextLinux::SetCreatePrintDialogFunction(
47 PrintDialogGtkInterface* (*create_dialog_func)(
48 PrintingContextLinux* context)) {
49 DCHECK(create_dialog_func);
50 DCHECK(!create_dialog_func_);
51 create_dialog_func_ = create_dialog_func;
52 }
53
54 // static
SetPdfPaperSizeFunction(gfx::Size (* get_pdf_paper_size)(PrintingContextLinux * context))55 void PrintingContextLinux::SetPdfPaperSizeFunction(
56 gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) {
57 DCHECK(get_pdf_paper_size);
58 DCHECK(!get_pdf_paper_size_);
59 get_pdf_paper_size_ = get_pdf_paper_size;
60 }
61
PrintDocument(const MetafilePlayer & metafile)62 void PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) {
63 DCHECK(print_dialog_);
64 print_dialog_->PrintDocument(metafile, document_name_);
65 }
66
AskUserForSettings(int max_pages,bool has_selection,const PrintSettingsCallback & callback)67 void PrintingContextLinux::AskUserForSettings(
68 int max_pages,
69 bool has_selection,
70 const PrintSettingsCallback& callback) {
71 if (!print_dialog_) {
72 // Can only get here if the renderer is sending bad messages.
73 // http://crbug.com/341777
74 NOTREACHED();
75 callback.Run(FAILED);
76 return;
77 }
78
79 print_dialog_->ShowDialog(
80 delegate_->GetParentView(), has_selection, callback);
81 }
82
UseDefaultSettings()83 PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
84 DCHECK(!in_print_job_);
85
86 ResetSettings();
87
88 if (!create_dialog_func_)
89 return OK;
90
91 if (!print_dialog_) {
92 print_dialog_ = create_dialog_func_(this);
93 print_dialog_->AddRefToDialog();
94 }
95 print_dialog_->UseDefaultSettings();
96
97 return OK;
98 }
99
GetPdfPaperSizeDeviceUnits()100 gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
101 if (get_pdf_paper_size_)
102 return get_pdf_paper_size_(this);
103
104 return gfx::Size();
105 }
106
UpdatePrinterSettings(bool external_preview,bool show_system_dialog)107 PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings(
108 bool external_preview,
109 bool show_system_dialog) {
110 DCHECK(!show_system_dialog);
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
InitWithSettings(const PrintSettings & settings)128 PrintingContext::Result PrintingContextLinux::InitWithSettings(
129 const PrintSettings& settings) {
130 DCHECK(!in_print_job_);
131
132 settings_ = settings;
133
134 return OK;
135 }
136
NewDocument(const base::string16 & document_name)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
NewPage()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
PageDone()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
DocumentDone()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
Cancel()176 void PrintingContextLinux::Cancel() {
177 abort_printing_ = true;
178 in_print_job_ = false;
179 }
180
ReleaseContext()181 void PrintingContextLinux::ReleaseContext() {
182 // Intentional No-op.
183 }
184
context() const185 gfx::NativeDrawingContext PrintingContextLinux::context() const {
186 // Intentional No-op.
187 return NULL;
188 }
189
190 } // namespace printing
191