From 77dfb26ed0d6f091e9af0c874a81edd601eb4576 Mon Sep 17 00:00:00 2001 From: sveerabhadra Date: Mon, 25 Feb 2019 11:02:53 +0530 Subject: [PATCH] 8212202: [Windows] Exception if no printers are installed. Reviewed-by: prr --- .../sun/print/PrintServiceLookupProvider.java | 38 +++++++++++++++---- .../native/sun/windows/WPrinterJob.cpp | 22 +++++++---- .../RemotePrinterStatusRefresh.java | 2 +- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/windows/classes/sun/print/PrintServiceLookupProvider.java b/src/windows/classes/sun/print/PrintServiceLookupProvider.java index 0828043f5..c2ee4cf41 100644 --- a/src/windows/classes/sun/print/PrintServiceLookupProvider.java +++ b/src/windows/classes/sun/print/PrintServiceLookupProvider.java @@ -400,18 +400,36 @@ public class PrintServiceLookupProvider extends PrintServiceLookup { list. */ class RemotePrinterChangeListener extends Thread { - private String[] prevRemotePrinters; + private String[] prevRemotePrinters = null; RemotePrinterChangeListener() { prevRemotePrinters = getRemotePrintersNames(); } boolean doCompare(String[] str1, String[] str2) { + if (str1 == null && str2 == null) { + return false; + } else if (str1 == null || str2 == null) { + return true; + } + if (str1.length != str2.length) { return true; } else { for (int i = 0;i < str1.length;i++) { for (int j = 0;j < str2.length;j++) { + // skip if both are nulls + if (str1[i] == null && str2[j] == null) { + continue; + } + + // return true if there is a 'difference' but + // no need to access the individual string + if (str1[i] == null || str2[j] == null) { + return true; + } + + // do comparison only if they are non-nulls if (!str1[i].equals(str2[j])) { return true; } @@ -425,15 +443,19 @@ public class PrintServiceLookupProvider extends PrintServiceLookup { @Override public void run() { while (true) { - String[] currentRemotePrinters = getRemotePrintersNames(); - if (doCompare(prevRemotePrinters, currentRemotePrinters)) { + if (prevRemotePrinters != null && prevRemotePrinters.length > 0) { + String[] currentRemotePrinters = getRemotePrintersNames(); + if (doCompare(prevRemotePrinters, currentRemotePrinters)) { - // updated the printers data - // printers list now contains both local and network printer data - refreshServices(); + // updated the printers data + // printers list now contains both local and network printer data + refreshServices(); - // store the current data for next comparison - prevRemotePrinters = currentRemotePrinters; + // store the current data for next comparison + prevRemotePrinters = currentRemotePrinters; + } + } else { + prevRemotePrinters = getRemotePrintersNames(); } try { diff --git a/src/windows/native/sun/windows/WPrinterJob.cpp b/src/windows/native/sun/windows/WPrinterJob.cpp index 2ca9f9cb5..4d492dd83 100644 --- a/src/windows/native/sun/windows/WPrinterJob.cpp +++ b/src/windows/native/sun/windows/WPrinterJob.cpp @@ -249,7 +249,7 @@ Java_sun_print_PrintServiceLookupProvider_getRemotePrintersNames(JNIEnv *env, if (clazz == NULL) { return NULL; } - jobjectArray nameArray; + jobjectArray nameArray = NULL; try { ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, @@ -270,13 +270,14 @@ Java_sun_print_PrintServiceLookupProvider_getRemotePrintersNames(JNIEnv *env, } } - // Allocate space only for the network type printers - nameArray = env->NewObjectArray(remotePrintersCount, clazz, NULL); - if (nameArray == NULL) { - throw std::bad_alloc(); + // return remote printers only if the list contains it. + if (remotePrintersCount > 0) { + // Allocate space only for the network type printers + nameArray = env->NewObjectArray(remotePrintersCount, clazz, NULL); + if (nameArray == NULL) { + throw std::bad_alloc(); + } } - } else { - nameArray = NULL; } // Loop thro' network printers list only @@ -298,7 +299,12 @@ Java_sun_print_PrintServiceLookupProvider_getRemotePrintersNames(JNIEnv *env, delete [] pPrinterEnum; delete [] pNetworkPrinterLoc; - return nameArray; + + if (nameArray != NULL) { + return nameArray; + } else { + return env->NewObjectArray(0, clazz, NULL); + } CATCH_BAD_ALLOC_RET(NULL); } diff --git a/test/jdk/java/awt/print/RemotePrinterStatusRefresh/RemotePrinterStatusRefresh.java b/test/jdk/java/awt/print/RemotePrinterStatusRefresh/RemotePrinterStatusRefresh.java index 296af29f9..43cb268f7 100644 --- a/test/jdk/java/awt/print/RemotePrinterStatusRefresh/RemotePrinterStatusRefresh.java +++ b/test/jdk/java/awt/print/RemotePrinterStatusRefresh/RemotePrinterStatusRefresh.java @@ -23,7 +23,7 @@ /** * @test - * @bug 8153732 + * @bug 8153732 8212202 * @requires (os.family == "Windows") * @summary Windows remote printer changes do not reflect in lookupPrintServices() * @ignore Requires a new network printer installation\removal -- GitLab