Bug 154883 - Use session printing APIs on Mac OSX. r=pinkerton/sr=sfraser/a=asa

This commit is contained in:
ccarlen%netscape.com 2006-02-10 22:49:52 +00:00
Родитель d56281d5e3
Коммит e096b2864f
5 изменённых файлов: 143 добавлений и 106 удалений

Просмотреть файл

@ -39,7 +39,6 @@
*
* ***** END LICENSE BLOCK ***** */
#define PM_USE_SESSION_APIS 0
#include "nsDeviceContextSpecX.h"
#include "prmem.h"
@ -54,7 +53,7 @@
* @update dc 12/02/98
*/
nsDeviceContextSpecX::nsDeviceContextSpecX()
: mPrintingContext(0)
: mPrintSession(0)
, mPageFormat(kPMNoPageFormat)
, mPrintSettings(kPMNoPrintSettings)
, mSavedPort(0)
@ -81,19 +80,14 @@ NS_IMPL_ISUPPORTS2(nsDeviceContextSpecX, nsIDeviceContextSpec, nsIPrintingContex
NS_IMETHODIMP nsDeviceContextSpecX::Init(nsIPrintSettings* aPS, PRBool aIsPrintPreview)
{
nsresult rv;
OSStatus status;
if (!aIsPrintPreview) {
status = ::PMBegin();
if (status != noErr)
return NS_ERROR_FAILURE;
mBeganPrinting = PR_TRUE;
}
nsCOMPtr<nsIPrintSettingsX> printSettingsX(do_QueryInterface(aPS));
if (!printSettingsX)
return NS_ERROR_NO_INTERFACE;
rv = printSettingsX->GetNativePrintSession(&mPrintSession);
if (NS_FAILED(rv))
return rv;
rv = printSettingsX->GetPMPageFormat(&mPageFormat);
if (NS_FAILED(rv))
return rv;
@ -116,15 +110,6 @@ NS_IMETHODIMP nsDeviceContextSpecX::PrintManagerOpen(PRBool* aIsOpen)
*/
NS_IMETHODIMP nsDeviceContextSpecX::ClosePrintManager()
{
if (mPrintSettings != kPMNoPrintSettings)
::PMDisposePrintSettings(mPrintSettings);
if (mPageFormat != kPMNoPageFormat)
::PMDisposePageFormat(mPageFormat);
if (mBeganPrinting)
::PMEnd();
return NS_OK;
}
@ -138,7 +123,7 @@ NS_IMETHODIMP nsDeviceContextSpecX::BeginDocument(PRInt32 aStartPage,
status = ::PMSetLastPage(mPrintSettings, aEndPage, false);
NS_ASSERTION(status == noErr, "PMSetLastPage failed");
status = ::PMBeginDocument(mPrintSettings, mPageFormat, &mPrintingContext);
status = ::PMSessionBeginDocument(mPrintSession, mPrintSettings, mPageFormat);
if (status != noErr) return NS_ERROR_ABORT;
return NS_OK;
@ -146,8 +131,7 @@ NS_IMETHODIMP nsDeviceContextSpecX::BeginDocument(PRInt32 aStartPage,
NS_IMETHODIMP nsDeviceContextSpecX::EndDocument()
{
::PMEndDocument(mPrintingContext);
mPrintingContext = 0;
::PMSessionEndDocument(mPrintSession);
return NS_OK;
}
@ -158,38 +142,45 @@ NS_IMETHODIMP nsDeviceContextSpecX::AbortDocument()
NS_IMETHODIMP nsDeviceContextSpecX::BeginPage()
{
// see http://devworld.apple.com/techpubs/carbon/graphics/CarbonPrintingManager/Carbon_Printing_Manager/Functions/PMSessionBeginPage.html
OSStatus status = ::PMBeginPage(mPrintingContext, NULL);
OSStatus status = ::PMSessionBeginPage(mPrintSession, mPageFormat, NULL);
if (status != noErr) return NS_ERROR_ABORT;
::GetPort(&mSavedPort);
GrafPtr printingPort;
status = ::PMGetGrafPtr(mPrintingContext, &printingPort);
if (status != noErr) return NS_ERROR_ABORT;
::SetPort(printingPort);
void *graphicsContext;
status = ::PMSessionGetGraphicsContext(mPrintSession, kPMGraphicsContextQuickdraw, &graphicsContext);
if (status != noErr)
return NS_ERROR_ABORT;
::SetPort((CGrafPtr)graphicsContext);
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextSpecX::EndPage()
{
OSStatus status = ::PMEndPage(mPrintingContext);
OSStatus status = ::PMSessionEndPage(mPrintSession);
if (mSavedPort)
{
::SetPort(mSavedPort);
mSavedPort = 0;
}
if (status != noErr) return NS_ERROR_ABORT;
if (status != noErr)
return NS_ERROR_ABORT;
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextSpecX::GetPrinterResolution(double* aResolution)
{
PMPrinter printer;
OSStatus status = ::PMSessionGetCurrentPrinter(mPrintSession, &printer);
if (status != noErr)
return NS_ERROR_FAILURE;
PMResolution defaultResolution;
OSStatus status = ::PMGetPrinterResolution(kPMDefaultResolution, &defaultResolution);
if (status == noErr)
*aResolution = defaultResolution.hRes;
status = ::PMPrinterGetPrinterResolution(printer, kPMDefaultResolution, &defaultResolution);
if (status != noErr)
return NS_ERROR_FAILURE;
return (status == noErr ? NS_OK : NS_ERROR_FAILURE);
*aResolution = defaultResolution.hRes;
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextSpecX::GetPageRect(double* aTop, double* aLeft, double* aBottom, double* aRight)

Просмотреть файл

@ -103,7 +103,7 @@ protected:
protected:
PMPrintContext mPrintingContext; // printing context (non-session APIs)
PMPrintSession mPrintSession; // printing context.
PMPageFormat mPageFormat; // page format.
PMPrintSettings mPrintSettings; // print settings.
CGrafPtr mSavedPort; // saved graphics port.

Просмотреть файл

@ -36,7 +36,6 @@
*
* ***** END LICENSE BLOCK ***** */
#define PM_USE_SESSION_APIS 0
#include <PMApplication.h>
#include "nsCOMPtr.h"

Просмотреть файл

@ -38,6 +38,7 @@
* ***** END LICENSE BLOCK ***** */
#include "nsPrintSettingsX.h"
#include "nsIPrintSessionX.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
@ -80,9 +81,13 @@ nsPrintSettingsX::nsPrintSettingsX(const nsPrintSettingsX& src) :
nsPrintSettingsX::~nsPrintSettingsX()
{
if (mPageFormat != kPMNoPageFormat) {
::PMDisposePageFormat(mPageFormat);
::PMRelease(mPageFormat);
mPageFormat = kPMNoPageFormat;
}
if (mPrintSettings != kPMNoPrintSettings) {
::PMRelease(mPrintSettings);
mPrintSettings = kPMNoPrintSettings;
}
}
/** ---------------------------------------------------
@ -98,34 +103,34 @@ nsPrintSettingsX& nsPrintSettingsX::operator=(const nsPrintSettingsX& rhs)
OSStatus status;
if (mPageFormat != kPMNoPageFormat) {
::PMDisposePageFormat(mPageFormat);
::PMRelease(mPageFormat);
mPageFormat = kPMNoPageFormat;
}
if (rhs.mPageFormat != kPMNoPageFormat) {
PMPageFormat pageFormat;
status = ::PMNewPageFormat(&pageFormat);
status = ::PMCreatePageFormat(&pageFormat);
if (status == noErr) {
status = ::PMCopyPageFormat(rhs.mPageFormat, pageFormat);
if (status == noErr)
mPageFormat = pageFormat;
else
::PMDisposePageFormat(pageFormat);
::PMRelease(pageFormat);
}
}
if (mPrintSettings != kPMNoPrintSettings) {
::PMDisposePrintSettings(mPrintSettings);
::PMRelease(mPrintSettings);
mPrintSettings = kPMNoPrintSettings;
}
if (rhs.mPrintSettings != kPMNoPrintSettings) {
PMPrintSettings printSettings;
status = ::PMNewPrintSettings(&printSettings);
status = ::PMCreatePrintSettings(&printSettings);
if (status == noErr) {
status = ::PMCopyPrintSettings(rhs.mPrintSettings, printSettings);
if (status == noErr)
mPrintSettings = printSettings;
else
::PMDisposePrintSettings(printSettings);
::PMRelease(printSettings);
}
}
@ -137,25 +142,41 @@ nsPrintSettingsX& nsPrintSettingsX::operator=(const nsPrintSettingsX& rhs)
nsresult nsPrintSettingsX::Init()
{
OSStatus status;
PMPrintSession printSession = NULL;
status = ::PMCreateSession(&printSession);
status = ::PMNewPageFormat(&mPageFormat);
if (status != noErr)
return NS_ERROR_FAILURE;
status = ::PMNewPrintSettings(&mPrintSettings);
if (status != noErr)
return NS_ERROR_FAILURE;
status = ::PMBegin();
NS_ASSERTION(status == noErr, "Error from PMBegin()");
if (status == noErr) {
status = ::PMDefaultPageFormat(mPageFormat);
NS_ASSERTION(status == noErr, "Error from PMDefaultPageFormat()");
status = ::PMDefaultPrintSettings(mPrintSettings);
NS_ASSERTION(status == noErr, "Error from PMDefaultPrintSettings()");
::PMEnd();
// First, create a default page format
status = CreateDefaultPageFormat(printSession, mPageFormat);
// Then, if no error, create the default print settings
if (status == noErr) {
status = CreateDefaultPrintSettings(printSession, mPrintSettings);
}
OSStatus tempStatus = ::PMRelease(printSession);
if (status == noErr)
status = tempStatus;
}
return NS_OK;
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
}
/** ---------------------------------------------------
*/
NS_IMETHODIMP nsPrintSettingsX::GetNativePrintSession(PMPrintSession *aNativePrintSession)
{
NS_ENSURE_ARG_POINTER(aNativePrintSession);
*aNativePrintSession = nsnull;
nsCOMPtr<nsIPrintSession> printSession;
GetPrintSession(getter_AddRefs(printSession));
if (!printSession)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIPrintSessionX> printSessionX(do_QueryInterface(printSession));
if (!printSession)
return NS_ERROR_FAILURE;
return printSessionX->GetNativeSession(aNativePrintSession);
}
/** ---------------------------------------------------
@ -166,32 +187,25 @@ NS_IMETHODIMP nsPrintSettingsX::GetPMPageFormat(PMPageFormat *aPMPageFormat)
*aPMPageFormat = kPMNoPageFormat;
NS_ENSURE_STATE(mPageFormat != kPMNoPageFormat);
PMPageFormat pageFormat;
OSStatus status = ::PMNewPageFormat(&pageFormat);
if (status != noErr) return NS_ERROR_FAILURE;
status = ::PMCopyPageFormat(mPageFormat, pageFormat);
if (status != noErr) {
::PMDisposePageFormat(pageFormat);
return NS_ERROR_FAILURE;
}
*aPMPageFormat = pageFormat;
*aPMPageFormat = mPageFormat;
OSStatus status = noErr;
return NS_OK;
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
}
/** ---------------------------------------------------
*/
NS_IMETHODIMP nsPrintSettingsX::SetPMPageFormat(PMPageFormat aPMPageFormat)
{
NS_ENSURE_ARG(aPMPageFormat);
NS_ENSURE_STATE(mPageFormat != kPMNoPageFormat);
NS_ENSURE_ARG(aPMPageFormat);
OSErr status = ::PMCopyPageFormat(aPMPageFormat, mPageFormat);
if (status != noErr)
return NS_ERROR_FAILURE;
return NS_OK;
OSStatus status = ::PMRetain(aPMPageFormat);
if (status == noErr) {
if (mPageFormat)
status = ::PMRelease(mPageFormat);
mPageFormat = aPMPageFormat;
}
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
}
/** ---------------------------------------------------
@ -202,32 +216,25 @@ NS_IMETHODIMP nsPrintSettingsX::GetPMPrintSettings(PMPrintSettings *aPMPrintSett
*aPMPrintSettings = kPMNoPrintSettings;
NS_ENSURE_STATE(mPrintSettings != kPMNoPrintSettings);
PMPrintSettings printSettings;
OSStatus status = ::PMNewPrintSettings(&printSettings);
if (status != noErr) return NS_ERROR_FAILURE;
status = ::PMCopyPrintSettings(mPrintSettings, printSettings);
if (status != noErr) {
::PMDisposePrintSettings(printSettings);
return NS_ERROR_FAILURE;
}
*aPMPrintSettings = printSettings;
*aPMPrintSettings = mPrintSettings;
OSStatus status = noErr;
return NS_OK;
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
}
/** ---------------------------------------------------
*/
NS_IMETHODIMP nsPrintSettingsX::SetPMPrintSettings(PMPrintSettings aPMPrintSettings)
{
NS_ENSURE_ARG(aPMPrintSettings);
NS_ENSURE_STATE(mPrintSettings != kPMNoPrintSettings);
NS_ENSURE_ARG(aPMPrintSettings);
OSErr status = ::PMCopyPrintSettings(aPMPrintSettings, mPrintSettings);
if (status != noErr)
return NS_ERROR_FAILURE;
return NS_OK;
OSStatus status = ::PMRetain(aPMPrintSettings);
if (status == noErr) {
if (mPrintSettings)
status = ::PMRelease(mPageFormat);
mPrintSettings = aPMPrintSettings;
}
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
}
/** ---------------------------------------------------
@ -265,16 +272,15 @@ NS_IMETHODIMP nsPrintSettingsX::ReadPageFormatFromPrefs()
OSStatus status;
PMPageFormat newPageFormat = kPMNoPageFormat;
status = ::PMNewPageFormat(&newPageFormat);
if (status != noErr)
return NS_ERROR_FAILURE;
status = ::PMUnflattenPageFormat(decodedDataHandle, &newPageFormat);
if (status != noErr)
return NS_ERROR_FAILURE;
status = ::PMCopyPageFormat(newPageFormat, mPageFormat);
::PMDisposePageFormat(newPageFormat);
status = ::PMCreatePageFormat(&newPageFormat);
if (status == noErr) {
status = ::PMUnflattenPageFormat(decodedDataHandle, &newPageFormat);
if (status == noErr) {
if (mPageFormat)
status = ::PMRelease(mPageFormat);
mPageFormat = newPageFormat; // PMCreatePageFormat returned it with a refcnt of 1
}
}
return (status == noErr) ? NS_OK : NS_ERROR_FAILURE;
}
@ -335,3 +341,40 @@ NS_IMETHODIMP nsPrintSettingsX::_Assign(nsIPrintSettings *aPS)
return NS_OK;
}
//-------------------------------------------
OSStatus nsPrintSettingsX::CreateDefaultPageFormat(PMPrintSession aSession, PMPageFormat& outFormat)
{
OSStatus status;
PMPageFormat pageFormat;
outFormat = kPMNoPageFormat;
status = ::PMCreatePageFormat(&pageFormat);
if (status == noErr && pageFormat != kPMNoPageFormat) {
status = ::PMSessionDefaultPageFormat(aSession, pageFormat);
if (status == noErr) {
outFormat = pageFormat;
return NS_OK;
}
}
return status;
}
//-------------------------------------------
OSStatus nsPrintSettingsX::CreateDefaultPrintSettings(PMPrintSession aSession, PMPrintSettings& outSettings)
{
OSStatus status;
PMPrintSettings printSettings;
outSettings = kPMNoPrintSettings;
status = ::PMCreatePrintSettings(&printSettings);
if (status == noErr && printSettings != kPMNoPrintSettings) {
status = ::PMSessionDefaultPrintSettings(aSession, printSettings);
if (status == noErr) {
outSettings = printSettings;
return noErr;
}
}
return status;
}

Просмотреть файл

@ -48,6 +48,10 @@ protected:
nsresult _Clone(nsIPrintSettings **_retval);
nsresult _Assign(nsIPrintSettings *aPS);
// The out param has a ref count of 1 on return so caller needs to PMRelase() when done.
OSStatus CreateDefaultPageFormat(PMPrintSession aSession, PMPageFormat& outFormat);
OSStatus CreateDefaultPrintSettings(PMPrintSession aSession, PMPrintSettings& outSettings);
PMPageFormat mPageFormat;
PMPrintSettings mPrintSettings;