提交 77dfb26e 编写于 作者: S sveerabhadra

8212202: [Windows] Exception if no printers are installed.

Reviewed-by: prr
上级 5b8a6848
......@@ -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 {
......
......@@ -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);
}
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册