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