src/windows/classes/sun/print/Win32PrintService.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, 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

@@ -26,15 +26,12 @@
 package sun.print;
 
 import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.net.URL;
-
-import java.util.Vector;
+import java.util.ArrayList;
 import java.util.HashMap;
-
 import javax.print.DocFlavor;
 import javax.print.DocPrintJob;
 import javax.print.PrintService;
 import javax.print.ServiceUIFactory;
 import javax.print.attribute.Attribute;

@@ -67,17 +64,13 @@
 import javax.print.attribute.standard.PrinterStateReasons;
 import javax.print.attribute.standard.Severity;
 import javax.print.attribute.standard.Sides;
 import javax.print.attribute.standard.ColorSupported;
 import javax.print.attribute.standard.PrintQuality;
-import javax.print.attribute.ResolutionSyntax;
 import javax.print.attribute.standard.PrinterResolution;
 import javax.print.attribute.standard.SheetCollate;
 import javax.print.event.PrintServiceAttributeListener;
-import java.util.ArrayList;
-
-import sun.print.SunPrinterJobService;
 
 public class Win32PrintService implements PrintService, AttributeUpdater,
                                           SunPrinterJobService {
 
     public static MediaSize[] predefMedia;

@@ -308,26 +301,25 @@
         return Win32MediaTray.AUTO;
     }
 
     public MediaSizeName findWin32Media(int dmIndex) {
         if (dmIndex >= 1 && dmIndex <= dmPaperToPrintService.length) {
+            return dmPaperToPrintService[dmIndex - 1];
+        }
            switch(dmIndex) {
             /* matching media sizes with indices beyond
                dmPaperToPrintService's length */
             case DMPAPER_A2:
                 return MediaSizeName.ISO_A2;
             case DMPAPER_A6:
                 return MediaSizeName.ISO_A6;
             case DMPAPER_B6_JIS:
                 return MediaSizeName.JIS_B6;
             default:
-                return dmPaperToPrintService[dmIndex - 1];
-            }
-        }
-
         return null;
     }
+    }
 
     private boolean addToUniqueList(ArrayList msnList, MediaSizeName mediaName) {
         MediaSizeName msn;
         for (int i=0; i< msnList.size(); i++) {
             msn = (MediaSizeName)msnList.get(i);

@@ -366,11 +358,12 @@
         idList = new ArrayList();
         for (int i=0; i < media.length; i++) {
             idList.add(Integer.valueOf(media[i]));
         }
 
-        mediaSizes = getMediaSizes(idList, media);
+        ArrayList<String> dmPaperNameList = new ArrayList<String>();
+        mediaSizes = getMediaSizes(idList, media, dmPaperNameList);
         for (int i = 0; i < idList.size(); i++) {
 
             // match Win ID with our predefined ID using table
             mediaName = findWin32Media(((Integer)idList.get(i)).intValue());
             // Verify that this standard size is the same size as that

@@ -395,10 +388,25 @@
             }
 
             // Add mediaName to the msnList
             if (mediaName != null) {
                 added = addToUniqueList(msnList, mediaName);
+                /* The following block allows to add such media names to the list, whose sizes
+                 * matched with media sizes predefined in JDK, while whose paper IDs did not.
+                 */
+                if (!added && (idList.size() == dmPaperNameList.size())) {
+                    Win32MediaSize wms = Win32MediaSize.findMediaName(dmPaperNameList.get(i));
+                    if ((wms == null) && (idList.size() == mediaSizes.length)) {
+                        wms = new Win32MediaSize(dmPaperNameList.get(i), (Integer)idList.get(i));
+                        mediaSizes[i] = new MediaSize(mediaSizes[i].getX(MediaSize.MM),
+                            mediaSizes[i].getY(MediaSize.MM), MediaSize.MM, wms);
+                    }
+                    if (wms != null) {
+                        mediaName = wms;
+                        added = addToUniqueList(msnList, mediaName);
+                    }
+                }
             }
         }
 
         // init mediaSizeNames
         mediaSizeNames = new MediaSizeName[msnList.size()];

@@ -586,11 +594,15 @@
         }
         return null;
     }
 
 
-    private MediaSize[] getMediaSizes(ArrayList idList, int[] media) {
+    private MediaSize[] getMediaSizes(ArrayList idList, int[] media, ArrayList<String> dmPaperNameList) {
+        if (dmPaperNameList == null) {
+            dmPaperNameList = new ArrayList<String>();
+        }
+
         String prnPort = getPort();
         int[] mediaSz = getAllMediaSizes(printer, prnPort);
         String[] winMediaNames = getAllMediaNames(printer, prnPort);
         MediaSizeName msn = null;
         MediaSize ms = null;

@@ -625,24 +637,27 @@
             ms = MediaSize.getMediaSizeForName(msn);
           }
 
           if (ms != null) {
             msList.add(ms);
+                dmPaperNameList.add(winMediaNames[i]);
           } else {
-              Win32MediaSize wms =
-                new Win32MediaSize(winMediaNames[i], media[i]);
+                Win32MediaSize wms = Win32MediaSize.findMediaName(winMediaNames[i]);
+                if (wms == null) {
+                    wms = new Win32MediaSize(winMediaNames[i], media[i]);
+                }
             try {
               ms = new MediaSize(wid, ht, MediaSize.MM, wms);
               msList.add(ms);
+                    dmPaperNameList.add(winMediaNames[i]);
             } catch(IllegalArgumentException e) {
               if (nMedia == media.length) {
                   Integer remObj = Integer.valueOf(media[i]);
                 idList.remove(idList.indexOf(remObj));
               }
             }
           }
-
         }
 
         MediaSize[] arr2 = new MediaSize[msList.size()];
         msList.toArray(arr2);
 

@@ -1625,10 +1640,18 @@
     private synchronized static int nextValue(String name) {
       winStringTable.add(name);
       return (winStringTable.size()-1);
     }
 
+    public static synchronized Win32MediaSize findMediaName(String name) {
+        int nameIndex = winStringTable.indexOf(name);
+        if (nameIndex != -1) {
+            return (Win32MediaSize)winEnumTable.get(nameIndex);
+        }
+        return null;
+    }
+
     public Win32MediaSize(String name, int dmPaper) {
         super(nextValue(name));
         dmPaperID = dmPaper;
         winEnumTable.add(this);
     }