Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / printing / printing_context_linux.cc
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 scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
31   return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate));
32 }
33
34 PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
35     : PrintingContext(delegate), print_dialog_(NULL) {
36 }
37
38 PrintingContextLinux::~PrintingContextLinux() {
39   ReleaseContext();
40
41   if (print_dialog_)
42     print_dialog_->ReleaseDialog();
43 }
44
45 // static
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
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
62 void PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) {
63   DCHECK(print_dialog_);
64   print_dialog_->PrintDocument(metafile, document_name_);
65 }
66
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
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
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
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
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