mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
307 lines
11 KiB
Java
307 lines
11 KiB
Java
/*
|
|
* This file is modified by Ivan Maidanski <ivmai@ivmaisoft.com>
|
|
* Project name: JCGO-SUNAWT (http://www.ivmaisoft.com/jcgo/)
|
|
*/
|
|
|
|
/*
|
|
* @(#)AwtPrintControl.java 1.27 03/01/23
|
|
*
|
|
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
|
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*/
|
|
|
|
package sun.awt.print;
|
|
|
|
import java.awt.*;
|
|
import java.io.*;
|
|
import java.security.*;
|
|
import java.util.*;
|
|
import java.awt.JobAttributes.*;
|
|
import java.awt.PageAttributes.*;
|
|
|
|
/**
|
|
* A class which presents a modal print dialog to the user.
|
|
*
|
|
* @version 1.27 01/23/03
|
|
* @author Amy Fowler
|
|
* @author David Mendenhall
|
|
*/
|
|
public class AwtPrintControl extends sun.awt.print.PrintControl {
|
|
|
|
private static String[] sortedPrinterList = null;
|
|
private static long lastPrinterListQueryMillis = 0;
|
|
private static final long QUERY_INTERVAL = 900000L; // 15 minutes
|
|
|
|
// The following Strings are maintained for backward-compatibility with
|
|
// Properties based print control.
|
|
private final static String DEST_PROP = "awt.print.destination";
|
|
private final static String PRINTER = "printer";
|
|
private final static String FILE = "file";
|
|
|
|
private final static String PRINTER_PROP = "awt.print.printer";
|
|
|
|
private final static String FILENAME_PROP = "awt.print.fileName";
|
|
|
|
private final static String NUMCOPIES_PROP = "awt.print.numCopies";
|
|
|
|
private final static String OPTIONS_PROP = "awt.print.options";
|
|
|
|
private final static String ORIENT_PROP = "awt.print.orientation";
|
|
private final static String PORTRAIT = "portrait";
|
|
private final static String LANDSCAPE = "landscape";
|
|
|
|
private final static String PAPERSIZE_PROP = "awt.print.paperSize";
|
|
private final static String LETTER = "letter";
|
|
private final static String LEGAL = "legal";
|
|
private final static String EXECUTIVE = "executive";
|
|
private final static String A4 = "a4";
|
|
|
|
private Properties props;
|
|
|
|
public AwtPrintControl(Frame dialogOwner, String doctitle,
|
|
JobAttributes jobAttributes,
|
|
PageAttributes pageAttributes) {
|
|
super(dialogOwner, doctitle, jobAttributes, pageAttributes);
|
|
}
|
|
public AwtPrintControl(Frame dialogOwner, String doctitle,
|
|
Properties props) {
|
|
super(dialogOwner, doctitle, null, null);
|
|
this.props = props;
|
|
translateInputProps();
|
|
}
|
|
|
|
public String getDefaultPrinterName() {
|
|
String defaultPrinter = "lp";
|
|
|
|
try {
|
|
final String[] cmd = new String[3];
|
|
String osName = System.getProperty("os.name");
|
|
cmd[1] = "-c";
|
|
if(osName.indexOf("Linux") != -1) {
|
|
cmd[0] = "/bin/sh";
|
|
cmd[2] =
|
|
"/usr/sbin/lpc status | grep : | sed -ne '1,1 s/://p'";
|
|
} else if (osName.equals("FreeBSD") || osName.equals("NetBSD") ||
|
|
osName.equals("OpenBSD") ||
|
|
osName.equals("DragonFly") || osName.equals("BSD/OS")) {
|
|
cmd[0] = "/bin/sh";
|
|
cmd[2] =
|
|
"/usr/sbin/lpc status all | grep : | sed -ne '1,1 s/://p'";
|
|
} else {
|
|
cmd[0] = "/usr/bin/sh";
|
|
cmd[2] =
|
|
"/usr/bin/lpstat -d|/usr/bin/expand|/usr/bin/cut -f4 -d' '";
|
|
}
|
|
Process lpstat;
|
|
try {
|
|
lpstat = (Process)AccessController.doPrivileged(
|
|
new PrivilegedExceptionAction() {
|
|
public Object run() throws IOException {
|
|
return Runtime.getRuntime().exec(cmd);
|
|
}
|
|
});
|
|
} catch (PrivilegedActionException e) {
|
|
throw (IOException)e.getException();
|
|
}
|
|
lpstat.waitFor();
|
|
if (lpstat.exitValue() == 0) {
|
|
InputStream stream = lpstat.getInputStream();
|
|
byte[] streamBytes = new byte[stream.available()];
|
|
stream.read(streamBytes);
|
|
defaultPrinter = new String(streamBytes).trim();
|
|
}
|
|
} catch (IOException e) {
|
|
// just return "lp"
|
|
} catch (InterruptedException e) {
|
|
// just return "lp"
|
|
}
|
|
return defaultPrinter;
|
|
}
|
|
|
|
public boolean getCapabilities(PrinterCapabilities capabilities) {
|
|
capabilities.setCapabilities(PrinterCapabilities.COLOR |
|
|
PrinterCapabilities.DUPLEX);
|
|
return true;
|
|
}
|
|
|
|
public void getPrinterList(final PrinterListUpdatable updatable) {
|
|
long currentTimeMillis = System.currentTimeMillis();
|
|
if (sortedPrinterList != null &&
|
|
currentTimeMillis - lastPrinterListQueryMillis < QUERY_INTERVAL) {
|
|
updatable.updatePrinterList(sortedPrinterList);
|
|
return;
|
|
}
|
|
|
|
lastPrinterListQueryMillis = currentTimeMillis;
|
|
|
|
new Thread(new Runnable() {
|
|
public void run() {
|
|
String[] sortedNames = null;
|
|
|
|
try {
|
|
final String[] cmd = new String[3];
|
|
String osName = System.getProperty("os.name");
|
|
cmd[1] = "-c";
|
|
if(osName.indexOf("Linux") != -1) {
|
|
cmd[0] = "/bin/sh";
|
|
cmd[2] =
|
|
"/usr/sbin/lpc status | grep : | sed -e 's/://'";
|
|
} else if (osName.equals("FreeBSD") ||
|
|
osName.equals("NetBSD") ||
|
|
osName.equals("OpenBSD") ||
|
|
osName.equals("DragonFly") ||
|
|
osName.equals("BSD/OS")) {
|
|
cmd[0] = "/bin/sh";
|
|
cmd[2] = "/usr/sbin/lpc status all | grep : |" +
|
|
" sed -ne '1,1 s/://p'";
|
|
} else {
|
|
cmd[0] = "/usr/bin/sh";
|
|
cmd[2] =
|
|
"/usr/bin/lpstat -v|/usr/bin/expand|" +
|
|
"/usr/bin/cut -f3 -d' '|/usr/bin/cut -f1 -d':'|" +
|
|
"/usr/bin/sort -u";
|
|
}
|
|
Process lpstat;
|
|
try {
|
|
lpstat = (Process)AccessController.doPrivileged(
|
|
new PrivilegedExceptionAction() {
|
|
public Object run() throws IOException {
|
|
return Runtime.getRuntime().exec(cmd);
|
|
}
|
|
});
|
|
} catch (PrivilegedActionException e) {
|
|
throw (IOException)e.getException();
|
|
}
|
|
lpstat.waitFor();
|
|
if (lpstat.exitValue() == 0) {
|
|
InputStream stream = lpstat.getInputStream();
|
|
byte[] streamBytes;
|
|
String stdout = "";
|
|
while (stream.available() > 0) {
|
|
streamBytes = new byte[stream.available()];
|
|
stream.read(streamBytes);
|
|
stdout = stdout + new String(streamBytes);
|
|
}
|
|
StringTokenizer tokens =
|
|
new StringTokenizer(stdout);
|
|
int total = tokens.countTokens();
|
|
sortedNames = new String[total];
|
|
for (int i = 0; i < total; i++) {
|
|
sortedNames[i] = tokens.nextToken();
|
|
}
|
|
}
|
|
}
|
|
catch (IOException e) {
|
|
// just return null
|
|
} catch (InterruptedException e) {
|
|
// just return null
|
|
}
|
|
|
|
sortedPrinterList = sortedNames;
|
|
updatable.updatePrinterList(sortedPrinterList);
|
|
}
|
|
}).start();
|
|
}
|
|
|
|
private void translateInputProps() {
|
|
if (props == null) {
|
|
return;
|
|
}
|
|
|
|
String str;
|
|
|
|
str = props.getProperty(DEST_PROP);
|
|
if (str != null) {
|
|
if (str.equals(PRINTER)) {
|
|
setDestAttrib(DestinationType.PRINTER);
|
|
} else if (str.equals(FILE)) {
|
|
setDestAttrib(DestinationType.FILE);
|
|
}
|
|
}
|
|
str = props.getProperty(PRINTER_PROP);
|
|
if (str != null) {
|
|
setPrinterAttrib(str);
|
|
}
|
|
str = props.getProperty(FILENAME_PROP);
|
|
if (str != null) {
|
|
setFileNameAttrib(str);
|
|
}
|
|
str = props.getProperty(NUMCOPIES_PROP);
|
|
if (str != null) {
|
|
setCopiesAttrib(Integer.parseInt(str));
|
|
}
|
|
str = props.getProperty(OPTIONS_PROP);
|
|
if (str != null) {
|
|
setOptions(str);
|
|
}
|
|
str = props.getProperty(ORIENT_PROP);
|
|
if (str != null) {
|
|
if (str.equals(PORTRAIT)) {
|
|
setOrientAttrib(OrientationRequestedType.PORTRAIT);
|
|
} else if (str.equals(LANDSCAPE)) {
|
|
setOrientAttrib(OrientationRequestedType.LANDSCAPE);
|
|
}
|
|
}
|
|
str = props.getProperty(PAPERSIZE_PROP);
|
|
if (str != null) {
|
|
if (str.equals(LETTER)) {
|
|
setMediaAttrib(MediaType.LETTER.hashCode());
|
|
} else if (str.equals(LEGAL)) {
|
|
setMediaAttrib(MediaType.LEGAL.hashCode());
|
|
} else if (str.equals(EXECUTIVE)) {
|
|
setMediaAttrib(MediaType.EXECUTIVE.hashCode());
|
|
} else if (str.equals(A4)) {
|
|
setMediaAttrib(MediaType.A4.hashCode());
|
|
}
|
|
}
|
|
}
|
|
|
|
private void translateOutputProps() {
|
|
if (props == null) {
|
|
return;
|
|
}
|
|
|
|
String str;
|
|
|
|
props.setProperty(DEST_PROP,
|
|
(getDestAttrib() == DestinationType.PRINTER) ? PRINTER : FILE);
|
|
str = getPrinterAttrib();
|
|
if (str != null && !str.equals("")) {
|
|
props.setProperty(PRINTER_PROP, getPrinterAttrib());
|
|
}
|
|
str = getFileNameAttrib();
|
|
if (str != null && !str.equals("")) {
|
|
props.setProperty(FILENAME_PROP, str);
|
|
}
|
|
int copies = getCopiesAttrib();
|
|
if (copies > 0) {
|
|
props.setProperty(NUMCOPIES_PROP, "" + copies);
|
|
}
|
|
str = getOptions();
|
|
if (str != null && !str.equals("")) {
|
|
props.setProperty(OPTIONS_PROP, str);
|
|
}
|
|
props.setProperty(ORIENT_PROP,
|
|
(getOrientAttrib() == OrientationRequestedType.PORTRAIT)
|
|
? PORTRAIT : LANDSCAPE);
|
|
MediaType media = sun.awt.print.PrintControl.SIZES[getMediaAttrib()];
|
|
if (media == MediaType.LETTER) {
|
|
str = LETTER;
|
|
} else if (media == MediaType.LEGAL) {
|
|
str = LEGAL;
|
|
} else if (media == MediaType.EXECUTIVE) {
|
|
str = EXECUTIVE;
|
|
} else if (media == MediaType.A4) {
|
|
str = A4;
|
|
} else {
|
|
str = media.toString();
|
|
}
|
|
props.setProperty(PAPERSIZE_PROP, str);
|
|
}
|
|
|
|
protected void createAttributes(PrintDialog dialog) {
|
|
super.createAttributes(dialog);
|
|
translateOutputProps();
|
|
}
|
|
}
|