Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
ScriptablePrinting.c
/* |
** File: ScriptablePrinting.c |
** |
** Functions defined in Technote 11xx |
** |
** Copyright 1999 Apple Computer. All rights reserved. |
** |
** You may incorporate this sample code into your applications without |
** restriction, though the sample code has been provided "AS IS" and the |
** responsibility for its operation is 100% yours. However, what you are |
** not permitted to do is to redistribute the source as "DSC Sample Code" |
** after having made changes. If you're going to re-distribute the source, |
** we require that you make it clear in the source that the code was |
** descended from Apple Sample Code, but that you've made changes. |
*/ |
#include <Printing.h> |
#include <AppleEvents.h> |
#include "ScriptablePrinting.h" |
#include "ExtendPrintRecord.h" |
#include "CoercePrGeneral.h" |
OSStatus getPrintRecordFromEvent(const AppleEvent *inAppleEvent, |
THPrint *hPrintP) |
/* Given a print event Apple Event descriptor inAppleEvent, |
look for the optional print setting parameter. |
If this parameter exists, then coerce it into a print |
record and place the handle to the print record into |
*hPrintP. If the optional parameter does not exist |
or it cannot be converted, then a non-zero error code |
is returned and *hPrintP is set to NULL |
*/ |
{ |
OSStatus err = noErr; |
AEDesc optionalDesc = {}; |
AEDesc printRecordDesc = {}; |
AECoercionHandlerUPP handler = NULL; |
long refCon; |
Boolean typeIsDesc; |
PrOpen(); |
err = PrError(); |
if(err == noErr) { |
err = AEGetParamDesc(inAppleEvent, keyAEPropData, typeAERecord, &optionalDesc); |
if (err == noErr) { |
// if you want to call PrGeneral directly, comment out this call, |
// and set err to errAEHandlerNotFound. This will simulate the |
// case when Desktop Printing is not running, so the coercion |
// handler has not been loaded. See the Technote for more details. |
err = AEGetCoercionHandler(typeAERecord, kPrintRecordAEType, |
&handler, &refCon, &typeIsDesc, true); |
if (err == noErr) { |
err = AECoerceDesc(&optionalDesc, kPrintRecordAEType, &printRecordDesc); |
} else if (err == errAEHandlerNotFound) { |
/* If desktop printing is not enabled, |
the handler won't be installed. This |
is not fatal, since we can call the |
driver's PrGeneral call directly. |
It's better to use the coercion handler, |
but if we can't find it, this is a |
good fallback to use |
*/ |
PrCoerceStruct coerceData; |
coerceData.iOpCode = kPrCoerceOp; |
coerceData.iError = noErr; |
coerceData.lReserved = 0; |
coerceData.fromDesc = &optionalDesc; |
coerceData.toType = kPrintRecordAEType; |
coerceData.toDesc = &printRecordDesc; |
PrGeneral((Ptr)&coerceData); |
err = coerceData.iError; |
} |
} |
} |
if (err == noErr) { |
OSErr tempErr; |
*hPrintP = (THPrint) printRecordDesc.dataHandle; |
err = HandToHand((Handle *)hPrintP); |
tempErr = AEDisposeDesc(&printRecordDesc); |
if (err == noErr) err = tempErr; |
} else { |
*hPrintP = NULL; |
} |
err = AEDisposeDesc(&optionalDesc); |
PrClose(); |
return err; |
} |
OSStatus getPrintJobPrintRec(THPrint docPrintRec, |
THPrint settingsPrintRec, |
THPrint *jobPrintRecP) |
/* The caller passes in the print record stored with a |
document, docPrintRec, as well as the print record |
obtained from the print event, settingsPrintRec. |
This function creates a new print record that combines |
the formatting information from docPrintRec with |
the print time settings in settingsPrintRec and |
places the new print record into *jobPrintRecP. |
On entry, settingsPrintRec can be NULL in which |
case docPrintRec is duplicated and returned in |
*jobPrintRecP. In either case, if a new print |
record can not be created, this function sets |
*jobPrintRecP to NULL and returns a non-zero error |
code. |
*/ |
{ |
OSStatus err = noErr; |
THPrint jobPrintRec = docPrintRec; |
err = HandToHand((Handle *)&jobPrintRec); |
if ((err == noErr) && (settingsPrintRec != NULL)) { |
/* Both print records must be extended when |
calling PrJobMerge in order to get a full |
merge. The scripted print settings print |
record is extended by the coercion so |
nothing need be done to it here. |
*/ |
err = extendPrValidate(docPrintRec); // from TN 1161 |
if (err == noErr) { |
PrJobMerge(settingsPrintRec, jobPrintRec); |
err = PrError(); |
} |
} else { |
jobPrintRec = NULL; |
} |
if (err != noErr) { |
if (jobPrintRec != NULL) { |
DisposeHandle((Handle) jobPrintRec); |
jobPrintRec = NULL; |
} |
} |
*jobPrintRecP = jobPrintRec; |
return err; |
} |
OSStatus getPrintJobShowDialog(const AppleEvent *inAppleEvent, |
Boolean *showDialog) |
/* Given a print Apple Event, look for the optional parameter |
saying whether or not the application should show the |
PrJobDialog. While an apple event with the "print settings" |
parameter COULD have most of the items that will be needed |
to print the job, it's possible that the user or scripter |
will want to present the dialog to handle printer-specific |
settings. An application should not prevent the user from |
doing so, so this function is needed. The application should |
default to showing the dialog if the parameter is not |
specified. |
*/ |
{ |
OSStatus err = noErr; |
AEDesc showDesc = {}; |
err = AEGetParamDesc(inAppleEvent, kPrintDialogAEType, |
typeBoolean, &showDesc); |
if (err == noErr) { |
*showDialog = **(showDesc.dataHandle); |
} |
if (err == errAEDescNotFound) { |
/* not having the descriptor is okay. |
It just means we default to showing. |
*/ |
*showDialog = true; |
err = noErr; |
} |
return err; |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-03-26