throw new PrintException("Printer is not accepting job.");
}
this.doc = doc;
/* check if the parameters are valid before doing much processing */
DocFlavor flavor = doc.getDocFlavor();
Object data;
try {
data = doc.getPrintData();
} catch (IOException e) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException("can't get print data: " + e.toString());
}
if (flavor == null || (!service.isDocFlavorSupported(flavor))) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintJobFlavorException("invalid flavor", flavor);
}
initializeAttributeSets(doc, attributes);
getAttributeValues(flavor);
// set up mOptions
if ((service instanceof IPPPrintService) &&
CUPSPrinter.isCupsRunning()) {
IPPPrintService.debug_println(debugPrefix+
"instanceof IPPPrintService");
if (mediaName != null) {
CustomMediaSizeName customMedia =
((IPPPrintService)service).findCustomMedia(mediaName);
if (customMedia != null) {
mOptions = " media="+ customMedia.getChoiceName();
}
}
if (customTray != null &&
customTray instanceof CustomMediaTray) {
String choice = customTray.getChoiceName();
if (choice != null) {
mOptions += " media="+choice;
}
}
if (nUp != null) {
mOptions += " number-up="+nUp.getValue();
}
if (orient == OrientationRequested.LANDSCAPE &&
(flavor != null) &&
!flavor.equals(DocFlavor.SERVICE_FORMATTED.PAGEABLE)) {
mOptions += " landscape";
}
if (sides != null) {
mOptions += " sides="+sides;
}
}
IPPPrintService.debug_println(debugPrefix+"mOptions "+mOptions);
String repClassName = flavor.getRepresentationClassName();
String val = flavor.getParameter("charset");
String encoding = "us-ascii";
if (val != null && !val.equals("")) {
encoding = val;
}
if (flavor.equals(DocFlavor.INPUT_STREAM.GIF) ||
flavor.equals(DocFlavor.INPUT_STREAM.JPEG) ||
flavor.equals(DocFlavor.INPUT_STREAM.PNG) ||
flavor.equals(DocFlavor.BYTE_ARRAY.GIF) ||
flavor.equals(DocFlavor.BYTE_ARRAY.JPEG) ||
flavor.equals(DocFlavor.BYTE_ARRAY.PNG)) {
try {
instream = doc.getStreamForBytes();
if (instream == null) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException("No stream for data");
}
if (!(service instanceof IPPPrintService &&
((IPPPrintService)service).isIPPSupportedImages(
flavor.getMimeType()))) {
printableJob(new ImagePrinter(instream));
((UnixPrintService)service).wakeNotifier();
return;
}
} catch (ClassCastException cce) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(cce);
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe);
}
} else if (flavor.equals(DocFlavor.URL.GIF) ||
flavor.equals(DocFlavor.URL.JPEG) ||
flavor.equals(DocFlavor.URL.PNG)) {
try {
URL url = (URL)data;
if ((service instanceof IPPPrintService) &&
((IPPPrintService)service).isIPPSupportedImages(
flavor.getMimeType())) {
instream = url.openStream();
} else {
printableJob(new ImagePrinter(url));
((UnixPrintService)service).wakeNotifier();
return;
}
} catch (ClassCastException cce) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(cce);
} catch (IOException e) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(e.toString());
}
} else if (flavor.equals(DocFlavor.CHAR_ARRAY.TEXT_PLAIN) ||
flavor.equals(DocFlavor.READER.TEXT_PLAIN) ||
flavor.equals(DocFlavor.STRING.TEXT_PLAIN)) {
try {
reader = doc.getReaderForText();
if (reader == null) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException("No reader for data");
}
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe.toString());
}
} else if (repClassName.equals("[B") ||
repClassName.equals("java.io.InputStream")) {
try {
instream = doc.getStreamForBytes();
if (instream == null) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException("No stream for data");
}
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe.toString());
}
} else if (repClassName.equals("java.net.URL")) {
/*
* This extracts the data from the URL and passes it the content
* directly to the print service as a file.
* This is appropriate for the current implementation where lp or
* lpr is always used to spool the data. We expect to revise the
* implementation to provide more complete IPP support (ie not just
* CUPS) and at that time the job will be spooled via IPP
* and the URL
* itself should be sent to the IPP print service not the content.
*/
URL url = (URL)data;
try {
instream = url.openStream();
} catch (IOException e) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(e.toString());
}
} else if (repClassName.equals("java.awt.print.Pageable")) {
try {
pageableJob((Pageable)doc.getPrintData());
if (service instanceof IPPPrintService) {
((IPPPrintService)service).wakeNotifier();
} else {
((UnixPrintService)service).wakeNotifier();
}
return;
} catch (ClassCastException cce) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(cce);
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe);
}
} else if (repClassName.equals("java.awt.print.Printable")) {
try {
printableJob((Printable)doc.getPrintData());
if (service instanceof IPPPrintService) {
((IPPPrintService)service).wakeNotifier();
} else {
((UnixPrintService)service).wakeNotifier();
}
return;
} catch (ClassCastException cce) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(cce);
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe);
}
} else {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException("unrecognized class: "+repClassName);
}
// now spool the print data.
PrinterOpener po = new PrinterOpener();
java.security.AccessController.doPrivileged(po);
if (po.pex != null) {
throw po.pex;
}
OutputStream output = po.result;
/* There are three cases:
* 1) Text data from a Reader, just pass through.
* 2) Text data from an input stream which we must read using the
* correct encoding
* 3) Raw byte data from an InputStream we don't interpret as text,
* just pass through: eg postscript.
*/
BufferedWriter bw = null;
if ((instream == null && reader != null)) {
BufferedReader br = new BufferedReader(reader);
OutputStreamWriter osw = new OutputStreamWriter(output);
bw = new BufferedWriter(osw);
char []buffer = new char[1024];
int cread;
try {
while ((cread = br.read(buffer, 0, buffer.length)) >=0) {
bw.write(buffer, 0, cread);
}
br.close();
bw.flush();
bw.close();
} catch (IOException e) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException (e);
}
} else if (instream != null &&
flavor.getMediaType().equalsIgnoreCase("text")) {
try {
InputStreamReader isr = new InputStreamReader(instream,
encoding);
BufferedReader br = new BufferedReader(isr);