8055705: Rename UnixPrintServiceLookup and Win32PrintServiceLookup as a platform neutral class name
Reviewed-by: jgodinez, bae
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/META-INF/services/javax.print.PrintServiceLookup Fri Oct 10 09:03:28 2014 -0700
@@ -0,0 +1,2 @@
+# Provider for Java Print Service
+sun.print.PrintServiceLookupProvider
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/META-INF/services/javax.print.StreamPrintServiceFactory Fri Oct 10 09:03:28 2014 -0700
@@ -0,0 +1,2 @@
+# Provider for Java 2D Stream print services.
+sun.print.PSStreamPrinterFactory
--- a/jdk/src/java.desktop/unix/classes/META-INF/services/javax.print.PrintServiceLookup Fri Oct 10 16:07:18 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Provider for Java Print Service
-sun.print.UnixPrintServiceLookup
--- a/jdk/src/java.desktop/unix/classes/META-INF/services/javax.print.StreamPrintServiceFactory Fri Oct 10 16:07:18 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Provider for Java 2D Stream print services.
-sun.print.PSStreamPrinterFactory
--- a/jdk/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java Fri Oct 10 16:07:18 2014 +0400
+++ b/jdk/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java Fri Oct 10 09:03:28 2014 -0700
@@ -324,8 +324,8 @@
* reported, exec lpstat -d which has all the Apple
* special behaviour for this built in.
*/
- if (UnixPrintServiceLookup.isMac()) {
- printerInfo[0] = UnixPrintServiceLookup.
+ if (PrintServiceLookupProvider.isMac()) {
+ printerInfo[0] = PrintServiceLookupProvider.
getDefaultPrinterNameSysV();
printerInfo[1] = null;
return printerInfo.clone();
--- a/jdk/src/java.desktop/unix/classes/sun/print/IPPPrintService.java Fri Oct 10 16:07:18 2014 +0400
+++ b/jdk/src/java.desktop/unix/classes/sun/print/IPPPrintService.java Fri Oct 10 09:03:28 2014 -0700
@@ -1045,7 +1045,7 @@
setting like collation. Therefore, we temporarily exclude
Linux.
*/
- if (!UnixPrintServiceLookup.isLinux()) {
+ if (!PrintServiceLookupProvider.isLinux()) {
catList.add(SheetCollate.class);
}
}
@@ -1637,7 +1637,7 @@
* Mac is using printer-info IPP attribute for its human-readable printer
* name and is also the identifier used in NSPrintInfo:setPrinter.
*/
- if (UnixPrintServiceLookup.isMac()) {
+ if (PrintServiceLookupProvider.isMac()) {
PrintServiceAttributeSet psaSet = this.getAttributes();
if (psaSet != null) {
PrinterInfo pName = (PrinterInfo)psaSet.get(PrinterInfo.class);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java Fri Oct 10 09:03:28 2014 -0700
@@ -0,0 +1,964 @@
+/*
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.print;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Vector;
+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;
+import javax.print.attribute.standard.PrinterURI;
+import java.io.File;
+import java.io.FileReader;
+import java.net.URL;
+import java.nio.file.Files;
+
+/*
+ * Remind: This class uses solaris commands. We also need a linux
+ * version
+ */
+public class PrintServiceLookupProvider extends PrintServiceLookup
+ implements BackgroundServiceLookup, Runnable {
+
+ /* Remind: the current implementation is static, as its assumed
+ * its preferable to minimize 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 PrintService[] printServices; /* includes the default printer */
+ private Vector<BackgroundLookupListener> lookupListeners = null;
+ private static String debugPrefix = "PrintServiceLookupProvider>> ";
+ private static boolean pollServices = true;
+ private static final int DEFAULT_MINREFRESH = 120; // 2 minutes
+ private static int minRefreshTime = DEFAULT_MINREFRESH;
+
+
+ static String osname;
+
+ // List of commands used to deal with the printer queues on AIX
+ String[] lpNameComAix = {
+ "/usr/bin/lsallq",
+ "/usr/bin/lpstat -W -p|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
+ "/usr/bin/lpstat -W -d|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
+ "/usr/bin/lpstat -W -v"
+ };
+ private static final int aix_lsallq = 0;
+ private static final int aix_lpstat_p = 1;
+ private static final int aix_lpstat_d = 2;
+ private static final int aix_lpstat_v = 3;
+ private static int aix_defaultPrinterEnumeration = aix_lsallq;
+
+ static {
+ /* The system property "sun.java2d.print.polling"
+ * can be used to force the printing code to poll or not poll
+ * for PrintServices.
+ */
+ String pollStr = java.security.AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction("sun.java2d.print.polling"));
+
+ if (pollStr != null) {
+ if (pollStr.equalsIgnoreCase("true")) {
+ pollServices = true;
+ } else if (pollStr.equalsIgnoreCase("false")) {
+ pollServices = false;
+ }
+ }
+
+ /* The system property "sun.java2d.print.minRefreshTime"
+ * can be used to specify minimum refresh time (in seconds)
+ * for polling PrintServices. The default is 120.
+ */
+ String refreshTimeStr = java.security.AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction(
+ "sun.java2d.print.minRefreshTime"));
+
+ if (refreshTimeStr != null) {
+ try {
+ minRefreshTime = (new Integer(refreshTimeStr)).intValue();
+ } catch (NumberFormatException e) {
+ }
+ if (minRefreshTime < DEFAULT_MINREFRESH) {
+ minRefreshTime = DEFAULT_MINREFRESH;
+ }
+ }
+
+ osname = java.security.AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction("os.name"));
+
+ /* The system property "sun.java2d.print.aix.lpstat"
+ * can be used to force the usage of 'lpstat -p' to enumerate all
+ * printer queues. By default we use 'lsallq', because 'lpstat -p' can
+ * take lots of time if thousands of printers are attached to a server.
+ */
+ if (isAIX()) {
+ String aixPrinterEnumerator = java.security.AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction("sun.java2d.print.aix.lpstat"));
+
+ if (aixPrinterEnumerator != null) {
+ if (aixPrinterEnumerator.equalsIgnoreCase("lpstat")) {
+ aix_defaultPrinterEnumeration = aix_lpstat_p;
+ } else if (aixPrinterEnumerator.equalsIgnoreCase("lsallq")) {
+ aix_defaultPrinterEnumeration = aix_lsallq;
+ }
+ }
+ }
+ }
+
+ static boolean isMac() {
+ return osname.startsWith("Mac");
+ }
+
+ static boolean isSysV() {
+ return osname.equals("SunOS");
+ }
+
+ static boolean isLinux() {
+ return (osname.equals("Linux"));
+ }
+
+ static boolean isBSD() {
+ return (osname.equals("Linux") ||
+ osname.contains("OS X"));
+ }
+
+ static boolean isAIX() {
+ return osname.equals("AIX");
+ }
+
+ static final int UNINITIALIZED = -1;
+ static final int BSD_LPD = 0;
+ static final int BSD_LPD_NG = 1;
+
+ static int cmdIndex = UNINITIALIZED;
+
+ String[] lpcFirstCom = {
+ "/usr/sbin/lpc status | grep : | sed -ne '1,1 s/://p'",
+ "/usr/sbin/lpc status | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
+ };
+
+ String[] lpcAllCom = {
+ "/usr/sbin/lpc status all | grep : | sed -e 's/://'",
+ "/usr/sbin/lpc status all | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}' | sort"
+ };
+
+ String[] lpcNameCom = {
+ "| grep : | sed -ne 's/://p'",
+ "| grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
+ };
+
+
+ static int getBSDCommandIndex() {
+ String command = "/usr/sbin/lpc status all";
+ String[] names = execCmd(command);
+
+ if ((names == null) || (names.length == 0)) {
+ return BSD_LPD_NG;
+ }
+
+ for (int i=0; i<names.length; i++) {
+ if (names[i].indexOf('@') != -1) {
+ return BSD_LPD_NG;
+ }
+ }
+
+ return BSD_LPD;
+ }
+
+
+ public PrintServiceLookupProvider() {
+ // start the printer listener thread
+ if (pollServices) {
+ PrinterChangeListener thr = new PrinterChangeListener();
+ thr.setDaemon(true);
+ thr.start();
+ IPPPrintService.debug_println(debugPrefix+"polling turned on");
+ }
+ }
+
+ /* 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 synchronized PrintService[] getPrintServices() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPrintJobAccess();
+ }
+
+ if (printServices == null || !pollServices) {
+ refreshServices();
+ }
+ if (printServices == null) {
+ return new PrintService[0];
+ } else {
+ return printServices.clone();
+ }
+ }
+
+ private int addPrintServiceToList(ArrayList<PrintService> printerList, PrintService ps) {
+ int index = printerList.indexOf(ps);
+ // Check if PrintService with same name is already in the list.
+ if (CUPSPrinter.isCupsRunning() && index != -1) {
+ // Bug in Linux: Duplicate entry of a remote printer
+ // and treats it as local printer but it is returning wrong
+ // information when queried using IPP. Workaround is to remove it.
+ // Even CUPS ignores these entries as shown in lpstat or using
+ // their web configuration.
+ PrinterURI uri = ps.getAttribute(PrinterURI.class);
+ if (uri.getURI().getHost().equals("localhost")) {
+ IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, ignoring the new local printer: "+ps);
+ return index; // Do not add this.
+ }
+ PrintService oldPS = printerList.get(index);
+ uri = oldPS.getAttribute(PrinterURI.class);
+ if (uri.getURI().getHost().equals("localhost")) {
+ IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, removing existing local printer: "+oldPS);
+ printerList.remove(oldPS);
+ } else {
+ return index;
+ }
+ }
+ printerList.add(ps);
+ return (printerList.size() - 1);
+ }
+
+
+ // refreshes "printServices"
+ public synchronized void refreshServices() {
+ /* excludes the default printer */
+ String[] printers = null; // array of printer names
+ String[] printerURIs = null; //array of printer URIs
+
+ try {
+ getDefaultPrintService();
+ } catch (Throwable t) {
+ IPPPrintService.debug_println(debugPrefix+
+ "Exception getting default printer : " + t);
+ }
+ if (CUPSPrinter.isCupsRunning()) {
+ try {
+ printerURIs = CUPSPrinter.getAllPrinters();
+ IPPPrintService.debug_println("CUPS URIs = " + printerURIs);
+ if (printerURIs != null) {
+ for (int p = 0; p < printerURIs.length; p++) {
+ IPPPrintService.debug_println("URI="+printerURIs[p]);
+ }
+ }
+ } catch (Throwable t) {
+ IPPPrintService.debug_println(debugPrefix+
+ "Exception getting all CUPS printers : " + t);
+ }
+ if ((printerURIs != null) && (printerURIs.length > 0)) {
+ printers = new String[printerURIs.length];
+ for (int i=0; i<printerURIs.length; i++) {
+ int lastIndex = printerURIs[i].lastIndexOf("/");
+ printers[i] = printerURIs[i].substring(lastIndex+1);
+ }
+ }
+ } else {
+ if (isMac() || isSysV()) {
+ printers = getAllPrinterNamesSysV();
+ } else if (isAIX()) {
+ printers = getAllPrinterNamesAIX();
+ } else { //BSD
+ printers = getAllPrinterNamesBSD();
+ }
+ }
+
+ if (printers == null) {
+ if (defaultPrintService != null) {
+ printServices = new PrintService[1];
+ printServices[0] = defaultPrintService;
+ } else {
+ printServices = null;
+ }
+ return;
+ }
+
+ ArrayList<PrintService> printerList = new ArrayList<>();
+ int defaultIndex = -1;
+ for (int p=0; p<printers.length; p++) {
+ if (printers[p] == null) {
+ continue;
+ }
+ if ((defaultPrintService != null)
+ && printers[p].equals(getPrinterDestName(defaultPrintService))) {
+ defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
+ } else {
+ if (printServices == null) {
+ IPPPrintService.debug_println(debugPrefix+
+ "total# of printers = "+printers.length);
+
+ if (CUPSPrinter.isCupsRunning()) {
+ try {
+ addPrintServiceToList(printerList,
+ new IPPPrintService(printers[p],
+ printerURIs[p],
+ true));
+ } catch (Exception e) {
+ IPPPrintService.debug_println(debugPrefix+
+ " getAllPrinters Exception "+
+ e);
+
+ }
+ } else {
+ printerList.add(new UnixPrintService(printers[p]));
+ }
+ } else {
+ int j;
+ for (j=0; j<printServices.length; j++) {
+ if (printServices[j] != null) {
+ if (printers[p].equals(getPrinterDestName(printServices[j]))) {
+ printerList.add(printServices[j]);
+ printServices[j] = null;
+ break;
+ }
+ }
+ }
+
+ if (j == printServices.length) { // not found?
+ if (CUPSPrinter.isCupsRunning()) {
+ try {
+ addPrintServiceToList(printerList,
+ new IPPPrintService(printers[p],
+ printerURIs[p],
+ true));
+ } catch (Exception e) {
+ IPPPrintService.debug_println(debugPrefix+
+ " getAllPrinters Exception "+
+ e);
+
+ }
+ } else {
+ printerList.add(new UnixPrintService(printers[p]));
+ }
+ }
+ }
+ }
+ }
+
+ // Look for deleted services and invalidate these
+ if (printServices != null) {
+ for (int j=0; j < printServices.length; j++) {
+ if ((printServices[j] instanceof UnixPrintService) &&
+ (!printServices[j].equals(defaultPrintService))) {
+ ((UnixPrintService)printServices[j]).invalidateService();
+ }
+ }
+ }
+
+ //if defaultService is not found in printerList
+ if (defaultIndex == -1 && defaultPrintService != null) {
+ defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
+ }
+
+ printServices = printerList.toArray(new PrintService[] {});
+
+ // swap default with the first in the list
+ if (defaultIndex > 0) {
+ PrintService saveService = printServices[0];
+ printServices[0] = printServices[defaultIndex];
+ printServices[defaultIndex] = saveService;
+ }
+ }
+
+ private boolean matchesAttributes(PrintService service,
+ PrintServiceAttributeSet attributes) {
+
+ Attribute [] attrs = attributes.toArray();
+ for (int i=0; i<attrs.length; i++) {
+ @SuppressWarnings("unchecked")
+ Attribute serviceAttr
+ = service.getAttribute((Class<PrintServiceAttribute>)attrs[i].getCategory());
+ if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /* This checks for validity of the printer name before passing as
+ * parameter to a shell command.
+ */
+ private boolean checkPrinterName(String s) {
+ char c;
+
+ for (int i=0; i < s.length(); i++) {
+ c = s.charAt(i);
+ if (Character.isLetterOrDigit(c) ||
+ c == '-' || c == '_' || c == '.' || c == '/') {
+ continue;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /*
+ * Gets the printer name compatible with the list of printers returned by
+ * the system when we query default or all the available printers.
+ */
+ private String getPrinterDestName(PrintService ps) {
+ if (isMac()) {
+ return ((IPPPrintService)ps).getDest();
+ }
+ return ps.getName();
+ }
+
+ /* On a network with many (hundreds) of network printers, it
+ * can save several seconds if you know all you want is a particular
+ * printer, to ask for that printer rather than retrieving all printers.
+ */
+ private PrintService getServiceByName(PrinterName nameAttr) {
+ String name = nameAttr.getValue();
+ if (name == null || name.equals("") || !checkPrinterName(name)) {
+ return null;
+ }
+ /* check if all printers are already available */
+ if (printServices != null) {
+ for (PrintService printService : printServices) {
+ PrinterName printerName = printService.getAttribute(PrinterName.class);
+ if (printerName.getValue().equals(name)) {
+ return printService;
+ }
+ }
+ }
+ /* take CUPS into account first */
+ if (CUPSPrinter.isCupsRunning()) {
+ try {
+ return new IPPPrintService(name,
+ new URL("http://"+
+ CUPSPrinter.getServer()+":"+
+ CUPSPrinter.getPort()+"/"+
+ name));
+ } catch (Exception e) {
+ IPPPrintService.debug_println(debugPrefix+
+ " getServiceByName Exception "+
+ e);
+ }
+ }
+ /* fallback if nothing not having a printer at this point */
+ PrintService printer = null;
+ if (isMac() || isSysV()) {
+ printer = getNamedPrinterNameSysV(name);
+ } else if (isAIX()) {
+ printer = getNamedPrinterNameAIX(name);
+ } else {
+ printer = getNamedPrinterNameBSD(name);
+ }
+ return printer;
+ }
+
+ private PrintService[]
+ getPrintServices(PrintServiceAttributeSet serviceSet) {
+
+ if (serviceSet == null || serviceSet.isEmpty()) {
+ return getPrintServices();
+ }
+
+ /* Typically expect that if a service attribute is specified that
+ * its a printer name and there ought to be only one match.
+ * Directly retrieve that service and confirm
+ * that it meets the other requirements.
+ * If printer name isn't mentioned then go a slow path checking
+ * all printers if they meet the reqiremements.
+ */
+ PrintService[] services;
+ PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
+ PrintService defService;
+ if (name != null && (defService = getDefaultPrintService()) != null) {
+ /* To avoid execing a unix command see if the client is asking
+ * for the default printer by name, since we already have that
+ * initialised.
+ */
+
+ PrinterName defName = defService.getAttribute(PrinterName.class);
+
+ if (defName != null && name.equals(defName)) {
+ if (matchesAttributes(defService, serviceSet)) {
+ services = new PrintService[1];
+ services[0] = defService;
+ return services;
+ } else {
+ return new PrintService[0];
+ }
+ } else {
+ /* Its not the default service */
+ PrintService service = getServiceByName(name);
+ if (service != null &&
+ matchesAttributes(service, serviceSet)) {
+ services = new PrintService[1];
+ services[0] = service;
+ return services;
+ } else {
+ return new PrintService[0];
+ }
+ }
+ } else {
+ /* specified service attributes don't include a name.*/
+ Vector<PrintService> matchedServices = new Vector<>();
+ services = getPrintServices();
+ for (int i = 0; i< services.length; i++) {
+ if (matchesAttributes(services[i], serviceSet)) {
+ matchedServices.add(services[i]);
+ }
+ }
+ services = new PrintService[matchedServices.size()];
+ for (int i = 0; i< services.length; i++) {
+ services[i] = matchedServices.elementAt(i);
+ }
+ return services;
+ }
+ }
+
+ /*
+ * If service attributes are specified then there must be additional
+ * filtering.
+ */
+ 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]);
+ }
+ }
+ }
+
+ PrintService[] services = getPrintServices(serviceSet);
+ if (services.length == 0) {
+ return services;
+ }
+
+ if (CUPSPrinter.isCupsRunning()) {
+ ArrayList<PrintService> 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 matchingServices.toArray(services);
+
+ } else {
+ // We only need to compare 1 PrintService because all
+ // UnixPrintServices are the same anyway. We will not use
+ // default PrintService because it might be null.
+ PrintService service = services[0];
+ if ((flavor == null ||
+ service.isDocFlavorSupported(flavor)) &&
+ service.getUnsupportedAttributes(flavor, requestSet) == null)
+ {
+ return services;
+ } else {
+ return new PrintService[0];
+ }
+ }
+ }
+
+ /*
+ * 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 synchronized PrintService getDefaultPrintService() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPrintJobAccess();
+ }
+
+ // clear defaultPrintService
+ defaultPrintService = null;
+ String psuri = null;
+
+ IPPPrintService.debug_println("isRunning ? "+
+ (CUPSPrinter.isCupsRunning()));
+ if (CUPSPrinter.isCupsRunning()) {
+ String[] printerInfo = CUPSPrinter.getDefaultPrinter();
+ if (printerInfo != null && printerInfo.length >= 2) {
+ defaultPrinter = printerInfo[0];
+ psuri = printerInfo[1];
+ }
+ } else {
+ if (isMac() || isSysV()) {
+ defaultPrinter = getDefaultPrinterNameSysV();
+ } else if (isAIX()) {
+ defaultPrinter = getDefaultPrinterNameAIX();
+ } else {
+ defaultPrinter = getDefaultPrinterNameBSD();
+ }
+ }
+ if (defaultPrinter == null) {
+ return null;
+ }
+ defaultPrintService = null;
+ if (printServices != null) {
+ for (int j=0; j<printServices.length; j++) {
+ if (defaultPrinter.equals(getPrinterDestName(printServices[j]))) {
+ defaultPrintService = printServices[j];
+ break;
+ }
+ }
+ }
+ if (defaultPrintService == null) {
+ if (CUPSPrinter.isCupsRunning()) {
+ try {
+ PrintService defaultPS;
+ if ((psuri != null) && !psuri.startsWith("file")) {
+ defaultPS = new IPPPrintService(defaultPrinter,
+ psuri, true);
+ } else {
+ defaultPS = new IPPPrintService(defaultPrinter,
+ new URL("http://"+
+ CUPSPrinter.getServer()+":"+
+ CUPSPrinter.getPort()+"/"+
+ defaultPrinter));
+ }
+ defaultPrintService = defaultPS;
+ } catch (Exception e) {
+ }
+ } else {
+ defaultPrintService = new UnixPrintService(defaultPrinter);
+ }
+ }
+
+ return defaultPrintService;
+ }
+
+ public synchronized void
+ getServicesInbackground(BackgroundLookupListener listener) {
+ if (printServices != null) {
+ listener.notifyServices(printServices);
+ } else {
+ if (lookupListeners == null) {
+ lookupListeners = new Vector<>();
+ lookupListeners.add(listener);
+ Thread lookupThread = new Thread(this);
+ lookupThread.start();
+ } else {
+ lookupListeners.add(listener);
+ }
+ }
+ }
+
+ /* This method isn't used in most cases because we rely on code in
+ * javax.print.PrintServiceLookup. This is needed just for the cases
+ * where those interfaces are by-passed.
+ */
+ private PrintService[] copyOf(PrintService[] inArr) {
+ if (inArr == null || inArr.length == 0) {
+ return inArr;
+ } else {
+ PrintService []outArr = new PrintService[inArr.length];
+ System.arraycopy(inArr, 0, outArr, 0, inArr.length);
+ return outArr;
+ }
+ }
+
+ public void run() {
+ PrintService[] services = getPrintServices();
+ synchronized (this) {
+ BackgroundLookupListener listener;
+ for (int i=0; i<lookupListeners.size(); i++) {
+ listener = lookupListeners.elementAt(i);
+ listener.notifyServices(copyOf(services));
+ }
+ lookupListeners = null;
+ }
+ }
+
+ private String getDefaultPrinterNameBSD() {
+ if (cmdIndex == UNINITIALIZED) {
+ cmdIndex = getBSDCommandIndex();
+ }
+ String[] names = execCmd(lpcFirstCom[cmdIndex]);
+ if (names == null || names.length == 0) {
+ return null;
+ }
+
+ if ((cmdIndex==BSD_LPD_NG) &&
+ (names[0].startsWith("missingprinter"))) {
+ return null;
+ }
+ return names[0];
+ }
+
+ private PrintService getNamedPrinterNameBSD(String name) {
+ if (cmdIndex == UNINITIALIZED) {
+ cmdIndex = getBSDCommandIndex();
+ }
+ String command = "/usr/sbin/lpc status " + name + lpcNameCom[cmdIndex];
+ String[] result = execCmd(command);
+
+ if (result == null || !(result[0].equals(name))) {
+ return null;
+ }
+ return new UnixPrintService(name);
+ }
+
+ private String[] getAllPrinterNamesBSD() {
+ if (cmdIndex == UNINITIALIZED) {
+ cmdIndex = getBSDCommandIndex();
+ }
+ String[] names = execCmd(lpcAllCom[cmdIndex]);
+ if (names == null || names.length == 0) {
+ return null;
+ }
+ return names;
+ }
+
+ static String getDefaultPrinterNameSysV() {
+ String defaultPrinter = "lp";
+ String command = "/usr/bin/lpstat -d";
+
+ String [] names = execCmd(command);
+ if (names == null || names.length == 0) {
+ return defaultPrinter;
+ } else {
+ int index = names[0].indexOf(":");
+ if (index == -1 || (names[0].length() <= index+1)) {
+ return null;
+ } else {
+ String name = names[0].substring(index+1).trim();
+ if (name.length() == 0) {
+ return null;
+ } else {
+ return name;
+ }
+ }
+ }
+ }
+
+ private PrintService getNamedPrinterNameSysV(String name) {
+
+ String command = "/usr/bin/lpstat -v " + name;
+ String []result = execCmd(command);
+
+ if (result == null || result[0].indexOf("unknown printer") > 0) {
+ return null;
+ } else {
+ return new UnixPrintService(name);
+ }
+ }
+
+ private String[] getAllPrinterNamesSysV() {
+ String defaultPrinter = "lp";
+ String command = "/usr/bin/lpstat -v|/usr/bin/expand|/usr/bin/cut -f3 -d' ' |/usr/bin/cut -f1 -d':' | /usr/bin/sort";
+
+ String [] names = execCmd(command);
+ ArrayList<String> printerNames = new ArrayList<>();
+ for (int i=0; i < names.length; i++) {
+ if (!names[i].equals("_default") &&
+ !names[i].equals(defaultPrinter) &&
+ !names[i].equals("")) {
+ printerNames.add(names[i]);
+ }
+ }
+ return printerNames.toArray(new String[printerNames.size()]);
+ }
+
+ private String getDefaultPrinterNameAIX() {
+ String[] names = execCmd(lpNameComAix[aix_lpstat_d]);
+ // Remove headers and bogus entries added by remote printers.
+ names = UnixPrintService.filterPrinterNamesAIX(names);
+ if (names == null || names.length != 1) {
+ // No default printer found
+ return null;
+ } else {
+ return names[0];
+ }
+ }
+
+ private PrintService getNamedPrinterNameAIX(String name) {
+ // On AIX there should be no blank after '-v'.
+ String[] result = execCmd(lpNameComAix[aix_lpstat_v] + name);
+ // Remove headers and bogus entries added by remote printers.
+ result = UnixPrintService.filterPrinterNamesAIX(result);
+ if (result == null || result.length != 1) {
+ return null;
+ } else {
+ return new UnixPrintService(name);
+ }
+ }
+
+ private String[] getAllPrinterNamesAIX() {
+ // Determine all printers of the system.
+ String [] names = execCmd(lpNameComAix[aix_defaultPrinterEnumeration]);
+
+ // Remove headers and bogus entries added by remote printers.
+ names = UnixPrintService.filterPrinterNamesAIX(names);
+
+ ArrayList<String> printerNames = new ArrayList<String>();
+ for ( int i=0; i < names.length; i++) {
+ printerNames.add(names[i]);
+ }
+ return printerNames.toArray(new String[printerNames.size()]);
+ }
+
+ static String[] execCmd(final String command) {
+ ArrayList<String> results = null;
+ try {
+ final String[] cmd = new String[3];
+ if (isSysV() || isAIX()) {
+ cmd[0] = "/usr/bin/sh";
+ cmd[1] = "-c";
+ cmd[2] = "env LC_ALL=C " + command;
+ } else {
+ cmd[0] = "/bin/sh";
+ cmd[1] = "-c";
+ cmd[2] = "LC_ALL=C " + command;
+ }
+
+ results = AccessController.doPrivileged(
+ new PrivilegedExceptionAction<ArrayList<String>>() {
+ public ArrayList<String> run() throws IOException {
+
+ Process proc;
+ BufferedReader bufferedReader = null;
+ File f = Files.createTempFile("prn","xc").toFile();
+ cmd[2] = cmd[2]+">"+f.getAbsolutePath();
+
+ proc = Runtime.getRuntime().exec(cmd);
+ try {
+ boolean done = false; // in case of interrupt.
+ while (!done) {
+ try {
+ proc.waitFor();
+ done = true;
+ } catch (InterruptedException e) {
+ }
+ }
+
+ if (proc.exitValue() == 0) {
+ FileReader reader = new FileReader(f);
+ bufferedReader = new BufferedReader(reader);
+ String line;
+ ArrayList<String> results = new ArrayList<>();
+ while ((line = bufferedReader.readLine())
+ != null) {
+ results.add(line);
+ }
+ return results;
+ }
+ } finally {
+ f.delete();
+ // promptly close all streams.
+ if (bufferedReader != null) {
+ bufferedReader.close();
+ }
+ proc.getInputStream().close();
+ proc.getErrorStream().close();
+ proc.getOutputStream().close();
+ }
+ return null;
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ }
+ if (results == null) {
+ return new String[0];
+ } else {
+ return results.toArray(new String[results.size()]);
+ }
+ }
+
+ private class PrinterChangeListener extends Thread {
+
+ public void run() {
+ int refreshSecs;
+ while (true) {
+ try {
+ refreshServices();
+ } catch (Exception se) {
+ IPPPrintService.debug_println(debugPrefix+"Exception in refresh thread.");
+ break;
+ }
+
+ if ((printServices != null) &&
+ (printServices.length > minRefreshTime)) {
+ // compute new refresh time 1 printer = 1 sec
+ refreshSecs = printServices.length;
+ } else {
+ refreshSecs = minRefreshTime;
+ }
+ try {
+ sleep(refreshSecs * 1000);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ }
+ }
+}
--- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java Fri Oct 10 16:07:18 2014 +0400
+++ b/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java Fri Oct 10 09:03:28 2014 -0700
@@ -122,7 +122,7 @@
UnixPrintJob(PrintService service) {
this.service = service;
mDestination = service.getName();
- if (UnixPrintServiceLookup.isMac()) {
+ if (PrintServiceLookupProvider.isMac()) {
mDestination = ((IPPPrintService)service).getDest();
}
mDestType = UnixPrintJob.DESTPRINTER;
@@ -880,7 +880,7 @@
pFlags |= NOSHEET;
ncomps+=1;
}
- if (UnixPrintServiceLookup.osname.equals("SunOS")) {
+ if (PrintServiceLookupProvider.osname.equals("SunOS")) {
ncomps+=1; // lp uses 1 more arg than lpr (make a copy)
execCmd = new String[ncomps];
execCmd[n++] = "/usr/bin/lp";
--- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintService.java Fri Oct 10 16:07:18 2014 +0400
+++ b/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintService.java Fri Oct 10 09:03:28 2014 -0700
@@ -220,7 +220,7 @@
private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsSysV() {
String command = "/usr/bin/lpstat -a " + printer;
- String results[]= UnixPrintServiceLookup.execCmd(command);
+ String results[]= PrintServiceLookupProvider.execCmd(command);
if (results != null && results.length > 0) {
if (results[0].startsWith(printer + " accepting requests")) {
@@ -244,20 +244,20 @@
}
private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsBSD() {
- if (UnixPrintServiceLookup.cmdIndex ==
- UnixPrintServiceLookup.UNINITIALIZED) {
+ if (PrintServiceLookupProvider.cmdIndex ==
+ PrintServiceLookupProvider.UNINITIALIZED) {
- UnixPrintServiceLookup.cmdIndex =
- UnixPrintServiceLookup.getBSDCommandIndex();
+ PrintServiceLookupProvider.cmdIndex =
+ PrintServiceLookupProvider.getBSDCommandIndex();
}
String command = "/usr/sbin/lpc status " + printer
- + lpcStatusCom[UnixPrintServiceLookup.cmdIndex];
- String results[]= UnixPrintServiceLookup.execCmd(command);
+ + lpcStatusCom[PrintServiceLookupProvider.cmdIndex];
+ String results[]= PrintServiceLookupProvider.execCmd(command);
if (results != null && results.length > 0) {
- if (UnixPrintServiceLookup.cmdIndex ==
- UnixPrintServiceLookup.BSD_LPD_NG) {
+ if (PrintServiceLookupProvider.cmdIndex ==
+ PrintServiceLookupProvider.BSD_LPD_NG) {
if (results[0].startsWith("enabled enabled")) {
return PrinterIsAcceptingJobs.ACCEPTING_JOBS ;
}
@@ -276,7 +276,7 @@
// Filter the list of possible AIX Printers and remove header lines
// and extra lines which have been added for remote printers.
- // 'protected' because this method is also used from UnixPrintServiceLookup.
+ // 'protected' because this method is also used from PrintServiceLookupProvider.
protected static String[] filterPrinterNamesAIX(String[] posPrinters) {
ArrayList<String> printers = new ArrayList<>();
String [] splitPart;
@@ -301,7 +301,7 @@
private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsAIX() {
// On AIX there should not be a blank after '-a'.
String command = "/usr/bin/lpstat -a" + printer;
- String results[]= UnixPrintServiceLookup.execCmd(command);
+ String results[]= PrintServiceLookupProvider.execCmd(command);
// Remove headers and bogus entries added by remote printers.
results = filterPrinterNamesAIX(results);
@@ -320,11 +320,11 @@
}
private PrinterIsAcceptingJobs getPrinterIsAcceptingJobs() {
- if (UnixPrintServiceLookup.isSysV()) {
+ if (PrintServiceLookupProvider.isSysV()) {
return getPrinterIsAcceptingJobsSysV();
- } else if (UnixPrintServiceLookup.isBSD()) {
+ } else if (PrintServiceLookupProvider.isBSD()) {
return getPrinterIsAcceptingJobsBSD();
- } else if (UnixPrintServiceLookup.isAIX()) {
+ } else if (PrintServiceLookupProvider.isAIX()) {
return getPrinterIsAcceptingJobsAIX();
} else {
return PrinterIsAcceptingJobs.ACCEPTING_JOBS;
@@ -351,29 +351,29 @@
private QueuedJobCount getQueuedJobCountSysV() {
String command = "/usr/bin/lpstat -R " + printer;
- String results[]= UnixPrintServiceLookup.execCmd(command);
+ String results[]= PrintServiceLookupProvider.execCmd(command);
int qlen = (results == null) ? 0 : results.length;
return new QueuedJobCount(qlen);
}
private QueuedJobCount getQueuedJobCountBSD() {
- if (UnixPrintServiceLookup.cmdIndex ==
- UnixPrintServiceLookup.UNINITIALIZED) {
+ if (PrintServiceLookupProvider.cmdIndex ==
+ PrintServiceLookupProvider.UNINITIALIZED) {
- UnixPrintServiceLookup.cmdIndex =
- UnixPrintServiceLookup.getBSDCommandIndex();
+ PrintServiceLookupProvider.cmdIndex =
+ PrintServiceLookupProvider.getBSDCommandIndex();
}
int qlen = 0;
String command = "/usr/sbin/lpc status " + printer
- + lpcQueueCom[UnixPrintServiceLookup.cmdIndex];
- String results[] = UnixPrintServiceLookup.execCmd(command);
+ + lpcQueueCom[PrintServiceLookupProvider.cmdIndex];
+ String results[] = PrintServiceLookupProvider.execCmd(command);
if (results != null && results.length > 0) {
String queued;
- if (UnixPrintServiceLookup.cmdIndex ==
- UnixPrintServiceLookup.BSD_LPD_NG) {
+ if (PrintServiceLookupProvider.cmdIndex ==
+ PrintServiceLookupProvider.BSD_LPD_NG) {
queued = results[0];
} else {
queued = results[3].trim();
@@ -396,7 +396,7 @@
private QueuedJobCount getQueuedJobCountAIX() {
// On AIX there should not be a blank after '-a'.
String command = "/usr/bin/lpstat -a" + printer;
- String results[]= UnixPrintServiceLookup.execCmd(command);
+ String results[]= PrintServiceLookupProvider.execCmd(command);
// Remove headers and bogus entries added by remote printers.
results = filterPrinterNamesAIX(results);
@@ -413,11 +413,11 @@
}
private QueuedJobCount getQueuedJobCount() {
- if (UnixPrintServiceLookup.isSysV()) {
+ if (PrintServiceLookupProvider.isSysV()) {
return getQueuedJobCountSysV();
- } else if (UnixPrintServiceLookup.isBSD()) {
+ } else if (PrintServiceLookupProvider.isBSD()) {
return getQueuedJobCountBSD();
- } else if (UnixPrintServiceLookup.isAIX()) {
+ } else if (PrintServiceLookupProvider.isAIX()) {
return getQueuedJobCountAIX();
} else {
return new QueuedJobCount(0);
@@ -468,9 +468,9 @@
}
private PrintServiceAttributeSet getDynamicAttributes() {
- if (UnixPrintServiceLookup.isSysV()) {
+ if (PrintServiceLookupProvider.isSysV()) {
return getSysVServiceAttributes();
- } else if (UnixPrintServiceLookup.isAIX()) {
+ } else if (PrintServiceLookupProvider.isAIX()) {
return getAIXServiceAttributes();
} else {
return getBSDServiceAttributes();
--- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintServiceLookup.java Fri Oct 10 16:07:18 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,964 +0,0 @@
-/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.print;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Vector;
-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;
-import javax.print.attribute.standard.PrinterURI;
-import java.io.File;
-import java.io.FileReader;
-import java.net.URL;
-import java.nio.file.Files;
-
-/*
- * Remind: This class uses solaris commands. We also need a linux
- * version
- */
-public class UnixPrintServiceLookup extends PrintServiceLookup
- implements BackgroundServiceLookup, Runnable {
-
- /* Remind: the current implementation is static, as its assumed
- * its preferable to minimize 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 PrintService[] printServices; /* includes the default printer */
- private Vector<BackgroundLookupListener> lookupListeners = null;
- private static String debugPrefix = "UnixPrintServiceLookup>> ";
- private static boolean pollServices = true;
- private static final int DEFAULT_MINREFRESH = 120; // 2 minutes
- private static int minRefreshTime = DEFAULT_MINREFRESH;
-
-
- static String osname;
-
- // List of commands used to deal with the printer queues on AIX
- String[] lpNameComAix = {
- "/usr/bin/lsallq",
- "/usr/bin/lpstat -W -p|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
- "/usr/bin/lpstat -W -d|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
- "/usr/bin/lpstat -W -v"
- };
- private static final int aix_lsallq = 0;
- private static final int aix_lpstat_p = 1;
- private static final int aix_lpstat_d = 2;
- private static final int aix_lpstat_v = 3;
- private static int aix_defaultPrinterEnumeration = aix_lsallq;
-
- static {
- /* The system property "sun.java2d.print.polling"
- * can be used to force the printing code to poll or not poll
- * for PrintServices.
- */
- String pollStr = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("sun.java2d.print.polling"));
-
- if (pollStr != null) {
- if (pollStr.equalsIgnoreCase("true")) {
- pollServices = true;
- } else if (pollStr.equalsIgnoreCase("false")) {
- pollServices = false;
- }
- }
-
- /* The system property "sun.java2d.print.minRefreshTime"
- * can be used to specify minimum refresh time (in seconds)
- * for polling PrintServices. The default is 120.
- */
- String refreshTimeStr = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction(
- "sun.java2d.print.minRefreshTime"));
-
- if (refreshTimeStr != null) {
- try {
- minRefreshTime = (new Integer(refreshTimeStr)).intValue();
- } catch (NumberFormatException e) {
- }
- if (minRefreshTime < DEFAULT_MINREFRESH) {
- minRefreshTime = DEFAULT_MINREFRESH;
- }
- }
-
- osname = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("os.name"));
-
- /* The system property "sun.java2d.print.aix.lpstat"
- * can be used to force the usage of 'lpstat -p' to enumerate all
- * printer queues. By default we use 'lsallq', because 'lpstat -p' can
- * take lots of time if thousands of printers are attached to a server.
- */
- if (isAIX()) {
- String aixPrinterEnumerator = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("sun.java2d.print.aix.lpstat"));
-
- if (aixPrinterEnumerator != null) {
- if (aixPrinterEnumerator.equalsIgnoreCase("lpstat")) {
- aix_defaultPrinterEnumeration = aix_lpstat_p;
- } else if (aixPrinterEnumerator.equalsIgnoreCase("lsallq")) {
- aix_defaultPrinterEnumeration = aix_lsallq;
- }
- }
- }
- }
-
- static boolean isMac() {
- return osname.startsWith("Mac");
- }
-
- static boolean isSysV() {
- return osname.equals("SunOS");
- }
-
- static boolean isLinux() {
- return (osname.equals("Linux"));
- }
-
- static boolean isBSD() {
- return (osname.equals("Linux") ||
- osname.contains("OS X"));
- }
-
- static boolean isAIX() {
- return osname.equals("AIX");
- }
-
- static final int UNINITIALIZED = -1;
- static final int BSD_LPD = 0;
- static final int BSD_LPD_NG = 1;
-
- static int cmdIndex = UNINITIALIZED;
-
- String[] lpcFirstCom = {
- "/usr/sbin/lpc status | grep : | sed -ne '1,1 s/://p'",
- "/usr/sbin/lpc status | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
- };
-
- String[] lpcAllCom = {
- "/usr/sbin/lpc status all | grep : | sed -e 's/://'",
- "/usr/sbin/lpc status all | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}' | sort"
- };
-
- String[] lpcNameCom = {
- "| grep : | sed -ne 's/://p'",
- "| grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
- };
-
-
- static int getBSDCommandIndex() {
- String command = "/usr/sbin/lpc status all";
- String[] names = execCmd(command);
-
- if ((names == null) || (names.length == 0)) {
- return BSD_LPD_NG;
- }
-
- for (int i=0; i<names.length; i++) {
- if (names[i].indexOf('@') != -1) {
- return BSD_LPD_NG;
- }
- }
-
- return BSD_LPD;
- }
-
-
- public UnixPrintServiceLookup() {
- // start the printer listener thread
- if (pollServices) {
- PrinterChangeListener thr = new PrinterChangeListener();
- thr.setDaemon(true);
- thr.start();
- IPPPrintService.debug_println(debugPrefix+"polling turned on");
- }
- }
-
- /* 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 synchronized PrintService[] getPrintServices() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPrintJobAccess();
- }
-
- if (printServices == null || !pollServices) {
- refreshServices();
- }
- if (printServices == null) {
- return new PrintService[0];
- } else {
- return printServices.clone();
- }
- }
-
- private int addPrintServiceToList(ArrayList<PrintService> printerList, PrintService ps) {
- int index = printerList.indexOf(ps);
- // Check if PrintService with same name is already in the list.
- if (CUPSPrinter.isCupsRunning() && index != -1) {
- // Bug in Linux: Duplicate entry of a remote printer
- // and treats it as local printer but it is returning wrong
- // information when queried using IPP. Workaround is to remove it.
- // Even CUPS ignores these entries as shown in lpstat or using
- // their web configuration.
- PrinterURI uri = ps.getAttribute(PrinterURI.class);
- if (uri.getURI().getHost().equals("localhost")) {
- IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, ignoring the new local printer: "+ps);
- return index; // Do not add this.
- }
- PrintService oldPS = printerList.get(index);
- uri = oldPS.getAttribute(PrinterURI.class);
- if (uri.getURI().getHost().equals("localhost")) {
- IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, removing existing local printer: "+oldPS);
- printerList.remove(oldPS);
- } else {
- return index;
- }
- }
- printerList.add(ps);
- return (printerList.size() - 1);
- }
-
-
- // refreshes "printServices"
- public synchronized void refreshServices() {
- /* excludes the default printer */
- String[] printers = null; // array of printer names
- String[] printerURIs = null; //array of printer URIs
-
- try {
- getDefaultPrintService();
- } catch (Throwable t) {
- IPPPrintService.debug_println(debugPrefix+
- "Exception getting default printer : " + t);
- }
- if (CUPSPrinter.isCupsRunning()) {
- try {
- printerURIs = CUPSPrinter.getAllPrinters();
- IPPPrintService.debug_println("CUPS URIs = " + printerURIs);
- if (printerURIs != null) {
- for (int p = 0; p < printerURIs.length; p++) {
- IPPPrintService.debug_println("URI="+printerURIs[p]);
- }
- }
- } catch (Throwable t) {
- IPPPrintService.debug_println(debugPrefix+
- "Exception getting all CUPS printers : " + t);
- }
- if ((printerURIs != null) && (printerURIs.length > 0)) {
- printers = new String[printerURIs.length];
- for (int i=0; i<printerURIs.length; i++) {
- int lastIndex = printerURIs[i].lastIndexOf("/");
- printers[i] = printerURIs[i].substring(lastIndex+1);
- }
- }
- } else {
- if (isMac() || isSysV()) {
- printers = getAllPrinterNamesSysV();
- } else if (isAIX()) {
- printers = getAllPrinterNamesAIX();
- } else { //BSD
- printers = getAllPrinterNamesBSD();
- }
- }
-
- if (printers == null) {
- if (defaultPrintService != null) {
- printServices = new PrintService[1];
- printServices[0] = defaultPrintService;
- } else {
- printServices = null;
- }
- return;
- }
-
- ArrayList<PrintService> printerList = new ArrayList<>();
- int defaultIndex = -1;
- for (int p=0; p<printers.length; p++) {
- if (printers[p] == null) {
- continue;
- }
- if ((defaultPrintService != null)
- && printers[p].equals(getPrinterDestName(defaultPrintService))) {
- defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
- } else {
- if (printServices == null) {
- IPPPrintService.debug_println(debugPrefix+
- "total# of printers = "+printers.length);
-
- if (CUPSPrinter.isCupsRunning()) {
- try {
- addPrintServiceToList(printerList,
- new IPPPrintService(printers[p],
- printerURIs[p],
- true));
- } catch (Exception e) {
- IPPPrintService.debug_println(debugPrefix+
- " getAllPrinters Exception "+
- e);
-
- }
- } else {
- printerList.add(new UnixPrintService(printers[p]));
- }
- } else {
- int j;
- for (j=0; j<printServices.length; j++) {
- if (printServices[j] != null) {
- if (printers[p].equals(getPrinterDestName(printServices[j]))) {
- printerList.add(printServices[j]);
- printServices[j] = null;
- break;
- }
- }
- }
-
- if (j == printServices.length) { // not found?
- if (CUPSPrinter.isCupsRunning()) {
- try {
- addPrintServiceToList(printerList,
- new IPPPrintService(printers[p],
- printerURIs[p],
- true));
- } catch (Exception e) {
- IPPPrintService.debug_println(debugPrefix+
- " getAllPrinters Exception "+
- e);
-
- }
- } else {
- printerList.add(new UnixPrintService(printers[p]));
- }
- }
- }
- }
- }
-
- // Look for deleted services and invalidate these
- if (printServices != null) {
- for (int j=0; j < printServices.length; j++) {
- if ((printServices[j] instanceof UnixPrintService) &&
- (!printServices[j].equals(defaultPrintService))) {
- ((UnixPrintService)printServices[j]).invalidateService();
- }
- }
- }
-
- //if defaultService is not found in printerList
- if (defaultIndex == -1 && defaultPrintService != null) {
- defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
- }
-
- printServices = printerList.toArray(new PrintService[] {});
-
- // swap default with the first in the list
- if (defaultIndex > 0) {
- PrintService saveService = printServices[0];
- printServices[0] = printServices[defaultIndex];
- printServices[defaultIndex] = saveService;
- }
- }
-
- private boolean matchesAttributes(PrintService service,
- PrintServiceAttributeSet attributes) {
-
- Attribute [] attrs = attributes.toArray();
- for (int i=0; i<attrs.length; i++) {
- @SuppressWarnings("unchecked")
- Attribute serviceAttr
- = service.getAttribute((Class<PrintServiceAttribute>)attrs[i].getCategory());
- if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
- return false;
- }
- }
- return true;
- }
-
- /* This checks for validity of the printer name before passing as
- * parameter to a shell command.
- */
- private boolean checkPrinterName(String s) {
- char c;
-
- for (int i=0; i < s.length(); i++) {
- c = s.charAt(i);
- if (Character.isLetterOrDigit(c) ||
- c == '-' || c == '_' || c == '.' || c == '/') {
- continue;
- } else {
- return false;
- }
- }
- return true;
- }
-
- /*
- * Gets the printer name compatible with the list of printers returned by
- * the system when we query default or all the available printers.
- */
- private String getPrinterDestName(PrintService ps) {
- if (isMac()) {
- return ((IPPPrintService)ps).getDest();
- }
- return ps.getName();
- }
-
- /* On a network with many (hundreds) of network printers, it
- * can save several seconds if you know all you want is a particular
- * printer, to ask for that printer rather than retrieving all printers.
- */
- private PrintService getServiceByName(PrinterName nameAttr) {
- String name = nameAttr.getValue();
- if (name == null || name.equals("") || !checkPrinterName(name)) {
- return null;
- }
- /* check if all printers are already available */
- if (printServices != null) {
- for (PrintService printService : printServices) {
- PrinterName printerName = printService.getAttribute(PrinterName.class);
- if (printerName.getValue().equals(name)) {
- return printService;
- }
- }
- }
- /* take CUPS into account first */
- if (CUPSPrinter.isCupsRunning()) {
- try {
- return new IPPPrintService(name,
- new URL("http://"+
- CUPSPrinter.getServer()+":"+
- CUPSPrinter.getPort()+"/"+
- name));
- } catch (Exception e) {
- IPPPrintService.debug_println(debugPrefix+
- " getServiceByName Exception "+
- e);
- }
- }
- /* fallback if nothing not having a printer at this point */
- PrintService printer = null;
- if (isMac() || isSysV()) {
- printer = getNamedPrinterNameSysV(name);
- } else if (isAIX()) {
- printer = getNamedPrinterNameAIX(name);
- } else {
- printer = getNamedPrinterNameBSD(name);
- }
- return printer;
- }
-
- private PrintService[]
- getPrintServices(PrintServiceAttributeSet serviceSet) {
-
- if (serviceSet == null || serviceSet.isEmpty()) {
- return getPrintServices();
- }
-
- /* Typically expect that if a service attribute is specified that
- * its a printer name and there ought to be only one match.
- * Directly retrieve that service and confirm
- * that it meets the other requirements.
- * If printer name isn't mentioned then go a slow path checking
- * all printers if they meet the reqiremements.
- */
- PrintService[] services;
- PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
- PrintService defService;
- if (name != null && (defService = getDefaultPrintService()) != null) {
- /* To avoid execing a unix command see if the client is asking
- * for the default printer by name, since we already have that
- * initialised.
- */
-
- PrinterName defName = defService.getAttribute(PrinterName.class);
-
- if (defName != null && name.equals(defName)) {
- if (matchesAttributes(defService, serviceSet)) {
- services = new PrintService[1];
- services[0] = defService;
- return services;
- } else {
- return new PrintService[0];
- }
- } else {
- /* Its not the default service */
- PrintService service = getServiceByName(name);
- if (service != null &&
- matchesAttributes(service, serviceSet)) {
- services = new PrintService[1];
- services[0] = service;
- return services;
- } else {
- return new PrintService[0];
- }
- }
- } else {
- /* specified service attributes don't include a name.*/
- Vector<PrintService> matchedServices = new Vector<>();
- services = getPrintServices();
- for (int i = 0; i< services.length; i++) {
- if (matchesAttributes(services[i], serviceSet)) {
- matchedServices.add(services[i]);
- }
- }
- services = new PrintService[matchedServices.size()];
- for (int i = 0; i< services.length; i++) {
- services[i] = matchedServices.elementAt(i);
- }
- return services;
- }
- }
-
- /*
- * If service attributes are specified then there must be additional
- * filtering.
- */
- 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]);
- }
- }
- }
-
- PrintService[] services = getPrintServices(serviceSet);
- if (services.length == 0) {
- return services;
- }
-
- if (CUPSPrinter.isCupsRunning()) {
- ArrayList<PrintService> 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 matchingServices.toArray(services);
-
- } else {
- // We only need to compare 1 PrintService because all
- // UnixPrintServices are the same anyway. We will not use
- // default PrintService because it might be null.
- PrintService service = services[0];
- if ((flavor == null ||
- service.isDocFlavorSupported(flavor)) &&
- service.getUnsupportedAttributes(flavor, requestSet) == null)
- {
- return services;
- } else {
- return new PrintService[0];
- }
- }
- }
-
- /*
- * 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 synchronized PrintService getDefaultPrintService() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPrintJobAccess();
- }
-
- // clear defaultPrintService
- defaultPrintService = null;
- String psuri = null;
-
- IPPPrintService.debug_println("isRunning ? "+
- (CUPSPrinter.isCupsRunning()));
- if (CUPSPrinter.isCupsRunning()) {
- String[] printerInfo = CUPSPrinter.getDefaultPrinter();
- if (printerInfo != null && printerInfo.length >= 2) {
- defaultPrinter = printerInfo[0];
- psuri = printerInfo[1];
- }
- } else {
- if (isMac() || isSysV()) {
- defaultPrinter = getDefaultPrinterNameSysV();
- } else if (isAIX()) {
- defaultPrinter = getDefaultPrinterNameAIX();
- } else {
- defaultPrinter = getDefaultPrinterNameBSD();
- }
- }
- if (defaultPrinter == null) {
- return null;
- }
- defaultPrintService = null;
- if (printServices != null) {
- for (int j=0; j<printServices.length; j++) {
- if (defaultPrinter.equals(getPrinterDestName(printServices[j]))) {
- defaultPrintService = printServices[j];
- break;
- }
- }
- }
- if (defaultPrintService == null) {
- if (CUPSPrinter.isCupsRunning()) {
- try {
- PrintService defaultPS;
- if ((psuri != null) && !psuri.startsWith("file")) {
- defaultPS = new IPPPrintService(defaultPrinter,
- psuri, true);
- } else {
- defaultPS = new IPPPrintService(defaultPrinter,
- new URL("http://"+
- CUPSPrinter.getServer()+":"+
- CUPSPrinter.getPort()+"/"+
- defaultPrinter));
- }
- defaultPrintService = defaultPS;
- } catch (Exception e) {
- }
- } else {
- defaultPrintService = new UnixPrintService(defaultPrinter);
- }
- }
-
- return defaultPrintService;
- }
-
- public synchronized void
- getServicesInbackground(BackgroundLookupListener listener) {
- if (printServices != null) {
- listener.notifyServices(printServices);
- } else {
- if (lookupListeners == null) {
- lookupListeners = new Vector<>();
- lookupListeners.add(listener);
- Thread lookupThread = new Thread(this);
- lookupThread.start();
- } else {
- lookupListeners.add(listener);
- }
- }
- }
-
- /* This method isn't used in most cases because we rely on code in
- * javax.print.PrintServiceLookup. This is needed just for the cases
- * where those interfaces are by-passed.
- */
- private PrintService[] copyOf(PrintService[] inArr) {
- if (inArr == null || inArr.length == 0) {
- return inArr;
- } else {
- PrintService []outArr = new PrintService[inArr.length];
- System.arraycopy(inArr, 0, outArr, 0, inArr.length);
- return outArr;
- }
- }
-
- public void run() {
- PrintService[] services = getPrintServices();
- synchronized (this) {
- BackgroundLookupListener listener;
- for (int i=0; i<lookupListeners.size(); i++) {
- listener = lookupListeners.elementAt(i);
- listener.notifyServices(copyOf(services));
- }
- lookupListeners = null;
- }
- }
-
- private String getDefaultPrinterNameBSD() {
- if (cmdIndex == UNINITIALIZED) {
- cmdIndex = getBSDCommandIndex();
- }
- String[] names = execCmd(lpcFirstCom[cmdIndex]);
- if (names == null || names.length == 0) {
- return null;
- }
-
- if ((cmdIndex==BSD_LPD_NG) &&
- (names[0].startsWith("missingprinter"))) {
- return null;
- }
- return names[0];
- }
-
- private PrintService getNamedPrinterNameBSD(String name) {
- if (cmdIndex == UNINITIALIZED) {
- cmdIndex = getBSDCommandIndex();
- }
- String command = "/usr/sbin/lpc status " + name + lpcNameCom[cmdIndex];
- String[] result = execCmd(command);
-
- if (result == null || !(result[0].equals(name))) {
- return null;
- }
- return new UnixPrintService(name);
- }
-
- private String[] getAllPrinterNamesBSD() {
- if (cmdIndex == UNINITIALIZED) {
- cmdIndex = getBSDCommandIndex();
- }
- String[] names = execCmd(lpcAllCom[cmdIndex]);
- if (names == null || names.length == 0) {
- return null;
- }
- return names;
- }
-
- static String getDefaultPrinterNameSysV() {
- String defaultPrinter = "lp";
- String command = "/usr/bin/lpstat -d";
-
- String [] names = execCmd(command);
- if (names == null || names.length == 0) {
- return defaultPrinter;
- } else {
- int index = names[0].indexOf(":");
- if (index == -1 || (names[0].length() <= index+1)) {
- return null;
- } else {
- String name = names[0].substring(index+1).trim();
- if (name.length() == 0) {
- return null;
- } else {
- return name;
- }
- }
- }
- }
-
- private PrintService getNamedPrinterNameSysV(String name) {
-
- String command = "/usr/bin/lpstat -v " + name;
- String []result = execCmd(command);
-
- if (result == null || result[0].indexOf("unknown printer") > 0) {
- return null;
- } else {
- return new UnixPrintService(name);
- }
- }
-
- private String[] getAllPrinterNamesSysV() {
- String defaultPrinter = "lp";
- String command = "/usr/bin/lpstat -v|/usr/bin/expand|/usr/bin/cut -f3 -d' ' |/usr/bin/cut -f1 -d':' | /usr/bin/sort";
-
- String [] names = execCmd(command);
- ArrayList<String> printerNames = new ArrayList<>();
- for (int i=0; i < names.length; i++) {
- if (!names[i].equals("_default") &&
- !names[i].equals(defaultPrinter) &&
- !names[i].equals("")) {
- printerNames.add(names[i]);
- }
- }
- return printerNames.toArray(new String[printerNames.size()]);
- }
-
- private String getDefaultPrinterNameAIX() {
- String[] names = execCmd(lpNameComAix[aix_lpstat_d]);
- // Remove headers and bogus entries added by remote printers.
- names = UnixPrintService.filterPrinterNamesAIX(names);
- if (names == null || names.length != 1) {
- // No default printer found
- return null;
- } else {
- return names[0];
- }
- }
-
- private PrintService getNamedPrinterNameAIX(String name) {
- // On AIX there should be no blank after '-v'.
- String[] result = execCmd(lpNameComAix[aix_lpstat_v] + name);
- // Remove headers and bogus entries added by remote printers.
- result = UnixPrintService.filterPrinterNamesAIX(result);
- if (result == null || result.length != 1) {
- return null;
- } else {
- return new UnixPrintService(name);
- }
- }
-
- private String[] getAllPrinterNamesAIX() {
- // Determine all printers of the system.
- String [] names = execCmd(lpNameComAix[aix_defaultPrinterEnumeration]);
-
- // Remove headers and bogus entries added by remote printers.
- names = UnixPrintService.filterPrinterNamesAIX(names);
-
- ArrayList<String> printerNames = new ArrayList<String>();
- for ( int i=0; i < names.length; i++) {
- printerNames.add(names[i]);
- }
- return printerNames.toArray(new String[printerNames.size()]);
- }
-
- static String[] execCmd(final String command) {
- ArrayList<String> results = null;
- try {
- final String[] cmd = new String[3];
- if (isSysV() || isAIX()) {
- cmd[0] = "/usr/bin/sh";
- cmd[1] = "-c";
- cmd[2] = "env LC_ALL=C " + command;
- } else {
- cmd[0] = "/bin/sh";
- cmd[1] = "-c";
- cmd[2] = "LC_ALL=C " + command;
- }
-
- results = AccessController.doPrivileged(
- new PrivilegedExceptionAction<ArrayList<String>>() {
- public ArrayList<String> run() throws IOException {
-
- Process proc;
- BufferedReader bufferedReader = null;
- File f = Files.createTempFile("prn","xc").toFile();
- cmd[2] = cmd[2]+">"+f.getAbsolutePath();
-
- proc = Runtime.getRuntime().exec(cmd);
- try {
- boolean done = false; // in case of interrupt.
- while (!done) {
- try {
- proc.waitFor();
- done = true;
- } catch (InterruptedException e) {
- }
- }
-
- if (proc.exitValue() == 0) {
- FileReader reader = new FileReader(f);
- bufferedReader = new BufferedReader(reader);
- String line;
- ArrayList<String> results = new ArrayList<>();
- while ((line = bufferedReader.readLine())
- != null) {
- results.add(line);
- }
- return results;
- }
- } finally {
- f.delete();
- // promptly close all streams.
- if (bufferedReader != null) {
- bufferedReader.close();
- }
- proc.getInputStream().close();
- proc.getErrorStream().close();
- proc.getOutputStream().close();
- }
- return null;
- }
- });
- } catch (PrivilegedActionException e) {
- }
- if (results == null) {
- return new String[0];
- } else {
- return results.toArray(new String[results.size()]);
- }
- }
-
- private class PrinterChangeListener extends Thread {
-
- public void run() {
- int refreshSecs;
- while (true) {
- try {
- refreshServices();
- } catch (Exception se) {
- IPPPrintService.debug_println(debugPrefix+"Exception in refresh thread.");
- break;
- }
-
- if ((printServices != null) &&
- (printServices.length > minRefreshTime)) {
- // compute new refresh time 1 printer = 1 sec
- refreshSecs = printServices.length;
- } else {
- refreshSecs = minRefreshTime;
- }
- try {
- sleep(refreshSecs * 1000);
- } catch (InterruptedException e) {
- break;
- }
- }
- }
- }
-}
--- a/jdk/src/java.desktop/windows/classes/META-INF/services/javax.print.PrintServiceLookup Fri Oct 10 16:07:18 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Provider for Java Print Service
-sun.print.Win32PrintServiceLookup
--- a/jdk/src/java.desktop/windows/classes/META-INF/services/javax.print.StreamPrintServiceFactory Fri Oct 10 16:07:18 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Providers for Java 2D/JPS Stream print services.
-sun.print.PSStreamPrinterFactory
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java Fri Oct 10 16:07:18 2014 +0400
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java Fri Oct 10 09:03:28 2014 -0700
@@ -93,7 +93,7 @@
import sun.print.SunPageSelection;
import sun.print.Win32MediaTray;
import sun.print.Win32PrintService;
-import sun.print.Win32PrintServiceLookup;
+import sun.print.PrintServiceLookupProvider;
import sun.print.ServiceDialog;
import sun.print.DialogOwner;
@@ -454,7 +454,7 @@
// native printer is different !
// we update the current PrintService
try {
- setPrintService(Win32PrintServiceLookup.
+ setPrintService(PrintServiceLookupProvider.
getWin32PrintLUS().
getPrintServiceByName(printerName));
} catch (PrinterException e) {
@@ -628,7 +628,7 @@
String printerName = getNativePrintService();
if (printerName != null) {
- myService = Win32PrintServiceLookup.getWin32PrintLUS().
+ myService = PrintServiceLookupProvider.getWin32PrintLUS().
getPrintServiceByName(printerName);
// no need to call setNativePrintService as this name is
// currently set in native
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/windows/classes/sun/print/PrintServiceLookupProvider.java Fri Oct 10 09:03:28 2014 -0700
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+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 PrintServiceLookupProvider extends PrintServiceLookup {
+
+ 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 java.security.PrivilegedAction<Void>() {
+ public Void run() {
+ System.loadLibrary("awt");
+ return null;
+ }
+ });
+ }
+
+ /* The singleton win32 print lookup service.
+ * Code that is aware of this field and wants to use it must first
+ * see if its null, and if so instantiate it by calling a method such as
+ * javax.print.PrintServiceLookup.defaultPrintService() so that the
+ * same instance is stored there.
+ */
+ private static PrintServiceLookupProvider win32PrintLUS;
+
+ /* Think carefully before calling this. Preferably don't call it. */
+ public static PrintServiceLookupProvider getWin32PrintLUS() {
+ if (win32PrintLUS == null) {
+ /* This call is internally synchronized.
+ * When it returns an instance of this class will have
+ * been instantiated - else there's a JDK internal error.
+ */
+ PrintServiceLookup.lookupDefaultPrintService();
+ }
+ return win32PrintLUS;
+ }
+
+ public PrintServiceLookupProvider() {
+
+ if (win32PrintLUS == null) {
+ win32PrintLUS = this;
+
+ String osName = AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction("os.name"));
+ // There's no capability for Win98 to refresh printers.
+ // See "OpenPrinter" for more info.
+ if (osName != null && osName.startsWith("Windows 98")) {
+ return;
+ }
+ // start the printer listener thread
+ PrinterChangeListener thr = new PrinterChangeListener();
+ thr.setDaemon(true);
+ thr.start();
+ } /* else condition ought to never happen! */
+ }
+
+ /* 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 synchronized PrintService[] getPrintServices() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPrintJobAccess();
+ }
+ if (printServices == null) {
+ refreshServices();
+ }
+ return printServices;
+ }
+
+ private synchronized void refreshServices() {
+ printers = getAllPrinterNames();
+ if (printers == null) {
+ // In Windows it is safe to assume no default if printers == null so we
+ // don't get the default.
+ printServices = new PrintService[0];
+ return;
+ }
+
+ PrintService[] newServices = new PrintService[printers.length];
+ PrintService defService = getDefaultPrintService();
+ for (int p = 0; p < printers.length; p++) {
+ if (defService != null &&
+ printers[p].equals(defService.getName())) {
+ newServices[p] = defService;
+ } else {
+ if (printServices == null) {
+ newServices[p] = new Win32PrintService(printers[p]);
+ } else {
+ int j;
+ for (j = 0; j < printServices.length; j++) {
+ if ((printServices[j]!= null) &&
+ (printers[p].equals(printServices[j].getName()))) {
+ newServices[p] = printServices[j];
+ printServices[j] = null;
+ break;
+ }
+ }
+ if (j == printServices.length) {
+ newServices[p] = new Win32PrintService(printers[p]);
+ }
+ }
+ }
+ }
+
+ // Look for deleted services and invalidate these
+ if (printServices != null) {
+ for (int j=0; j < printServices.length; j++) {
+ if ((printServices[j] instanceof Win32PrintService) &&
+ (!printServices[j].equals(defaultPrintService))) {
+ ((Win32PrintService)printServices[j]).invalidateService();
+ }
+ }
+ }
+ printServices = newServices;
+ }
+
+
+ public synchronized PrintService getPrintServiceByName(String name) {
+
+ if (name == null || name.equals("")) {
+ return null;
+ } else {
+ /* getPrintServices() is now very fast. */
+ PrintService[] printServices = getPrintServices();
+ for (int i=0; i<printServices.length; i++) {
+ if (printServices[i].getName().equals(name)) {
+ return printServices[i];
+ }
+ }
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked") // Cast to Class<PrintServiceAttribute>
+ 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((Class<PrintServiceAttribute>)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<PrintService> 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 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 synchronized PrintService getDefaultPrintService() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPrintJobAccess();
+ }
+
+
+ // Windows does not have notification for a change in default
+ // so we always get the latest.
+ defaultPrinter = getDefaultPrinterName();
+ if (defaultPrinter == null) {
+ return null;
+ }
+
+ if ((defaultPrintService != null) &&
+ defaultPrintService.getName().equals(defaultPrinter)) {
+
+ return defaultPrintService;
+ }
+
+ // Not the same as default so proceed to get new PrintService.
+
+ // clear defaultPrintService
+ defaultPrintService = null;
+
+ if (printServices != null) {
+ for (int j=0; j<printServices.length; j++) {
+ if (defaultPrinter.equals(printServices[j].getName())) {
+ defaultPrintService = printServices[j];
+ break;
+ }
+ }
+ }
+
+ if (defaultPrintService == null) {
+ defaultPrintService = new Win32PrintService(defaultPrinter);
+ }
+ return defaultPrintService;
+ }
+
+ class PrinterChangeListener extends Thread {
+ long chgObj;
+ PrinterChangeListener() {
+ chgObj = notifyFirstPrinterChange(null);
+ }
+
+ public void run() {
+ if (chgObj != -1) {
+ while (true) {
+ // wait for configuration to change
+ if (notifyPrinterChange(chgObj) != 0) {
+ try {
+ refreshServices();
+ } catch (SecurityException se) {
+ break;
+ }
+ } else {
+ notifyClosePrinterChange(chgObj);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ private native String getDefaultPrinterName();
+ private native String[] getAllPrinterNames();
+ private native long notifyFirstPrinterChange(String printer);
+ private native void notifyClosePrinterChange(long chgObj);
+ private native int notifyPrinterChange(long chgObj);
+}
--- a/jdk/src/java.desktop/windows/classes/sun/print/Win32PrintServiceLookup.java Fri Oct 10 16:07:18 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,349 +0,0 @@
-/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-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 {
-
- 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 java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("awt");
- return null;
- }
- });
- }
-
- /* The singleton win32 print lookup service.
- * Code that is aware of this field and wants to use it must first
- * see if its null, and if so instantiate it by calling a method such as
- * javax.print.PrintServiceLookup.defaultPrintService() so that the
- * same instance is stored there.
- */
- private static Win32PrintServiceLookup win32PrintLUS;
-
- /* Think carefully before calling this. Preferably don't call it. */
- public static Win32PrintServiceLookup getWin32PrintLUS() {
- if (win32PrintLUS == null) {
- /* This call is internally synchronized.
- * When it returns an instance of this class will have
- * been instantiated - else there's a JDK internal error.
- */
- PrintServiceLookup.lookupDefaultPrintService();
- }
- return win32PrintLUS;
- }
-
- public Win32PrintServiceLookup() {
-
- if (win32PrintLUS == null) {
- win32PrintLUS = this;
-
- String osName = AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("os.name"));
- // There's no capability for Win98 to refresh printers.
- // See "OpenPrinter" for more info.
- if (osName != null && osName.startsWith("Windows 98")) {
- return;
- }
- // start the printer listener thread
- PrinterChangeListener thr = new PrinterChangeListener();
- thr.setDaemon(true);
- thr.start();
- } /* else condition ought to never happen! */
- }
-
- /* 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 synchronized PrintService[] getPrintServices() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPrintJobAccess();
- }
- if (printServices == null) {
- refreshServices();
- }
- return printServices;
- }
-
- private synchronized void refreshServices() {
- printers = getAllPrinterNames();
- if (printers == null) {
- // In Windows it is safe to assume no default if printers == null so we
- // don't get the default.
- printServices = new PrintService[0];
- return;
- }
-
- PrintService[] newServices = new PrintService[printers.length];
- PrintService defService = getDefaultPrintService();
- for (int p = 0; p < printers.length; p++) {
- if (defService != null &&
- printers[p].equals(defService.getName())) {
- newServices[p] = defService;
- } else {
- if (printServices == null) {
- newServices[p] = new Win32PrintService(printers[p]);
- } else {
- int j;
- for (j = 0; j < printServices.length; j++) {
- if ((printServices[j]!= null) &&
- (printers[p].equals(printServices[j].getName()))) {
- newServices[p] = printServices[j];
- printServices[j] = null;
- break;
- }
- }
- if (j == printServices.length) {
- newServices[p] = new Win32PrintService(printers[p]);
- }
- }
- }
- }
-
- // Look for deleted services and invalidate these
- if (printServices != null) {
- for (int j=0; j < printServices.length; j++) {
- if ((printServices[j] instanceof Win32PrintService) &&
- (!printServices[j].equals(defaultPrintService))) {
- ((Win32PrintService)printServices[j]).invalidateService();
- }
- }
- }
- printServices = newServices;
- }
-
-
- public synchronized PrintService getPrintServiceByName(String name) {
-
- if (name == null || name.equals("")) {
- return null;
- } else {
- /* getPrintServices() is now very fast. */
- PrintService[] printServices = getPrintServices();
- for (int i=0; i<printServices.length; i++) {
- if (printServices[i].getName().equals(name)) {
- return printServices[i];
- }
- }
- return null;
- }
- }
-
- @SuppressWarnings("unchecked") // Cast to Class<PrintServiceAttribute>
- 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((Class<PrintServiceAttribute>)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<PrintService> 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 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 synchronized PrintService getDefaultPrintService() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPrintJobAccess();
- }
-
-
- // Windows does not have notification for a change in default
- // so we always get the latest.
- defaultPrinter = getDefaultPrinterName();
- if (defaultPrinter == null) {
- return null;
- }
-
- if ((defaultPrintService != null) &&
- defaultPrintService.getName().equals(defaultPrinter)) {
-
- return defaultPrintService;
- }
-
- // Not the same as default so proceed to get new PrintService.
-
- // clear defaultPrintService
- defaultPrintService = null;
-
- if (printServices != null) {
- for (int j=0; j<printServices.length; j++) {
- if (defaultPrinter.equals(printServices[j].getName())) {
- defaultPrintService = printServices[j];
- break;
- }
- }
- }
-
- if (defaultPrintService == null) {
- defaultPrintService = new Win32PrintService(defaultPrinter);
- }
- return defaultPrintService;
- }
-
- class PrinterChangeListener extends Thread {
- long chgObj;
- PrinterChangeListener() {
- chgObj = notifyFirstPrinterChange(null);
- }
-
- public void run() {
- if (chgObj != -1) {
- while (true) {
- // wait for configuration to change
- if (notifyPrinterChange(chgObj) != 0) {
- try {
- refreshServices();
- } catch (SecurityException se) {
- break;
- }
- } else {
- notifyClosePrinterChange(chgObj);
- break;
- }
- }
- }
- }
- }
-
- private native String getDefaultPrinterName();
- private native String[] getAllPrinterNames();
- private native long notifyFirstPrinterChange(String printer);
- private native void notifyClosePrinterChange(long chgObj);
- private native int notifyPrinterChange(long chgObj);
-}
--- a/jdk/src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp Fri Oct 10 16:07:18 2014 +0400
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp Fri Oct 10 09:03:28 2014 -0700
@@ -68,7 +68,7 @@
extern "C" {
JNIEXPORT jstring JNICALL
-Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_getDefaultPrinterName(JNIEnv *env,
jobject peer)
{
TRY;
@@ -119,7 +119,7 @@
JNIEXPORT jobjectArray JNICALL
-Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_getAllPrinterNames(JNIEnv *env,
jobject peer)
{
TRY;
@@ -176,7 +176,7 @@
JNIEXPORT jlong JNICALL
-Java_sun_print_Win32PrintServiceLookup_notifyFirstPrinterChange(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_notifyFirstPrinterChange(JNIEnv *env,
jobject peer,
jstring printer) {
HANDLE hPrinter;
@@ -210,7 +210,7 @@
JNIEXPORT void JNICALL
-Java_sun_print_Win32PrintServiceLookup_notifyClosePrinterChange(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_notifyClosePrinterChange(JNIEnv *env,
jobject peer,
jlong chgObject) {
FindClosePrinterChangeNotification((HANDLE)chgObject);
@@ -218,7 +218,7 @@
JNIEXPORT jint JNICALL
-Java_sun_print_Win32PrintServiceLookup_notifyPrinterChange(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_notifyPrinterChange(JNIEnv *env,
jobject peer,
jlong chgObject) {
DWORD dwChange;