< prev index next >

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

Print this page




 233 }
 234 
 235 JNIEXPORT jobjectArray JNICALL
 236 Java_sun_print_PrintServiceLookupProvider_getRemotePrintersNames(JNIEnv *env,
 237                                                            jobject peer)
 238 {
 239     TRY;
 240 
 241     int remotePrintersCount = 0;
 242     DWORD cbNeeded = 0;
 243     DWORD cReturned = 0;
 244     LPBYTE pPrinterEnum = NULL;
 245     LPBYTE pNetworkPrinterLoc = NULL;
 246 
 247     jstring utf_str;
 248     jclass clazz = env->FindClass("java/lang/String");
 249     if (clazz == NULL) {
 250         return NULL;
 251     }
 252     jobjectArray nameArray;

 253 
 254     try {
 255         ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 256                        NULL, 4, NULL, 0, &cbNeeded, &cReturned);
 257         pPrinterEnum = new BYTE[cbNeeded];
 258         pNetworkPrinterLoc = new BYTE[cbNeeded/sizeof(PRINTER_INFO_4)];
 259         ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 260                        NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded,
 261                        &cReturned);
 262 
 263         if (cReturned > 0) {
 264             for (DWORD i = 0; i < cReturned; i++) {
 265                 PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) (pPrinterEnum + i * sizeof(PRINTER_INFO_4));
 266 
 267                 // Store the network printers indexes
 268                 if (info4->Attributes & PRINTER_ATTRIBUTE_NETWORK) {
 269                     pNetworkPrinterLoc[remotePrintersCount++] = i;
 270                 }
 271             }
 272 


 273             // Allocate space only for the network type printers
 274             nameArray = env->NewObjectArray(remotePrintersCount, clazz, NULL);
 275             if (nameArray == NULL) {
 276                 throw std::bad_alloc();
 277             }
 278         } else {
 279             nameArray = NULL;
 280         }
 281 
 282         // Loop thro' network printers list only
 283         for (int i = 0; i < remotePrintersCount; i++) {
 284             PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
 285                 (pPrinterEnum + pNetworkPrinterLoc[i] * sizeof(PRINTER_INFO_4));
 286             utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
 287             if (utf_str == NULL) {
 288                 throw std::bad_alloc();
 289             }
 290             env->SetObjectArrayElement(nameArray, i, utf_str);
 291             env->DeleteLocalRef(utf_str);
 292         }
 293     } catch (std::bad_alloc&) {
 294         delete [] pPrinterEnum;
 295         delete [] pNetworkPrinterLoc;
 296         throw;
 297     }
 298 
 299     delete [] pPrinterEnum;
 300     delete [] pNetworkPrinterLoc;


 301     return nameArray;



 302 
 303     CATCH_BAD_ALLOC_RET(NULL);
 304 }
 305 
 306 JNIEXPORT jfloatArray JNICALL
 307 Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
 308                                                   jobject peer,
 309                                                   jstring printer,
 310                                                   jint  papersize)
 311 {
 312     TRY;
 313 
 314     LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
 315                                                             printer, NULL);
 316     if (printerName == NULL) {
 317         return NULL;
 318     }
 319 
 320     jfloatArray printableArray = NULL;
 321 




 233 }
 234 
 235 JNIEXPORT jobjectArray JNICALL
 236 Java_sun_print_PrintServiceLookupProvider_getRemotePrintersNames(JNIEnv *env,
 237                                                            jobject peer)
 238 {
 239     TRY;
 240 
 241     int remotePrintersCount = 0;
 242     DWORD cbNeeded = 0;
 243     DWORD cReturned = 0;
 244     LPBYTE pPrinterEnum = NULL;
 245     LPBYTE pNetworkPrinterLoc = NULL;
 246 
 247     jstring utf_str;
 248     jclass clazz = env->FindClass("java/lang/String");
 249     if (clazz == NULL) {
 250         return NULL;
 251     }
 252     jobjectArray nameArray;
 253     jobjectArray emptyArray = env->NewObjectArray(0, clazz, NULL);
 254 
 255     try {
 256         ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 257                        NULL, 4, NULL, 0, &cbNeeded, &cReturned);
 258         pPrinterEnum = new BYTE[cbNeeded];
 259         pNetworkPrinterLoc = new BYTE[cbNeeded/sizeof(PRINTER_INFO_4)];
 260         ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 261                        NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded,
 262                        &cReturned);
 263 
 264         if (cReturned > 0) {
 265             for (DWORD i = 0; i < cReturned; i++) {
 266                 PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) (pPrinterEnum + i * sizeof(PRINTER_INFO_4));
 267 
 268                 // Store the network printers indexes
 269                 if (info4->Attributes & PRINTER_ATTRIBUTE_NETWORK) {
 270                     pNetworkPrinterLoc[remotePrintersCount++] = i;
 271                 }
 272             }
 273 
 274             // return remote printers only if the list contains it.
 275             if (remotePrintersCount > 0) {
 276                 // Allocate space only for the network type printers
 277                 nameArray = env->NewObjectArray(remotePrintersCount, clazz, NULL);
 278                 if (nameArray == NULL) {
 279                     throw std::bad_alloc();
 280                 }
 281             }

 282         }
 283 
 284         // Loop thro' network printers list only
 285         for (int i = 0; i < remotePrintersCount; i++) {
 286             PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
 287                 (pPrinterEnum + pNetworkPrinterLoc[i] * sizeof(PRINTER_INFO_4));
 288             utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
 289             if (utf_str == NULL) {
 290                 throw std::bad_alloc();
 291             }
 292             env->SetObjectArrayElement(nameArray, i, utf_str);
 293             env->DeleteLocalRef(utf_str);
 294         }
 295     } catch (std::bad_alloc&) {
 296         delete [] pPrinterEnum;
 297         delete [] pNetworkPrinterLoc;
 298         throw;
 299     }
 300 
 301     delete [] pPrinterEnum;
 302     delete [] pNetworkPrinterLoc;
 303 
 304     if (remotePrintersCount) {
 305       return nameArray;
 306     } else {
 307       return emptyArray;
 308     }
 309 
 310     CATCH_BAD_ALLOC_RET(NULL);
 311 }
 312 
 313 JNIEXPORT jfloatArray JNICALL
 314 Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
 315                                                   jobject peer,
 316                                                   jstring printer,
 317                                                   jint  papersize)
 318 {
 319     TRY;
 320 
 321     LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
 322                                                             printer, NULL);
 323     if (printerName == NULL) {
 324         return NULL;
 325     }
 326 
 327     jfloatArray printableArray = NULL;
 328 


< prev index next >