< prev index next >

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

Print this page

        

*** 42,52 **** /* constants for DeviceCapability buffer lengths */ #define PAPERNAME_LENGTH 64 #define TRAYNAME_LENGTH 24 - static BOOL IsSupportedLevel(HANDLE hPrinter, DWORD dwLevel) { BOOL isSupported = FALSE; DWORD cbBuf = 0; LPBYTE pPrinter = NULL; --- 42,51 ----
*** 115,124 **** --- 114,179 ---- } CATCH_BAD_ALLOC_RET(NULL); } + JNIEXPORT jlong JNICALL + Java_sun_print_PrintServiceLookupProvider_notifyFirstPrinterChange(JNIEnv *env, + jobject peer, + jstring printer) { + HANDLE hPrinter; + + LPTSTR printerName = NULL; + if (printer != NULL) { + printerName = (LPTSTR)JNU_GetStringPlatformChars(env, + printer, + NULL); + JNU_ReleaseStringPlatformChars(env, printer, printerName); + } + + // printerName - "Win NT/2K/XP: If NULL, it indicates the local printer + // server" - MSDN. Win9x : OpenPrinter returns 0. + BOOL ret = OpenPrinter(printerName, &hPrinter, NULL); + if (!ret) { + return (jlong)-1; + } + + // PRINTER_CHANGE_PRINTER = PRINTER_CHANGE_ADD_PRINTER | + // PRINTER_CHANGE_SET_PRINTER | + // PRINTER_CHANGE_DELETE_PRINTER | + // PRINTER_CHANGE_FAILED_CONNECTION_PRINTER + HANDLE chgObj = FindFirstPrinterChangeNotification(hPrinter, + PRINTER_CHANGE_PRINTER, + 0, + NULL); + return (chgObj == INVALID_HANDLE_VALUE) ? (jlong)-1 : (jlong)chgObj; + } + + + + JNIEXPORT void JNICALL + Java_sun_print_PrintServiceLookupProvider_notifyClosePrinterChange(JNIEnv *env, + jobject peer, + jlong chgObject) { + FindClosePrinterChangeNotification((HANDLE)chgObject); + } + + + JNIEXPORT jint JNICALL + Java_sun_print_PrintServiceLookupProvider_notifyPrinterChange(JNIEnv *env, + jobject peer, + jlong chgObject) { + DWORD dwChange; + + DWORD ret = WaitForSingleObject((HANDLE)chgObject, INFINITE); + if (ret == WAIT_OBJECT_0) { + return(FindNextPrinterChangeNotification((HANDLE)chgObject, + &dwChange, NULL, NULL)); + } else { + return 0; + } + } JNIEXPORT jobjectArray JNICALL Java_sun_print_PrintServiceLookupProvider_getAllPrinterNames(JNIEnv *env, jobject peer) {
*** 172,240 **** return nameArray; CATCH_BAD_ALLOC_RET(NULL); } ! JNIEXPORT jlong JNICALL ! Java_sun_print_PrintServiceLookupProvider_notifyFirstPrinterChange(JNIEnv *env, ! jobject peer, ! jstring printer) { ! HANDLE hPrinter; ! ! LPTSTR printerName = NULL; ! if (printer != NULL) { ! printerName = (LPTSTR)JNU_GetStringPlatformChars(env, ! printer, ! NULL); ! JNU_ReleaseStringPlatformChars(env, printer, printerName); ! } ! // printerName - "Win NT/2K/XP: If NULL, it indicates the local printer ! // server" - MSDN. Win9x : OpenPrinter returns 0. ! BOOL ret = OpenPrinter(printerName, &hPrinter, NULL); ! if (!ret) { ! return (jlong)-1; } ! // PRINTER_CHANGE_PRINTER = PRINTER_CHANGE_ADD_PRINTER | ! // PRINTER_CHANGE_SET_PRINTER | ! // PRINTER_CHANGE_DELETE_PRINTER | ! // PRINTER_CHANGE_FAILED_CONNECTION_PRINTER ! HANDLE chgObj = FindFirstPrinterChangeNotification(hPrinter, ! PRINTER_CHANGE_PRINTER, ! 0, ! NULL); ! return (chgObj == INVALID_HANDLE_VALUE) ? (jlong)-1 : (jlong)chgObj; ! } ! JNIEXPORT void JNICALL ! Java_sun_print_PrintServiceLookupProvider_notifyClosePrinterChange(JNIEnv *env, ! jobject peer, ! jlong chgObject) { ! FindClosePrinterChangeNotification((HANDLE)chgObject); ! } ! JNIEXPORT jint JNICALL ! Java_sun_print_PrintServiceLookupProvider_notifyPrinterChange(JNIEnv *env, ! jobject peer, ! jlong chgObject) { ! DWORD dwChange; ! DWORD ret = WaitForSingleObject((HANDLE)chgObject, INFINITE); ! if (ret == WAIT_OBJECT_0) { ! return(FindNextPrinterChangeNotification((HANDLE)chgObject, ! &dwChange, NULL, NULL)); ! } else { ! return 0; ! } } - JNIEXPORT jfloatArray JNICALL Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env, jobject peer, jstring printer, jint papersize) --- 227,308 ---- return nameArray; CATCH_BAD_ALLOC_RET(NULL); } + 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, jint papersize)
< prev index next >