8035737: [parfait] JNI exception pending in jdk/src/windows/native/sun/windows/awt_PrintControl.cpp

Reviewed-by: serb, pchelko
This commit is contained in:
Oleg Pekhovskiy 2014-04-04 20:26:01 +04:00
parent 002763f0fc
commit 7e8f0a2d28
2 changed files with 124 additions and 34 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -233,107 +233,166 @@ void AwtPrintControl::initIDs(JNIEnv *env, jclass cls)
TRY;
jclass cls = env->FindClass("sun/awt/windows/WPrinterJob");
CHECK_NULL(cls);
AwtPrintControl::dialogOwnerPeerID =
env->GetFieldID(cls, "dialogOwnerPeer", "Ljava/awt/peer/ComponentPeer;");
DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL);
CHECK_NULL(AwtPrintControl::dialogOwnerPeerID);
AwtPrintControl::getPrintDCID = env->GetMethodID(cls, "getPrintDC", "()J");
DASSERT(AwtPrintControl::getPrintDCID != NULL);
CHECK_NULL(AwtPrintControl::getPrintDCID);
AwtPrintControl::setPrintDCID =
env->GetMethodID(cls, "setPrintDC", "(J)V");
DASSERT(AwtPrintControl::setPrintDCID != NULL);
CHECK_NULL(AwtPrintControl::setPrintDCID);
AwtPrintControl::getDevmodeID = env->GetMethodID(cls, "getDevMode", "()J");
DASSERT(AwtPrintControl::getDevmodeID != NULL);
CHECK_NULL(AwtPrintControl::getDevmodeID);
AwtPrintControl::setDevmodeID =
env->GetMethodID(cls, "setDevMode", "(J)V");
DASSERT(AwtPrintControl::setDevmodeID != NULL);
CHECK_NULL(AwtPrintControl::setDevmodeID);
AwtPrintControl::getDevnamesID =
env->GetMethodID(cls, "getDevNames", "()J");
DASSERT(AwtPrintControl::getDevnamesID != NULL);
CHECK_NULL(AwtPrintControl::getDevnamesID);
AwtPrintControl::setDevnamesID =
env->GetMethodID(cls, "setDevNames", "(J)V");
DASSERT(AwtPrintControl::setDevnamesID != NULL);
CHECK_NULL(AwtPrintControl::setDevnamesID);
AwtPrintControl::driverDoesMultipleCopiesID =
env->GetFieldID(cls, "driverDoesMultipleCopies", "Z");
DASSERT(AwtPrintControl::driverDoesMultipleCopiesID != NULL);
CHECK_NULL(AwtPrintControl::driverDoesMultipleCopiesID);
AwtPrintControl::driverDoesCollationID =
env->GetFieldID(cls, "driverDoesCollation", "Z");
DASSERT(AwtPrintControl::driverDoesCollationID != NULL);
CHECK_NULL(AwtPrintControl::driverDoesCollationID);
AwtPrintControl::getCopiesID =
env->GetMethodID(cls, "getCopiesAttrib", "()I");
DASSERT(AwtPrintControl::getCopiesID != NULL);
CHECK_NULL(AwtPrintControl::getCopiesID);
AwtPrintControl::getCollateID =
env->GetMethodID(cls, "getCollateAttrib","()I");
DASSERT(AwtPrintControl::getCollateID != NULL);
CHECK_NULL(AwtPrintControl::getCollateID);
AwtPrintControl::getOrientID =
env->GetMethodID(cls, "getOrientAttrib", "()I");
DASSERT(AwtPrintControl::getOrientID != NULL);
CHECK_NULL(AwtPrintControl::getOrientID);
AwtPrintControl::getFromPageID =
env->GetMethodID(cls, "getFromPageAttrib", "()I");
DASSERT(AwtPrintControl::getFromPageID != NULL);
CHECK_NULL(AwtPrintControl::getFromPageID);
AwtPrintControl::getToPageID =
env->GetMethodID(cls, "getToPageAttrib", "()I");
DASSERT(AwtPrintControl::getToPageID != NULL);
CHECK_NULL(AwtPrintControl::getToPageID);
AwtPrintControl::getMinPageID =
env->GetMethodID(cls, "getMinPageAttrib", "()I");
DASSERT(AwtPrintControl::getMinPageID != NULL);
CHECK_NULL(AwtPrintControl::getMinPageID);
AwtPrintControl::getMaxPageID =
env->GetMethodID(cls, "getMaxPageAttrib", "()I");
DASSERT(AwtPrintControl::getMaxPageID != NULL);
CHECK_NULL(AwtPrintControl::getMaxPageID);
AwtPrintControl::getDestID =
env->GetMethodID(cls, "getDestAttrib", "()Z");
DASSERT(AwtPrintControl::getDestID != NULL);
CHECK_NULL(AwtPrintControl::getDestID);
AwtPrintControl::getQualityID =
env->GetMethodID(cls, "getQualityAttrib", "()I");
DASSERT(AwtPrintControl::getQualityID != NULL);
CHECK_NULL(AwtPrintControl::getQualityID);
AwtPrintControl::getColorID =
env->GetMethodID(cls, "getColorAttrib", "()I");
DASSERT(AwtPrintControl::getColorID != NULL);
CHECK_NULL(AwtPrintControl::getColorID);
AwtPrintControl::getSidesID =
env->GetMethodID(cls, "getSidesAttrib", "()I");
DASSERT(AwtPrintControl::getSidesID != NULL);
CHECK_NULL(AwtPrintControl::getSidesID);
AwtPrintControl::getPrinterID =
env->GetMethodID(cls, "getPrinterAttrib", "()Ljava/lang/String;");
DASSERT(AwtPrintControl::getPrinterID != NULL);
CHECK_NULL(AwtPrintControl::getPrinterID);
AwtPrintControl::getWin32MediaID =
env->GetMethodID(cls, "getWin32MediaAttrib", "()[I");
DASSERT(AwtPrintControl::getWin32MediaID != NULL);
CHECK_NULL(AwtPrintControl::getWin32MediaID);
AwtPrintControl::setWin32MediaID =
env->GetMethodID(cls, "setWin32MediaAttrib", "(III)V");
DASSERT(AwtPrintControl::setWin32MediaID != NULL);
CHECK_NULL(AwtPrintControl::setWin32MediaID);
AwtPrintControl::getWin32MediaTrayID =
env->GetMethodID(cls, "getMediaTrayAttrib", "()I");
DASSERT(AwtPrintControl::getWin32MediaTrayID != NULL);
CHECK_NULL(AwtPrintControl::getWin32MediaTrayID);
AwtPrintControl::setWin32MediaTrayID =
env->GetMethodID(cls, "setMediaTrayAttrib", "(I)V");
DASSERT(AwtPrintControl::setWin32MediaTrayID != NULL);
CHECK_NULL(AwtPrintControl::setWin32MediaTrayID);
AwtPrintControl::getSelectID =
env->GetMethodID(cls, "getSelectAttrib", "()I");
DASSERT(AwtPrintControl::getSelectID != NULL);
CHECK_NULL(AwtPrintControl::getSelectID);
AwtPrintControl::getPrintToFileEnabledID =
env->GetMethodID(cls, "getPrintToFileEnabled", "()Z");
DASSERT(AwtPrintControl::getPrintToFileEnabledID != NULL);
CHECK_NULL(AwtPrintControl::getPrintToFileEnabledID);
AwtPrintControl::setNativeAttID =
env->GetMethodID(cls, "setNativeAttributes", "(III)V");
DASSERT(AwtPrintControl::setNativeAttID != NULL);
CHECK_NULL(AwtPrintControl::setNativeAttID);
AwtPrintControl::setRangeCopiesID =
env->GetMethodID(cls, "setRangeCopiesAttribute", "(IIZI)V");
DASSERT(AwtPrintControl::setRangeCopiesID != NULL);
CHECK_NULL(AwtPrintControl::setRangeCopiesID);
AwtPrintControl::setResID =
env->GetMethodID(cls, "setResolutionDPI", "(II)V");
DASSERT(AwtPrintControl::setResID != NULL);
CHECK_NULL(AwtPrintControl::setResID);
AwtPrintControl::setPrinterID =
env->GetMethodID(cls, "setPrinterNameAttrib", "(Ljava/lang/String;)V");
DASSERT(AwtPrintControl::setPrinterID != NULL);
CHECK_NULL(AwtPrintControl::setPrinterID);
AwtPrintControl::setJobAttributesID =
env->GetMethodID(cls, "setJobAttributes",
"(Ljavax/print/attribute/PrintRequestAttributeSet;IISSSSSSS)V");
DASSERT(AwtPrintControl::driverDoesMultipleCopiesID != NULL);
DASSERT(AwtPrintControl::getPrintDCID != NULL);
DASSERT(AwtPrintControl::setPrintDCID != NULL);
DASSERT(AwtPrintControl::getDevmodeID != NULL);
DASSERT(AwtPrintControl::setDevmodeID != NULL);
DASSERT(AwtPrintControl::getDevnamesID != NULL);
DASSERT(AwtPrintControl::setDevnamesID != NULL);
DASSERT(AwtPrintControl::driverDoesCollationID != NULL);
DASSERT(AwtPrintControl::getWin32MediaID != NULL);
DASSERT(AwtPrintControl::setWin32MediaID != NULL);
DASSERT(AwtPrintControl::getWin32MediaTrayID != NULL);
DASSERT(AwtPrintControl::setWin32MediaTrayID != NULL);
DASSERT(AwtPrintControl::setRangeCopiesID != NULL);
DASSERT(AwtPrintControl::setResID != NULL);
DASSERT(AwtPrintControl::setNativeAttID != NULL);
DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL);
DASSERT(AwtPrintControl::getCopiesID != NULL);
DASSERT(AwtPrintControl::getOrientID != NULL);
DASSERT(AwtPrintControl::getPrinterID != NULL);
DASSERT(AwtPrintControl::getCollateID != NULL);
DASSERT(AwtPrintControl::getFromPageID != NULL);
DASSERT(AwtPrintControl::getToPageID != NULL);
DASSERT(AwtPrintControl::getMinPageID != NULL);
DASSERT(AwtPrintControl::getMaxPageID != NULL);
DASSERT(AwtPrintControl::getDestID != NULL);
DASSERT(AwtPrintControl::getQualityID != NULL);
DASSERT(AwtPrintControl::getColorID != NULL);
DASSERT(AwtPrintControl::getSidesID != NULL);
DASSERT(AwtPrintControl::getSelectID != NULL);
DASSERT(AwtPrintControl::getPrintToFileEnabledID != NULL);
DASSERT(AwtPrintControl::setJobAttributesID != NULL);
CHECK_NULL(AwtPrintControl::setJobAttributesID);
CATCH_BAD_ALLOC;
}
@ -606,6 +665,10 @@ BOOL AwtPrintControl::InitPrintDialog(JNIEnv *env,
LPTSTR getName = (LPTSTR)JNU_GetStringPlatformChars(env,
printerName, NULL);
if (getName == NULL) {
env->DeleteLocalRef(printerName);
throw std::bad_alloc();
}
BOOL samePrinter = FALSE;
@ -652,6 +715,7 @@ BOOL AwtPrintControl::InitPrintDialog(JNIEnv *env,
if (portName != NULL) {
free(portName);
}
env->DeleteLocalRef(printerName);
return FALSE;
}
@ -664,11 +728,13 @@ BOOL AwtPrintControl::InitPrintDialog(JNIEnv *env,
if (portName != NULL) {
free(portName);
}
env->DeleteLocalRef(printerName);
return FALSE;
}
delete [] buffer;
}
env->DeleteLocalRef(printerName);
// PrintDlg may change the values of hDevMode and hDevNames so we
// re-initialize our saved handles.
AwtPrintControl::setPrintHDMode(env, printCtrl, NULL);

View File

@ -193,11 +193,24 @@ Java_sun_awt_windows_WPrintDialogPeer__1show(JNIEnv *env, jobject peer)
// as peer object is used later on another thread, create a global ref
jobject peerGlobalRef = env->NewGlobalRef(peer);
DASSERT(peerGlobalRef != NULL);
CHECK_NULL_RETURN(peerGlobalRef, 0);
jobject target = env->GetObjectField(peerGlobalRef, AwtObject::targetID);
DASSERT(target != NULL);
if (target == NULL) {
env->DeleteGlobalRef(peerGlobalRef);
return 0;
}
jobject parent = env->GetObjectField(peerGlobalRef, AwtPrintDialog::parentID);
jobject control = env->GetObjectField(target, AwtPrintDialog::controlID);
DASSERT(control != NULL);
if (control == NULL) {
env->DeleteGlobalRef(peerGlobalRef);
env->DeleteLocalRef(target);
if (parent != NULL) {
env->DeleteLocalRef(parent);
}
return 0;
}
AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL;
HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL;
@ -206,7 +219,18 @@ Java_sun_awt_windows_WPrintDialogPeer__1show(JNIEnv *env, jobject peer)
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.lCustData = (LPARAM)peerGlobalRef;
BOOL ret = AwtPrintControl::InitPrintDialog(env, control, pd);
BOOL ret;
try {
ret = AwtPrintControl::InitPrintDialog(env, control, pd);
} catch (std::bad_alloc&) {
env->DeleteGlobalRef(peerGlobalRef);
env->DeleteLocalRef(target);
if (parent != NULL) {
env->DeleteLocalRef(parent);
}
env->DeleteLocalRef(control);
throw;
}
if (!ret) {
/* Couldn't use the printer, or spooler isn't running
* Call Page dialog with ' PD_RETURNDEFAULT' so it doesn't try