15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "printing/printing_context_linux.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_dialog_gtk_interface.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_job_constants.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function pointer for creating print dialogs. |callback| is only used when 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |show_dialog| is true. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printing::PrintDialogGtkInterface* (*create_dialog_func_)( 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printing::PrintingContextLinux* context) = NULL; 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Function pointer for determining paper size. 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Size (*get_pdf_paper_size_)( 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printing::PrintingContextLinux* context) = NULL; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPrintingContextLinux::PrintingContextLinux(Delegate* delegate) 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : PrintingContext(delegate), print_dialog_(NULL) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContextLinux::~PrintingContextLinux() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseContext(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (print_dialog_) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->ReleaseDialog(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintingContextLinux::SetCreatePrintDialogFunction( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintDialogGtkInterface* (*create_dialog_func)( 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrintingContextLinux* context)) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(create_dialog_func); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!create_dialog_func_); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dialog_func_ = create_dialog_func; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintingContextLinux::SetPdfPaperSizeFunction( 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) { 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(get_pdf_paper_size); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!get_pdf_paper_size_); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_pdf_paper_size_ = get_pdf_paper_size; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(print_dialog_); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->PrintDocument(metafile, document_name_); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintingContextLinux::AskUserForSettings( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_pages, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_selection, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrintSettingsCallback& callback) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!print_dialog_) { 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Can only get here if the renderer is sending bad messages. 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // http://crbug.com/341777 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(FAILED); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print_dialog_->ShowDialog( 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->GetParentView(), has_selection, callback); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::UseDefaultSettings() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!create_dialog_func_) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return OK; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_dialog_) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_ = create_dialog_func_(this); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->AddRefToDialog(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->UseDefaultSettings(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() { 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (get_pdf_paper_size_) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return get_pdf_paper_size_(this); 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Size(); 1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings( 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool external_preview, 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool show_system_dialog) { 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!show_system_dialog); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(!external_preview) << "Not implemented"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!create_dialog_func_) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return OK; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_dialog_) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_ = create_dialog_func_(this); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->AddRefToDialog(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!print_dialog_->UpdateSettings(&settings_)) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OnError(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::InitWithSettings( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrintSettings& settings) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_ = settings; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::NewDocument( 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::string16& document_name) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = true; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_name_ = document_name; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::NewPage() { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::PageDone() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PrintingContext::Result PrintingContextLinux::DocumentDone() { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintingContextLinux::Cancel() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_printing_ = true; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = false; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintingContextLinux::ReleaseContext() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeDrawingContext PrintingContextLinux::context() const { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 191