2018-11-30 19:52:05 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2007-01-11 21:54:29 +00:00
|
|
|
|
|
|
|
#include "nsDeviceContextSpecX.h"
|
|
|
|
|
2020-05-28 15:36:44 +00:00
|
|
|
#import <Cocoa/Cocoa.h>
|
2022-12-19 15:42:48 +00:00
|
|
|
#include "mozilla/gfx/PrintPromise.h"
|
2020-05-28 15:36:44 +00:00
|
|
|
#include <CoreFoundation/CoreFoundation.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
2016-11-29 07:55:19 +00:00
|
|
|
#ifdef MOZ_ENABLE_SKIA_PDF
|
|
|
|
# include "mozilla/gfx/PrintTargetSkPDF.h"
|
|
|
|
#endif
|
2020-05-28 15:36:44 +00:00
|
|
|
#include "mozilla/gfx/PrintTargetCG.h"
|
|
|
|
#include "mozilla/Logging.h"
|
2016-11-29 07:55:19 +00:00
|
|
|
#include "mozilla/Preferences.h"
|
2016-04-19 10:28:12 +00:00
|
|
|
#include "mozilla/RefPtr.h"
|
2020-06-03 21:21:14 +00:00
|
|
|
#include "mozilla/Telemetry.h"
|
2020-05-28 15:36:44 +00:00
|
|
|
|
2020-07-31 08:31:06 +00:00
|
|
|
#include "AppleUtils.h"
|
2020-05-28 15:36:44 +00:00
|
|
|
#include "nsCocoaUtils.h"
|
2007-01-11 21:54:29 +00:00
|
|
|
#include "nsCRT.h"
|
2020-07-23 17:04:41 +00:00
|
|
|
#include "nsCUPSShim.h"
|
2016-11-29 07:55:19 +00:00
|
|
|
#include "nsDirectoryServiceDefs.h"
|
|
|
|
#include "nsILocalFileMac.h"
|
2022-03-30 18:51:58 +00:00
|
|
|
#include "nsIOutputStream.h"
|
2020-08-04 05:41:27 +00:00
|
|
|
#include "nsPaper.h"
|
2020-08-07 12:04:26 +00:00
|
|
|
#include "nsPrinterListCUPS.h"
|
2009-10-09 05:20:37 +00:00
|
|
|
#include "nsPrintSettingsX.h"
|
2020-05-28 15:36:44 +00:00
|
|
|
#include "nsQueryObject.h"
|
|
|
|
#include "prenv.h"
|
2007-01-11 21:54:29 +00:00
|
|
|
|
2013-01-15 12:22:03 +00:00
|
|
|
// This must be the last include:
|
|
|
|
#include "nsObjCExceptions.h"
|
|
|
|
|
2016-06-03 10:27:31 +00:00
|
|
|
using namespace mozilla;
|
2016-11-29 07:55:19 +00:00
|
|
|
using mozilla::gfx::IntSize;
|
2022-12-19 15:42:48 +00:00
|
|
|
using mozilla::gfx::PrintEndDocumentPromise;
|
2016-11-29 07:55:19 +00:00
|
|
|
using mozilla::gfx::PrintTarget;
|
|
|
|
using mozilla::gfx::PrintTargetCG;
|
|
|
|
#ifdef MOZ_ENABLE_SKIA_PDF
|
|
|
|
using mozilla::gfx::PrintTargetSkPDF;
|
|
|
|
#endif
|
2020-05-28 15:36:44 +00:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// nsDeviceContentSpecX
|
|
|
|
|
2022-03-30 18:51:58 +00:00
|
|
|
nsDeviceContextSpecX::nsDeviceContextSpecX() = default;
|
2007-01-11 21:54:29 +00:00
|
|
|
|
|
|
|
nsDeviceContextSpecX::~nsDeviceContextSpecX() {
|
2021-02-16 22:55:21 +00:00
|
|
|
NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2020-10-23 11:07:21 +00:00
|
|
|
if (mPrintSession) {
|
|
|
|
::PMRelease(mPrintSession);
|
|
|
|
}
|
|
|
|
if (mPageFormat) {
|
|
|
|
::PMRelease(mPageFormat);
|
|
|
|
}
|
2022-05-20 17:33:21 +00:00
|
|
|
if (mPMPrintSettings) {
|
|
|
|
::PMRelease(mPMPrintSettings);
|
2020-10-23 11:07:21 +00:00
|
|
|
}
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2021-02-16 22:55:21 +00:00
|
|
|
NS_OBJC_END_TRY_IGNORE_BLOCK;
|
2007-01-11 21:54:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-27 07:06:00 +00:00
|
|
|
NS_IMPL_ISUPPORTS(nsDeviceContextSpecX, nsIDeviceContextSpec)
|
2007-07-18 00:07:36 +00:00
|
|
|
|
2022-05-23 19:34:40 +00:00
|
|
|
NS_IMETHODIMP nsDeviceContextSpecX::Init(nsIPrintSettings* aPS, bool aIsPrintPreview) {
|
2021-02-16 22:55:20 +00:00
|
|
|
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2015-10-18 05:24:48 +00:00
|
|
|
RefPtr<nsPrintSettingsX> settings(do_QueryObject(aPS));
|
2020-10-23 11:07:21 +00:00
|
|
|
if (!settings) {
|
|
|
|
return NS_ERROR_NO_INTERFACE;
|
|
|
|
}
|
2022-05-20 17:33:21 +00:00
|
|
|
// Note: unlike other platforms, we don't set our base class's mPrintSettings
|
|
|
|
// here since we don't need it currently (we do set mPMPrintSettings below).
|
2007-01-27 04:06:59 +00:00
|
|
|
|
2020-10-23 11:07:46 +00:00
|
|
|
NSPrintInfo* printInfo = settings->CreateOrCopyPrintInfo();
|
2020-10-23 11:07:21 +00:00
|
|
|
if (!printInfo) {
|
|
|
|
return NS_ERROR_FAILURE;
|
2020-07-27 21:18:58 +00:00
|
|
|
}
|
2022-03-30 18:51:58 +00:00
|
|
|
if (aPS->GetOutputDestination() == nsIPrintSettings::kOutputDestinationStream) {
|
|
|
|
aPS->GetOutputStream(getter_AddRefs(mOutputStream));
|
|
|
|
if (!mOutputStream) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
}
|
2020-10-23 11:07:21 +00:00
|
|
|
mPrintSession = static_cast<PMPrintSession>([printInfo PMPrintSession]);
|
|
|
|
mPageFormat = static_cast<PMPageFormat>([printInfo PMPageFormat]);
|
2022-05-20 17:33:21 +00:00
|
|
|
mPMPrintSettings = static_cast<PMPrintSettings>([printInfo PMPrintSettings]);
|
|
|
|
MOZ_ASSERT(mPrintSession && mPageFormat && mPMPrintSettings);
|
2007-09-19 22:26:45 +00:00
|
|
|
::PMRetain(mPrintSession);
|
2020-10-23 11:07:21 +00:00
|
|
|
::PMRetain(mPageFormat);
|
2022-05-20 17:33:21 +00:00
|
|
|
::PMRetain(mPMPrintSettings);
|
2020-10-23 11:07:21 +00:00
|
|
|
[printInfo release];
|
2007-09-19 22:26:45 +00:00
|
|
|
|
2016-11-29 07:55:19 +00:00
|
|
|
#ifdef MOZ_ENABLE_SKIA_PDF
|
2017-07-31 04:23:50 +00:00
|
|
|
nsAutoString printViaPdf;
|
|
|
|
mozilla::Preferences::GetString("print.print_via_pdf_encoder", printViaPdf);
|
|
|
|
if (printViaPdf.EqualsLiteral("skia-pdf")) {
|
2016-11-29 07:55:19 +00:00
|
|
|
// Annoyingly, PMPrinterPrintWithFile does not pay attention to the
|
|
|
|
// kPMDestination* value set in the PMPrintSession; it always sends the PDF
|
|
|
|
// to the specified printer. This means that if we create the PDF using
|
|
|
|
// SkPDF then we need to manually handle user actions like "Open PDF in
|
|
|
|
// Preview" and "Save as PDF...".
|
|
|
|
// TODO: Currently we do not support using SkPDF for kPMDestinationFax or
|
|
|
|
// kPMDestinationProcessPDF ("Add PDF to iBooks, etc.), and we only support
|
|
|
|
// it for kPMDestinationFile if the destination file is a PDF.
|
|
|
|
// XXX Could PMWorkflowSubmitPDFWithSettings/PMPrinterPrintWithProvider help?
|
|
|
|
OSStatus status = noErr;
|
|
|
|
PMDestinationType destination;
|
2022-05-20 17:33:21 +00:00
|
|
|
status = ::PMSessionGetDestinationType(mPrintSession, mPMPrintSettings, &destination);
|
2016-11-29 07:55:19 +00:00
|
|
|
if (status == noErr) {
|
|
|
|
if (destination == kPMDestinationPrinter || destination == kPMDestinationPreview) {
|
|
|
|
mPrintViaSkPDF = true;
|
|
|
|
} else if (destination == kPMDestinationFile) {
|
2020-07-31 08:31:06 +00:00
|
|
|
AutoCFRelease<CFURLRef> destURL(nullptr);
|
2020-08-02 15:29:15 +00:00
|
|
|
status =
|
2022-05-20 17:33:21 +00:00
|
|
|
::PMSessionCopyDestinationLocation(mPrintSession, mPMPrintSettings, destURL.receive());
|
2016-11-29 07:55:19 +00:00
|
|
|
if (status == noErr) {
|
2020-08-02 15:29:15 +00:00
|
|
|
AutoCFRelease<CFStringRef> destPathRef =
|
|
|
|
CFURLCopyFileSystemPath(destURL, kCFURLPOSIXPathStyle);
|
2020-07-31 08:31:06 +00:00
|
|
|
NSString* destPath = (NSString*)CFStringRef(destPathRef);
|
2016-11-29 07:55:19 +00:00
|
|
|
NSString* destPathExt = [destPath pathExtension];
|
|
|
|
if ([destPathExt isEqualToString:@"pdf"]) {
|
|
|
|
mPrintViaSkPDF = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-03-30 18:51:58 +00:00
|
|
|
int16_t outputFormat = aPS->GetOutputFormat();
|
2020-06-03 21:21:14 +00:00
|
|
|
|
|
|
|
if (outputFormat == nsIPrintSettings::kOutputFormatPDF) {
|
|
|
|
// We don't actually currently support/use kOutputFormatPDF on mac, but
|
|
|
|
// this is for completeness in case we add that (we probably need to in
|
|
|
|
// order to support adding links into saved PDFs, for example).
|
|
|
|
Telemetry::ScalarAdd(Telemetry::ScalarID::PRINTING_TARGET_TYPE, u"pdf_file"_ns, 1);
|
|
|
|
} else {
|
|
|
|
PMDestinationType destination;
|
2022-05-20 17:33:21 +00:00
|
|
|
OSStatus status = ::PMSessionGetDestinationType(mPrintSession, mPMPrintSettings, &destination);
|
2020-06-03 21:21:14 +00:00
|
|
|
if (status == noErr &&
|
|
|
|
(destination == kPMDestinationFile || destination == kPMDestinationPreview ||
|
|
|
|
destination == kPMDestinationProcessPDF)) {
|
|
|
|
Telemetry::ScalarAdd(Telemetry::ScalarID::PRINTING_TARGET_TYPE, u"pdf_file"_ns, 1);
|
|
|
|
} else {
|
|
|
|
Telemetry::ScalarAdd(Telemetry::ScalarID::PRINTING_TARGET_TYPE, u"unknown"_ns, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-09-19 22:26:45 +00:00
|
|
|
return NS_OK;
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2021-02-16 22:55:20 +00:00
|
|
|
NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
|
2007-09-19 22:26:45 +00:00
|
|
|
}
|
2007-01-11 21:54:29 +00:00
|
|
|
|
2017-10-13 06:48:40 +00:00
|
|
|
NS_IMETHODIMP nsDeviceContextSpecX::BeginDocument(const nsAString& aTitle,
|
2016-01-05 10:08:57 +00:00
|
|
|
const nsAString& aPrintToFileName,
|
2017-10-13 06:48:40 +00:00
|
|
|
int32_t aStartPage, int32_t aEndPage) {
|
2021-02-16 22:55:20 +00:00
|
|
|
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
|
2017-10-13 06:48:40 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2021-02-16 22:55:20 +00:00
|
|
|
NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
|
2007-01-27 04:06:59 +00:00
|
|
|
}
|
|
|
|
|
2022-12-19 15:42:48 +00:00
|
|
|
RefPtr<PrintEndDocumentPromise> nsDeviceContextSpecX::EndDocument() {
|
|
|
|
return nsIDeviceContextSpec::EndDocumentPromiseFromResult(DoEndDocument(), __func__);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult nsDeviceContextSpecX::DoEndDocument() {
|
2021-02-16 22:55:20 +00:00
|
|
|
NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
|
2016-11-29 07:55:19 +00:00
|
|
|
|
|
|
|
#ifdef MOZ_ENABLE_SKIA_PDF
|
|
|
|
if (mPrintViaSkPDF) {
|
|
|
|
OSStatus status = noErr;
|
|
|
|
|
|
|
|
nsCOMPtr<nsILocalFileMac> tmpPDFFile = do_QueryInterface(mTempFile);
|
|
|
|
if (!tmpPDFFile) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2020-07-31 08:31:06 +00:00
|
|
|
AutoCFRelease<CFURLRef> pdfURL(nullptr);
|
|
|
|
// Note that the caller is responsible to release pdfURL according to nsILocalFileMac.idl,
|
|
|
|
// even though we didn't follow the Core Foundation naming conventions here (the method
|
|
|
|
// should've been called CopyCFURL).
|
|
|
|
nsresult rv = tmpPDFFile->GetCFURL(pdfURL.receive());
|
2016-11-29 07:55:19 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
PMDestinationType destination;
|
2022-05-20 17:33:21 +00:00
|
|
|
status = ::PMSessionGetDestinationType(mPrintSession, mPMPrintSettings, &destination);
|
2016-11-29 07:55:19 +00:00
|
|
|
|
|
|
|
switch (destination) {
|
|
|
|
case kPMDestinationPrinter: {
|
|
|
|
PMPrinter currentPrinter = NULL;
|
|
|
|
status = ::PMSessionGetCurrentPrinter(mPrintSession, ¤tPrinter);
|
|
|
|
if (status != noErr) {
|
|
|
|
return NS_ERROR_FAILURE;
|
2019-01-21 17:18:16 +00:00
|
|
|
}
|
2016-11-29 07:55:19 +00:00
|
|
|
CFStringRef mimeType = CFSTR("application/pdf");
|
2022-05-20 17:33:21 +00:00
|
|
|
status = ::PMPrinterPrintWithFile(currentPrinter, mPMPrintSettings, mPageFormat, mimeType,
|
|
|
|
pdfURL);
|
2019-01-21 17:18:16 +00:00
|
|
|
break;
|
2016-11-29 07:55:19 +00:00
|
|
|
}
|
|
|
|
case kPMDestinationPreview: {
|
|
|
|
// XXXjwatt Or should we use CocoaFileUtils::RevealFileInFinder(pdfURL);
|
2020-07-31 08:31:06 +00:00
|
|
|
AutoCFRelease<CFStringRef> pdfPath = CFURLCopyFileSystemPath(pdfURL, kCFURLPOSIXPathStyle);
|
|
|
|
NSString* path = (NSString*)CFStringRef(pdfPath);
|
2016-11-29 07:55:19 +00:00
|
|
|
NSWorkspace* ws = [NSWorkspace sharedWorkspace];
|
|
|
|
[ws openFile:path];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case kPMDestinationFile: {
|
2020-07-31 08:31:06 +00:00
|
|
|
AutoCFRelease<CFURLRef> destURL(nullptr);
|
2020-08-02 15:29:15 +00:00
|
|
|
status =
|
2022-05-20 17:33:21 +00:00
|
|
|
::PMSessionCopyDestinationLocation(mPrintSession, mPMPrintSettings, destURL.receive());
|
2016-11-29 07:55:19 +00:00
|
|
|
if (status == noErr) {
|
2020-08-02 15:29:15 +00:00
|
|
|
AutoCFRelease<CFStringRef> sourcePathRef =
|
|
|
|
CFURLCopyFileSystemPath(pdfURL, kCFURLPOSIXPathStyle);
|
2020-07-31 08:31:06 +00:00
|
|
|
NSString* sourcePath = (NSString*)CFStringRef(sourcePathRef);
|
2017-02-13 21:25:30 +00:00
|
|
|
# ifdef DEBUG
|
2020-08-02 15:29:15 +00:00
|
|
|
AutoCFRelease<CFStringRef> destPathRef =
|
|
|
|
CFURLCopyFileSystemPath(destURL, kCFURLPOSIXPathStyle);
|
2020-07-31 08:31:06 +00:00
|
|
|
NSString* destPath = (NSString*)CFStringRef(destPathRef);
|
2016-11-29 07:55:19 +00:00
|
|
|
NSString* destPathExt = [destPath pathExtension];
|
|
|
|
MOZ_ASSERT([destPathExt isEqualToString:@"pdf"],
|
|
|
|
"nsDeviceContextSpecX::Init only allows '.pdf' for now");
|
|
|
|
// We could use /usr/sbin/cupsfilter to convert the PDF to PS, but
|
|
|
|
// currently we don't.
|
|
|
|
# endif
|
|
|
|
NSFileManager* fileManager = [NSFileManager defaultManager];
|
|
|
|
if ([fileManager fileExistsAtPath:sourcePath]) {
|
2020-07-31 08:31:06 +00:00
|
|
|
NSURL* src = static_cast<NSURL*>(CFURLRef(pdfURL));
|
|
|
|
NSURL* dest = static_cast<NSURL*>(CFURLRef(destURL));
|
2016-11-29 07:55:19 +00:00
|
|
|
bool ok = [fileManager replaceItemAtURL:dest
|
|
|
|
withItemAtURL:src
|
|
|
|
backupItemName:nil
|
|
|
|
options:NSFileManagerItemReplacementUsingNewMetadataOnly
|
|
|
|
resultingItemURL:nil
|
|
|
|
error:nil];
|
|
|
|
if (!ok) {
|
|
|
|
return NS_ERROR_FAILURE;
|
2019-01-21 17:18:16 +00:00
|
|
|
}
|
2016-11-29 07:55:19 +00:00
|
|
|
}
|
|
|
|
}
|
2019-01-21 17:18:16 +00:00
|
|
|
break;
|
2016-11-29 07:55:19 +00:00
|
|
|
}
|
|
|
|
default:
|
|
|
|
MOZ_ASSERT_UNREACHABLE("nsDeviceContextSpecX::Init doesn't set "
|
|
|
|
"mPrintViaSkPDF for other values");
|
|
|
|
}
|
|
|
|
|
|
|
|
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-11-29 07:55:00 +00:00
|
|
|
return NS_OK;
|
2016-11-29 07:55:19 +00:00
|
|
|
|
2021-02-16 22:55:20 +00:00
|
|
|
NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
|
2007-01-27 04:06:59 +00:00
|
|
|
}
|
|
|
|
|
2008-03-19 20:51:42 +00:00
|
|
|
void nsDeviceContextSpecX::GetPaperRect(double* aTop, double* aLeft, double* aBottom,
|
|
|
|
double* aRight) {
|
2021-02-16 22:55:21 +00:00
|
|
|
NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2008-03-19 20:51:42 +00:00
|
|
|
PMRect paperRect;
|
|
|
|
::PMGetAdjustedPaperRect(mPageFormat, &paperRect);
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2017-03-28 04:26:25 +00:00
|
|
|
*aTop = paperRect.top;
|
|
|
|
*aLeft = paperRect.left;
|
|
|
|
*aBottom = paperRect.bottom;
|
|
|
|
*aRight = paperRect.right;
|
2008-02-19 20:58:01 +00:00
|
|
|
|
2021-02-16 22:55:21 +00:00
|
|
|
NS_OBJC_END_TRY_IGNORE_BLOCK;
|
2008-02-11 18:28:18 +00:00
|
|
|
}
|
|
|
|
|
2016-06-03 10:27:31 +00:00
|
|
|
already_AddRefed<PrintTarget> nsDeviceContextSpecX::MakePrintTarget() {
|
2007-01-11 21:54:29 +00:00
|
|
|
double top, left, bottom, right;
|
2008-03-19 20:51:42 +00:00
|
|
|
GetPaperRect(&top, &left, &bottom, &right);
|
2007-01-11 21:54:29 +00:00
|
|
|
const double width = right - left;
|
|
|
|
const double height = bottom - top;
|
2021-02-06 00:28:29 +00:00
|
|
|
IntSize size = IntSize::Ceil(width, height);
|
2007-01-11 21:54:29 +00:00
|
|
|
|
2016-11-29 07:55:19 +00:00
|
|
|
#ifdef MOZ_ENABLE_SKIA_PDF
|
|
|
|
if (mPrintViaSkPDF) {
|
2022-03-30 18:51:58 +00:00
|
|
|
// TODO: Add support for stream printing via SkPDF if we enable that again.
|
2016-11-29 07:55:19 +00:00
|
|
|
nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(mTempFile));
|
|
|
|
NS_ENSURE_SUCCESS(rv, nullptr);
|
|
|
|
nsAutoCString tempPath("tmp-printing.pdf");
|
|
|
|
mTempFile->AppendNative(tempPath);
|
|
|
|
rv = mTempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600);
|
|
|
|
NS_ENSURE_SUCCESS(rv, nullptr);
|
|
|
|
mTempFile->GetNativePath(tempPath);
|
|
|
|
auto stream = MakeUnique<SkFILEWStream>(tempPath.get());
|
2018-05-30 19:15:35 +00:00
|
|
|
return PrintTargetSkPDF::CreateOrNull(std::move(stream), size);
|
2016-11-29 07:55:19 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-05-20 17:33:21 +00:00
|
|
|
return PrintTargetCG::CreateOrNull(mOutputStream, mPrintSession, mPageFormat, mPMPrintSettings,
|
2022-03-30 18:51:58 +00:00
|
|
|
size);
|
2007-01-11 21:54:29 +00:00
|
|
|
}
|