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 |