15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printing_context_no_system_dialog.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unicode/ulocdata.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_job_constants.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return make_scoped_ptr<PrintingContext>( 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new PrintingContextNoSystemDialog(delegate)); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPrintingContextNoSystemDialog::PrintingContextNoSystemDialog(Delegate* delegate) 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : PrintingContext(delegate) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseContext(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextNoSystemDialog::AskUserForSettings( 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_pages, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_selection, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrintSettingsCallback& callback) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want to bring up a dialog here. Ever. Just signal the callback. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(OK); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::UseDefaultSettings() { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings_.set_dpi(kDefaultPdfDpi); 440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) gfx::Size physical_size = GetPdfPaperSizeDeviceUnits(); 450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Assume full page is printable for now. 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) gfx::Rect printable_area(0, 0, physical_size.width(), physical_size.height()); 470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK_EQ(settings_.device_units_per_inch(), kDefaultPdfDpi); 480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings_.SetPrinterPrintableArea(physical_size, printable_area, true); 490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return OK; 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)gfx::Size PrintingContextNoSystemDialog::GetPdfPaperSizeDeviceUnits() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t width = 0; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t height = 0; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UErrorCode error = U_ZERO_ERROR; 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ulocdata_getPaperSize( 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->GetAppLocale().c_str(), &height, &width, &error); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error > U_ZERO_ERROR) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the call failed, assume a paper size of 8.5 x 11 inches. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: " 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << error; 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) width = static_cast<int>( 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) kLetterWidthInch * settings_.device_units_per_inch()); 640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) height = static_cast<int>( 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) kLetterHeightInch * settings_.device_units_per_inch()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ulocdata_getPaperSize returns the width and height in mm. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert this to pixels based on the dpi. 690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) float multiplier = 100 * settings_.device_units_per_inch(); 700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) multiplier /= kHundrethsMMPerInch; 710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) width *= multiplier; 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) height *= multiplier; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return gfx::Size(width, height); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::UpdatePrinterSettings( 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool external_preview, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool show_system_dialog) { 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!show_system_dialog); 810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (settings_.dpi() == 0) 830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) UseDefaultSettings(); 840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::InitWithSettings( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrintSettings& settings) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_ = settings; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::NewDocument( 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::string16& document_name) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = true; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::NewPage() { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::PageDone() { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::DocumentDone() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextNoSystemDialog::Cancel() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_printing_ = true; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = false; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextNoSystemDialog::ReleaseContext() { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeDrawingContext PrintingContextNoSystemDialog::context() const { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 150