215 jlong chgObject) {
216 FindClosePrinterChangeNotification((HANDLE)chgObject);
217 }
218
219
220 JNIEXPORT jint JNICALL
221 Java_sun_print_PrintServiceLookupProvider_notifyPrinterChange(JNIEnv *env,
222 jobject peer,
223 jlong chgObject) {
224 DWORD dwChange;
225
226 DWORD ret = WaitForSingleObject((HANDLE)chgObject, INFINITE);
227 if (ret == WAIT_OBJECT_0) {
228 return(FindNextPrinterChangeNotification((HANDLE)chgObject,
229 &dwChange, NULL, NULL));
230 } else {
231 return 0;
232 }
233 }
234
235
236 JNIEXPORT jfloatArray JNICALL
237 Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
238 jobject peer,
239 jstring printer,
240 jint papersize)
241 {
242 TRY;
243
244 LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
245 printer, NULL);
246 if (printerName == NULL) {
247 return NULL;
248 }
249
250 jfloatArray printableArray = NULL;
251
252 SAVE_CONTROLWORD
253 HDC pdc = CreateDC(TEXT("WINSPOOL"), printerName, NULL, NULL);
254 RESTORE_CONTROLWORD
|
215 jlong chgObject) {
216 FindClosePrinterChangeNotification((HANDLE)chgObject);
217 }
218
219
220 JNIEXPORT jint JNICALL
221 Java_sun_print_PrintServiceLookupProvider_notifyPrinterChange(JNIEnv *env,
222 jobject peer,
223 jlong chgObject) {
224 DWORD dwChange;
225
226 DWORD ret = WaitForSingleObject((HANDLE)chgObject, INFINITE);
227 if (ret == WAIT_OBJECT_0) {
228 return(FindNextPrinterChangeNotification((HANDLE)chgObject,
229 &dwChange, NULL, NULL));
230 } else {
231 return 0;
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
322 SAVE_CONTROLWORD
323 HDC pdc = CreateDC(TEXT("WINSPOOL"), printerName, NULL, NULL);
324 RESTORE_CONTROLWORD
|