< prev index next >

src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp

Print this page

        

@@ -230,10 +230,81 @@
     } else {
         return 0;
     }
 }
 
+JNIEXPORT jobjectArray JNICALL
+Java_sun_print_PrintServiceLookupProvider_getRemotePrintersNames(JNIEnv *env,
+                                                           jobject peer)
+{
+    TRY;
+
+    int remotePrintersCount = 0;
+    DWORD cbNeeded = 0;
+    DWORD cReturned = 0;
+    LPBYTE pPrinterEnum = NULL;
+    LPBYTE pNetworkPrinterLoc = NULL;
+
+    jstring utf_str;
+    jclass clazz = env->FindClass("java/lang/String");
+    if (clazz == NULL) {
+        return NULL;
+    }
+    jobjectArray nameArray;
+
+    try {
+        ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
+                       NULL, 4, NULL, 0, &cbNeeded, &cReturned);
+        pPrinterEnum = new BYTE[cbNeeded];
+        pNetworkPrinterLoc = new BYTE[cbNeeded/sizeof(PRINTER_INFO_4)];
+        ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
+                       NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded,
+                       &cReturned);
+
+        if (cReturned > 0) {
+            for (DWORD i = 0; i < cReturned; i++) {
+                PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) (pPrinterEnum + i * sizeof(PRINTER_INFO_4));
+
+                // PRINTER_ATTRIBUTE_NETWORK = 0x00000010
+                // Store the network printers indexes
+                if (info4->Attributes & 0x00000010) {
+                    pNetworkPrinterLoc[remotePrintersCount++] = i;
+                }
+            }
+
+            // 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
+        for (int i = 0; i < remotePrintersCount; i++) {
+            PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
+                (pPrinterEnum + pNetworkPrinterLoc[i] * sizeof(PRINTER_INFO_4));
+            utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
+            if (utf_str == NULL) {
+                throw std::bad_alloc();
+            }
+            env->SetObjectArrayElement(nameArray, i, utf_str);
+            env->DeleteLocalRef(utf_str);
+        }
+    } catch (std::bad_alloc&) {
+        delete [] pPrinterEnum;
+        delete [] pNetworkPrinterLoc;
+        throw;
+    }
+
+    delete [] pPrinterEnum;
+    delete [] pNetworkPrinterLoc;
+    return nameArray;
+
+    CATCH_BAD_ALLOC_RET(NULL);
+}
 
 JNIEXPORT jfloatArray JNICALL
 Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
                                                   jobject peer,
                                                   jstring printer,
< prev index next >