6678161: Printing to remote non-Postscript printer does not work in Linux
authorjgodinez
Thu, 10 Apr 2008 13:57:15 -0700
changeset 542 eb75700cdf75
parent 536 a29f1f8c0983
child 543 f0e156a39c75
6678161: Printing to remote non-Postscript printer does not work in Linux Reviewed-by: prr, tdv
jdk/src/solaris/classes/sun/print/CUPSPrinter.java
jdk/src/solaris/classes/sun/print/IPPPrintService.java
jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java
--- a/jdk/src/solaris/classes/sun/print/CUPSPrinter.java	Thu Apr 10 10:23:47 2008 -0700
+++ b/jdk/src/solaris/classes/sun/print/CUPSPrinter.java	Thu Apr 10 13:57:15 2008 -0700
@@ -333,7 +333,7 @@
                     AttributeClass.ATTRIBUTES_NATURAL_LANGUAGE,
                     new AttributeClass("requested-attributes",
                                        AttributeClass.TAG_KEYWORD,
-                                       "printer-name")
+                                       "printer-uri-supported")
                 };
 
                 if (IPPPrintService.writeIPPRequest(os,
@@ -354,7 +354,7 @@
                     ArrayList printerNames = new ArrayList();
                     for (int i=0; i< responseMap.length; i++) {
                         AttributeClass attribClass = (AttributeClass)
-                            responseMap[i].get("printer-name");
+                            responseMap[i].get("printer-uri-supported");
 
                         if (attribClass != null) {
                             String nameStr = attribClass.getStringValue();
--- a/jdk/src/solaris/classes/sun/print/IPPPrintService.java	Thu Apr 10 10:23:47 2008 -0700
+++ b/jdk/src/solaris/classes/sun/print/IPPPrintService.java	Thu Apr 10 13:57:15 2008 -0700
@@ -335,6 +335,38 @@
     }
 
 
+    IPPPrintService(String name, String uriStr, boolean isCups) {
+        if ((name == null) || (uriStr == null)){
+            throw new IllegalArgumentException("null uri or printer name");
+        }
+        printer = name;
+        supportedDocFlavors = null;
+        supportedCats = null;
+        mediaSizeNames = null;
+        customMediaSizeNames = null;
+        mediaTrays = null;
+        cps = null;
+        init = false;
+        defaultMediaIndex = -1;
+        try {
+            myURL =
+                new URL(uriStr.replaceFirst("ipp", "http"));
+        } catch (Exception e) {
+            IPPPrintService.debug_println(debugPrefix+
+                                          " IPPPrintService, myURL="+
+                                          myURL+" Exception= "+
+                                          e);
+        }
+
+        isCupsPrinter = isCups;
+        try {
+            myURI =  new URI(uriStr);
+            debug_println(debugPrefix+"IPPPrintService myURI : "+myURI);
+        } catch (java.net.URISyntaxException e) {
+            throw new IllegalArgumentException("invalid uri");
+        }
+    }
+
 
     /*
      * Initialize mediaSizeNames, mediaTrays and other attributes.
@@ -375,7 +407,7 @@
                     return;
                 } catch (Exception e) {
                     IPPPrintService.debug_println(debugPrefix+
-                                       " error creating CUPSPrinter");
+                                       " error creating CUPSPrinter e="+e);
                 }
             }
 
@@ -807,6 +839,18 @@
 
                             docList.addAll(Arrays.asList(flavors));
 
+                            if (isCupsPrinter) {
+                            /*
+                              Always add Pageable and Printable for CUPS
+                              since it uses Filters to convert from Postscript
+                              to device printer language.
+                             */
+                                docList.add(
+                                        DocFlavor.SERVICE_FORMATTED.PAGEABLE);
+                                docList.add(
+                                        DocFlavor.SERVICE_FORMATTED.PRINTABLE);
+                            }
+
                             if (mimeType.equals("text/plain") &&
                                 addHostEncoding) {
                                 docList.add(Arrays.asList(textPlainHost));
@@ -820,11 +864,6 @@
                             } else if (mimeType.equals("image/jpeg")) {
                                 jpgImagesAdded = true;
                             } else if (mimeType.indexOf("postscript") != -1) {
-                                docList.add(
-                                      DocFlavor.SERVICE_FORMATTED.PAGEABLE);
-                                docList.add(
-                                      DocFlavor.SERVICE_FORMATTED.PRINTABLE);
-
                                 psSupported = true;
                             }
                             break;
@@ -841,7 +880,7 @@
                 }
 
                 // check if we need to add image DocFlavors
-                if (psSupported) {
+                if (psSupported || isCupsPrinter) {
                     if (!jpgImagesAdded) {
                         docList.addAll(Arrays.asList(imageJPG));
                     }
@@ -1540,10 +1579,7 @@
             if (isCupsPrinter) {
                 try {
                     urlConnection = getIPPConnection(
-                                             new URL("http://"+
-                                                     CUPSPrinter.getServer()+":"+
-                                                     CUPSPrinter.getPort()+
-                                                     "/printers/"+printer+".ppd"));
+                                             new URL(myURL+".ppd"));
 
                    InputStream is = urlConnection.getInputStream();
                    if (is != null) {
@@ -1559,6 +1595,11 @@
                        }
                     }
                 } catch (java.io.IOException e) {
+                    debug_println(" isPostscript, e= "+e);
+                    /* if PPD is not found, this may be a raw printer
+                       and in this case it is assumed that it is a
+                       Postscript printer */
+                    // do nothing
                 }
             }
         }
--- a/jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java	Thu Apr 10 10:23:47 2008 -0700
+++ b/jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java	Thu Apr 10 13:57:15 2008 -0700
@@ -196,11 +196,20 @@
 
     // refreshes "printServices"
     public synchronized void refreshServices() {
-        String[] printers; /* excludes the default printer */
+        /* excludes the default printer */
+        String[] printers = null; // array of printer names
+        String[] printerURIs = null; //array of printer URIs
 
         getDefaultPrintService();
         if (CUPSPrinter.isCupsRunning()) {
-            printers = CUPSPrinter.getAllPrinters();
+            printerURIs = CUPSPrinter.getAllPrinters();
+            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 (isSysV()) {
                 printers = getAllPrinterNamesSysV();
@@ -236,12 +245,9 @@
 
                     if (CUPSPrinter.isCupsRunning()) {
                         try {
-                            URL serviceURL =
-                                new URL("http://"+
-                                        CUPSPrinter.getServer()+":"+
-                                        CUPSPrinter.getPort()+"/"+printers[p]);
-                            printerList.add(new IPPPrintService( printers[p],
-                                                                 serviceURL));
+                            printerList.add(new IPPPrintService(printers[p],
+                                                                printerURIs[p],
+                                                                true));
                         } catch (Exception e) {
                             IPPPrintService.debug_println(debugPrefix+
                                                           " getAllPrinters Exception "+
@@ -265,12 +271,10 @@
                     if (j == printServices.length) {      // not found?
                         if (CUPSPrinter.isCupsRunning()) {
                             try {
-                                URL serviceURL =
-                                    new URL("http://"+
-                                        CUPSPrinter.getServer()+":"+
-                                        CUPSPrinter.getPort()+"/"+printers[p]);
-                                printerList.add(new IPPPrintService( printers[p],
-                                                                 serviceURL));
+                                printerList.add(new IPPPrintService(
+                                                               printers[p],
+                                                               printerURIs[p],
+                                                               true));
                             } catch (Exception e) {
                                 IPPPrintService.debug_println(debugPrefix+
                                                               " getAllPrinters Exception "+