mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
216 lines
7.6 KiB
Java
216 lines
7.6 KiB
Java
/*
|
|
* This file is modified by Ivan Maidanski <ivmai@ivmaisoft.com>
|
|
* Project name: JCGO-SUNAWT (http://www.ivmaisoft.com/jcgo/)
|
|
*/
|
|
|
|
/*
|
|
* @(#)Win32PrintServiceLookup.java 1.8 03/01/23
|
|
*
|
|
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
|
|
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*/
|
|
|
|
package sun.print;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.security.AccessController;
|
|
import java.security.PrivilegedActionException;
|
|
import java.security.PrivilegedExceptionAction;
|
|
import javax.print.DocFlavor;
|
|
import javax.print.MultiDocPrintService;
|
|
import javax.print.PrintService;
|
|
import javax.print.PrintServiceLookup;
|
|
import javax.print.attribute.Attribute;
|
|
import javax.print.attribute.AttributeSet;
|
|
import javax.print.attribute.HashPrintRequestAttributeSet;
|
|
import javax.print.attribute.HashPrintServiceAttributeSet;
|
|
import javax.print.attribute.PrintRequestAttribute;
|
|
import javax.print.attribute.PrintRequestAttributeSet;
|
|
import javax.print.attribute.PrintServiceAttribute;
|
|
import javax.print.attribute.PrintServiceAttributeSet;
|
|
import javax.print.attribute.standard.PrinterName;
|
|
|
|
public class Win32PrintServiceLookup extends PrintServiceLookup {
|
|
|
|
/* Remind: the current implementation is static, as its assumed
|
|
* its preferable to minimise creation of PrintService instances.
|
|
* Later we should add logic to add/remove services on the fly which
|
|
* will take a hit of needing to regather the list of services.
|
|
*/
|
|
private String defaultPrinter;
|
|
private PrintService defaultPrintService;
|
|
private String[] printers; /* excludes the default printer */
|
|
private PrintService[] printServices; /* includes the default printer */
|
|
|
|
static {
|
|
java.security.AccessController.doPrivileged(
|
|
new sun.security.action.LoadLibraryAction("awt"));
|
|
}
|
|
|
|
|
|
/* Want the PrintService which is default print service to have
|
|
* equality of reference with the equivalent in list of print services
|
|
* This isn't required by the API and there's a risk doing this will
|
|
* lead people to assume its guaranteed.
|
|
*/
|
|
public PrintService[] getPrintServices() {
|
|
SecurityManager security = System.getSecurityManager();
|
|
if (security != null) {
|
|
security.checkPrintJobAccess();
|
|
}
|
|
if (printServices == null) {
|
|
PrintService defService = getDefaultPrintService();
|
|
printers = getAllPrinterNames();
|
|
if (printers == null) {
|
|
return new PrintService[0];
|
|
}
|
|
printServices = new PrintService[printers.length];
|
|
for (int p=0; p<printers.length; p++) {
|
|
if (defService != null &&
|
|
printers[p].equals(defService.getName())) {
|
|
printServices[p] = defService;
|
|
} else {
|
|
printServices[p] = new Win32PrintService(printers[p]);
|
|
}
|
|
}
|
|
}
|
|
return printServices;
|
|
}
|
|
|
|
private synchronized PrintService getPrintServiceByName(String name) {
|
|
|
|
if (name == null || name.equals("")) {
|
|
return null;
|
|
} else if (printServices == null) {
|
|
String []allNames = getAllPrinterNames();
|
|
for (int i=0; i<allNames.length; i++) {
|
|
if (allNames[i].equals(name)) {
|
|
return new Win32PrintService(name);
|
|
}
|
|
}
|
|
return null;
|
|
} else {
|
|
for (int i=0; i<printServices.length; i++) {
|
|
if (printServices[i].getName().equals(name)) {
|
|
return printServices[i];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
boolean matchingService(PrintService service,
|
|
PrintServiceAttributeSet serviceSet) {
|
|
if (serviceSet != null) {
|
|
Attribute [] attrs = serviceSet.toArray();
|
|
Attribute serviceAttr;
|
|
for (int i=0; i<attrs.length; i++) {
|
|
serviceAttr = service.getAttribute(attrs[i].getCategory());
|
|
if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public PrintService[] getPrintServices(DocFlavor flavor,
|
|
AttributeSet attributes) {
|
|
|
|
SecurityManager security = System.getSecurityManager();
|
|
if (security != null) {
|
|
security.checkPrintJobAccess();
|
|
}
|
|
PrintRequestAttributeSet requestSet = null;
|
|
PrintServiceAttributeSet serviceSet = null;
|
|
|
|
if (attributes != null && !attributes.isEmpty()) {
|
|
|
|
requestSet = new HashPrintRequestAttributeSet();
|
|
serviceSet = new HashPrintServiceAttributeSet();
|
|
|
|
Attribute[] attrs = attributes.toArray();
|
|
for (int i=0; i<attrs.length; i++) {
|
|
if (attrs[i] instanceof PrintRequestAttribute) {
|
|
requestSet.add(attrs[i]);
|
|
} else if (attrs[i] instanceof PrintServiceAttribute) {
|
|
serviceSet.add(attrs[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Special case: If client is asking for a particular printer
|
|
* (by name) then we can save time by getting just that service
|
|
* to check against the rest of the specified attributes.
|
|
*/
|
|
PrintService[] services = null;
|
|
if (serviceSet != null && serviceSet.get(PrinterName.class) != null) {
|
|
PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
|
|
PrintService service = getPrintServiceByName(name.getValue());
|
|
if (service == null || !matchingService(service, serviceSet)) {
|
|
services = new PrintService[0];
|
|
} else {
|
|
services = new PrintService[1];
|
|
services[0] = service;
|
|
}
|
|
} else {
|
|
services = getPrintServices();
|
|
}
|
|
|
|
if (services.length == 0) {
|
|
return services;
|
|
} else {
|
|
ArrayList matchingServices = new ArrayList();
|
|
for (int i=0; i<services.length; i++) {
|
|
try {
|
|
if (services[i].
|
|
getUnsupportedAttributes(flavor, requestSet) == null) {
|
|
matchingServices.add(services[i]);
|
|
}
|
|
} catch (IllegalArgumentException e) {
|
|
}
|
|
}
|
|
services = new PrintService[matchingServices.size()];
|
|
return (PrintService[])matchingServices.toArray(services);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* return empty array as don't support multi docs
|
|
*/
|
|
public MultiDocPrintService[]
|
|
getMultiDocPrintServices(DocFlavor[] flavors,
|
|
AttributeSet attributes) {
|
|
SecurityManager security = System.getSecurityManager();
|
|
if (security != null) {
|
|
security.checkPrintJobAccess();
|
|
}
|
|
return new MultiDocPrintService[0];
|
|
}
|
|
|
|
|
|
public PrintService getDefaultPrintService() {
|
|
SecurityManager security = System.getSecurityManager();
|
|
if (security != null) {
|
|
security.checkPrintJobAccess();
|
|
}
|
|
if (defaultPrintService == null) {
|
|
defaultPrinter = getDefaultPrinterName();
|
|
if (defaultPrinter != null) {
|
|
defaultPrintService = new Win32PrintService(defaultPrinter);
|
|
}
|
|
}
|
|
return defaultPrintService;
|
|
}
|
|
|
|
private native String getDefaultPrinterName();
|
|
|
|
private native String[] getAllPrinterNames();
|
|
|
|
}
|