提交 4bc3c7f5 编写于 作者: P prr

8035569: [parfait] JNI expection pending in jdk/src/windows/native/sun/windows/WPrinterJob.cpp

Reviewed-by: serb, jgodinez
上级 e43ae97d
...@@ -130,6 +130,9 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env, ...@@ -130,6 +130,9 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env,
jstring utf_str; jstring utf_str;
jclass clazz = env->FindClass("java/lang/String"); jclass clazz = env->FindClass("java/lang/String");
if (clazz == NULL) {
return NULL;
}
jobjectArray nameArray; jobjectArray nameArray;
try { try {
...@@ -240,6 +243,9 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env, ...@@ -240,6 +243,9 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
printer, NULL); printer, NULL);
if (printerName == NULL) {
return NULL;
}
jfloatArray printableArray = NULL; jfloatArray printableArray = NULL;
...@@ -262,7 +268,7 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env, ...@@ -262,7 +268,7 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
if (pDevMode != NULL) { if (pDevMode != NULL) {
::GlobalFree(pDevMode); ::GlobalFree(pDevMode);
} }
DeleteDC(pdc);
::ClosePrinter(hPrinter); ::ClosePrinter(hPrinter);
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
return printableArray; return printableArray;
...@@ -283,25 +289,21 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env, ...@@ -283,25 +289,21 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
int resy = GetDeviceCaps(pdc, LOGPIXELSY); int resy = GetDeviceCaps(pdc, LOGPIXELSY);
printableArray=env->NewFloatArray(4); printableArray=env->NewFloatArray(4);
if (printableArray == NULL) { if (printableArray != NULL) {
throw std::bad_alloc(); jfloat *iPrintables =
env->GetFloatArrayElements(printableArray, NULL);
if (iPrintables != NULL) {
iPrintables[0] = (float)left/resx;
iPrintables[1] = (float)top/resy;
iPrintables[2] = (float)width/resx;
iPrintables[3] = (float)height/resy;
env->ReleaseFloatArrayElements(printableArray, iPrintables, 0);
}
} }
jboolean isCopy;
jfloat *iPrintables = env->GetFloatArrayElements(printableArray,
&isCopy),
*savePrintables = iPrintables;
iPrintables[0] = (float)left/resx;
iPrintables[1] = (float)top/resy;
iPrintables[2] = (float)width/resx;
iPrintables[3] = (float)height/resy;
env->ReleaseFloatArrayElements(printableArray, savePrintables, 0);
GlobalFree(pDevMode); GlobalFree(pDevMode);
DeleteDC(pdc);
} }
DeleteDC(pdc);
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
return printableArray; return printableArray;
...@@ -309,52 +311,68 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env, ...@@ -309,52 +311,68 @@ Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
CATCH_BAD_ALLOC_RET(NULL); CATCH_BAD_ALLOC_RET(NULL);
} }
jintArray getIDs(JNIEnv *env, jstring printer, jstring port, int dm_id)
JNIEXPORT jintArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaIDs(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{ {
TRY;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
jintArray mediasizeArray = NULL;
if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return NULL;
}
SAVE_CONTROLWORD SAVE_CONTROLWORD
int numSizes = ::DeviceCapabilities(printerName, printerPort, int numIDs = ::DeviceCapabilities(printerName, printerPort, dm_id,
DC_PAPERS, NULL, NULL); NULL, NULL);
RESTORE_CONTROLWORD RESTORE_CONTROLWORD
if (numSizes > 0) { jintArray idArray = NULL;
if (numIDs > 0) {
mediasizeArray = env->NewIntArray(numSizes); idArray = env->NewIntArray(numIDs);
if (mediasizeArray == NULL) { if (idArray != NULL) {
throw std::bad_alloc(); jint *jpcIndices = env->GetIntArrayElements(idArray, NULL);
} if (jpcIndices != NULL) {
jint *saveFormats = jpcIndices;
jboolean isCopy; LPTSTR buf = NULL;
jint *jpcIndices = env->GetIntArrayElements(mediasizeArray, try {
&isCopy), *saveFormats = jpcIndices; buf = (LPTSTR)new char[numIDs * sizeof(WORD)];
LPTSTR papersBuf = (LPTSTR)new char[numSizes * sizeof(WORD)]; } catch (std::bad_alloc&) {
if (::DeviceCapabilities(printerName, printerPort, buf = NULL;
DC_PAPERS, papersBuf, NULL) != -1) { }
RESTORE_CONTROLWORD if (buf != NULL) {
WORD *pDmPaperSize = (WORD *)papersBuf; if (::DeviceCapabilities(printerName, printerPort,
for (int i = 0; i < numSizes; i++, pDmPaperSize++) { dm_id, buf, NULL) != -1) {
jpcIndices[i] = *pDmPaperSize; WORD *id = (WORD *)buf;
for (int i = 0; i < numIDs; i++, id++) {
jpcIndices[i] = *id;
}
}
RESTORE_CONTROLWORD
delete[] buf;
}
env->ReleaseIntArrayElements(idArray, saveFormats, 0);
}
} }
}
delete[] papersBuf;
env->ReleaseIntArrayElements(mediasizeArray, saveFormats, 0);
} }
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort); JNU_ReleaseStringPlatformChars(env, port, printerPort);
return mediasizeArray; return idArray;
}
CATCH_BAD_ALLOC_RET(NULL); JNIEXPORT jintArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaIDs(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
return getIDs(env, printer, port, DC_PAPERS);
} }
...@@ -364,47 +382,7 @@ Java_sun_print_Win32PrintService_getAllMediaTrays(JNIEnv *env, ...@@ -364,47 +382,7 @@ Java_sun_print_Win32PrintService_getAllMediaTrays(JNIEnv *env,
jstring printer, jstring printer,
jstring port) jstring port)
{ {
TRY; return getIDs(env, printer, port, DC_BINS);
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
jintArray mediaTrayArray = NULL;
SAVE_CONTROLWORD
int nBins = ::DeviceCapabilities(printerName, printerPort,
DC_BINS, NULL, NULL) ;
RESTORE_CONTROLWORD
if (nBins > 0) {
mediaTrayArray = env->NewIntArray(nBins);
if (mediaTrayArray == NULL) {
throw std::bad_alloc();
}
jboolean isCopy;
jint *jpcIndices = env->GetIntArrayElements(mediaTrayArray,
&isCopy), *saveFormats = jpcIndices;
LPTSTR buf = (LPTSTR)new char[nBins * sizeof(WORD)];
if (::DeviceCapabilities(printerName, printerPort,
DC_BINS, buf, NULL) != -1) {
RESTORE_CONTROLWORD
WORD *pBins = (WORD *)buf;
for (int i = 0; i < nBins; i++) {
jpcIndices[i] = *(pBins+i);
}
}
delete[] buf;
env->ReleaseIntArrayElements(mediaTrayArray, saveFormats, 0);
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return mediaTrayArray;
CATCH_BAD_ALLOC_RET(NULL);
} }
...@@ -414,100 +392,139 @@ Java_sun_print_Win32PrintService_getAllMediaSizes(JNIEnv *env, ...@@ -414,100 +392,139 @@ Java_sun_print_Win32PrintService_getAllMediaSizes(JNIEnv *env,
jstring printer, jstring printer,
jstring port) jstring port)
{ {
TRY; LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
jintArray mediaArray = NULL; if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return NULL;
}
SAVE_CONTROLWORD SAVE_CONTROLWORD
int nPapers = ::DeviceCapabilities(printerName, printerPort, int nPapers = ::DeviceCapabilities(printerName, printerPort, DC_PAPERSIZE,
DC_PAPERSIZE, NULL, NULL) ; NULL, NULL) ;
RESTORE_CONTROLWORD RESTORE_CONTROLWORD
if (nPapers > 0) {
mediaArray = env->NewIntArray(nPapers*2);
if (mediaArray == NULL) {
throw std::bad_alloc();
}
jboolean isCopy;
jint *jpcIndices = env->GetIntArrayElements(mediaArray,
&isCopy), *saveFormats = jpcIndices;
LPTSTR buf = (LPTSTR)new char[nPapers * sizeof(POINT)]; // array of POINTs jintArray mediaArray = NULL;
jint *saveFormats = NULL;
if (::DeviceCapabilities(printerName, printerPort,
DC_PAPERSIZE, buf, NULL) != -1) {
POINT *pDim = (POINT *)buf; if (nPapers > 0) {
for (int i = 0; i < nPapers; i++) { mediaArray = env->NewIntArray(nPapers*2);
jpcIndices[i*2] = (pDim+i)->x; if (mediaArray != NULL) {
jpcIndices[i*2+1] = (pDim+i)->y; jint *jpcIndices = env->GetIntArrayElements(mediaArray, NULL);
if (jpcIndices != NULL) {
saveFormats = jpcIndices;
LPTSTR buf = NULL;
try {
buf = (LPTSTR)new char[nPapers * sizeof(POINT)];
} catch (std::bad_alloc&) {
buf = NULL;
}
if (buf != NULL) {
if (::DeviceCapabilities(printerName, printerPort,
DC_PAPERSIZE, buf, NULL) != -1) {
POINT *pDim = (POINT *)buf;
for (int i = 0; i < nPapers; i++) {
jpcIndices[i*2] = (pDim+i)->x;
jpcIndices[i*2+1] = (pDim+i)->y;
}
}
RESTORE_CONTROLWORD
delete[] buf;
}
env->ReleaseIntArrayElements(mediaArray, saveFormats, 0);
saveFormats = NULL;
}
} }
}
RESTORE_CONTROLWORD
delete[] buf;
env->ReleaseIntArrayElements(mediaArray, saveFormats, 0);
} }
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort); JNU_ReleaseStringPlatformChars(env, port, printerPort);
if (mediaArray != NULL && saveFormats != NULL) {
env->ReleaseIntArrayElements(mediaArray, saveFormats, 0);
}
return mediaArray; return mediaArray;
CATCH_BAD_ALLOC_RET(NULL);
} }
jobjectArray getAllDCNames(JNIEnv *env, jobject peer, jstring printer, jobjectArray getAllDCNames(JNIEnv *env, jobject peer, jstring printer,
jstring port, unsigned int dc_id, unsigned int buf_len) jstring port, unsigned int dc_id, unsigned int buf_len)
{ {
TRY;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return NULL;
}
jstring utf_str; jstring utf_str;
jclass cls = env->FindClass("java/lang/String"); jobjectArray names = NULL;
jobjectArray names= NULL;
LPTSTR buf = NULL; LPTSTR buf = NULL;
SAVE_CONTROLWORD SAVE_CONTROLWORD
int cReturned = ::DeviceCapabilities(printerName, printerPort, int cReturned = ::DeviceCapabilities(printerName, printerPort,
dc_id, NULL, NULL); dc_id, NULL, NULL);
RESTORE_CONTROLWORD RESTORE_CONTROLWORD
if (cReturned > 0) { if (cReturned <= 0) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return NULL;
}
buf = (LPTSTR)new char[cReturned * buf_len * sizeof(TCHAR)]; try {
if (buf == NULL) { buf = (LPTSTR)new char[cReturned * buf_len * sizeof(TCHAR)];
throw std::bad_alloc(); } catch (std::bad_alloc&) {
} buf = NULL;
}
if (buf == NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
return NULL;
}
cReturned = ::DeviceCapabilities(printerName, printerPort, cReturned = ::DeviceCapabilities(printerName, printerPort,
dc_id, buf, NULL); dc_id, buf, NULL);
RESTORE_CONTROLWORD RESTORE_CONTROLWORD
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
if (cReturned > 0) { if (cReturned > 0) {
names = env->NewObjectArray(cReturned, cls, NULL); jclass cls = env->FindClass("java/lang/String");
if (names == NULL) { if (cls != NULL) {
throw std::bad_alloc(); names = env->NewObjectArray(cReturned, cls, NULL);
}
if (names == NULL || cls == NULL) {
delete buf;
return names;
} }
for (int i = 0; i < cReturned; i++) { for (int i = 0; i < cReturned; i++) {
utf_str = JNU_NewStringPlatform(env, buf+(buf_len*i)); utf_str = JNU_NewStringPlatform(env, buf+(buf_len*i));
if (utf_str == NULL) { if (utf_str == NULL) {
throw std::bad_alloc(); delete buf;
return names;
}
env->SetObjectArrayElement(names, i, utf_str);
env->DeleteLocalRef(utf_str);
} }
env->SetObjectArrayElement(names, i, utf_str);
env->DeleteLocalRef(utf_str);
}
} }
delete[] buf; delete[] buf;
} return names;
return names;
CATCH_BAD_ALLOC_RET(NULL);
} }
...@@ -540,6 +557,16 @@ Java_sun_print_Win32PrintService_getCopiesSupported(JNIEnv *env, ...@@ -540,6 +557,16 @@ Java_sun_print_Win32PrintService_getCopiesSupported(JNIEnv *env,
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return 1;
}
SAVE_CONTROLWORD SAVE_CONTROLWORD
int numCopies = ::DeviceCapabilities(printerName, printerPort, int numCopies = ::DeviceCapabilities(printerName, printerPort,
DC_COPIES, NULL, NULL); DC_COPIES, NULL, NULL);
...@@ -573,48 +600,58 @@ Java_sun_print_Win32PrintService_getAllResolutions(JNIEnv *env, ...@@ -573,48 +600,58 @@ Java_sun_print_Win32PrintService_getAllResolutions(JNIEnv *env,
jstring printer, jstring printer,
jstring port) jstring port)
{ {
TRY;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
jintArray resolutionArray = NULL; if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return NULL;
}
SAVE_CONTROLWORD SAVE_CONTROLWORD
int nResolutions = ::DeviceCapabilities(printerName, printerPort, int nResolutions = ::DeviceCapabilities(printerName, printerPort,
DC_ENUMRESOLUTIONS, NULL, NULL); DC_ENUMRESOLUTIONS, NULL, NULL);
RESTORE_CONTROLWORD RESTORE_CONTROLWORD
jintArray resolutionArray = NULL;
if (nResolutions > 0) { if (nResolutions > 0) {
resolutionArray = env->NewIntArray(nResolutions*2); resolutionArray = env->NewIntArray(nResolutions*2);
if (resolutionArray == NULL) { if (resolutionArray != NULL) {
throw std::bad_alloc(); jint *jpcIndices = env->GetIntArrayElements(resolutionArray, NULL);
} if (jpcIndices != NULL) {
jint *saveFormats = jpcIndices;
jboolean isCopy; LPTSTR resBuf = NULL;
jint *jpcIndices = env->GetIntArrayElements(resolutionArray, try {
&isCopy), *saveFormats = jpcIndices; resBuf = (LPTSTR)new char[nResolutions * sizeof(LONG) * 2];
} catch (std::bad_alloc&) {
LPTSTR resBuf = (LPTSTR)new char[nResolutions * sizeof(LONG) * 2]; // pairs of long resBuf = NULL;
}
if (::DeviceCapabilities(printerName, printerPort, if (resBuf != NULL) {
DC_ENUMRESOLUTIONS, resBuf, NULL) != -1) { if (::DeviceCapabilities(printerName, printerPort,
DC_ENUMRESOLUTIONS, resBuf,
LONG *pResolution = (LONG *)resBuf; NULL) != -1) {
for (int i = 0; i < nResolutions; i++) { LONG *pResolution = (LONG *)resBuf;
jpcIndices[i*2] = *pResolution++; for (int i = 0; i < nResolutions; i++) {
jpcIndices[i*2+1] = *pResolution++; jpcIndices[i*2] = *pResolution++;
} jpcIndices[i*2+1] = *pResolution++;
}
}
RESTORE_CONTROLWORD
delete[] resBuf;
}
env->ReleaseIntArrayElements(resolutionArray, saveFormats, 0);
}
} }
RESTORE_CONTROLWORD
delete[] resBuf;
env->ReleaseIntArrayElements(resolutionArray, saveFormats, 0);
} }
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, printer, printerPort); JNU_ReleaseStringPlatformChars(env, printer, printerPort);
return resolutionArray; return resolutionArray;
CATCH_BAD_ALLOC_RET(NULL);
} }
...@@ -672,6 +709,7 @@ Java_sun_print_Win32PrintService_getPrinterPort(JNIEnv *env, ...@@ -672,6 +709,7 @@ Java_sun_print_Win32PrintService_getPrinterPort(JNIEnv *env,
} catch (std::bad_alloc&) { } catch (std::bad_alloc&) {
delete [] buffer; delete [] buffer;
JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
return NULL;
} }
if (printerPort == NULL) { if (printerPort == NULL) {
...@@ -692,6 +730,17 @@ Java_sun_print_Win32PrintService_getCapabilities(JNIEnv *env, ...@@ -692,6 +730,17 @@ Java_sun_print_Win32PrintService_getCapabilities(JNIEnv *env,
{ {
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return NULL;
}
// 0x1000 is a flag to indicate that getCapabilities has already been called. // 0x1000 is a flag to indicate that getCapabilities has already been called.
// 0x0001 is a flag for color support and supported is the default. // 0x0001 is a flag for color support and supported is the default.
jint ret = 0x1001; jint ret = 0x1001;
...@@ -761,28 +810,41 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env, ...@@ -761,28 +810,41 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env,
HANDLE hPrinter; HANDLE hPrinter;
LPDEVMODE pDevMode = NULL; LPDEVMODE pDevMode = NULL;
TRY;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
if (printerName == NULL || printerPort == NULL) {
if (printerName != NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
}
if (printerPort != NULL) {
JNU_ReleaseStringPlatformChars(env, port, printerPort);
}
return NULL;
}
jint* defIndices = NULL;
jintArray defaultArray = env->NewIntArray(NDEFAULT); jintArray defaultArray = env->NewIntArray(NDEFAULT);
if (defaultArray == NULL) { if (defaultArray != NULL) {
throw std::bad_alloc(); defIndices = env->GetIntArrayElements(defaultArray, NULL);
}
if (defIndices == NULL) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return NULL;
} }
jboolean isCopy; jint *saveFormats = defIndices;
jint *defIndices = env->GetIntArrayElements(defaultArray,
&isCopy), *saveFormats = defIndices;
for (int i=0; i<NDEFAULT; i++) { for (int i=0; i < NDEFAULT; i++) {
defIndices[i]=GETDEFAULT_ERROR; defIndices[i] = GETDEFAULT_ERROR;
} }
/* Start by opening the printer */ /* Start by opening the printer */
if (!::OpenPrinter(printerName, &hPrinter, NULL)) { if (!::OpenPrinter(printerName, &hPrinter, NULL)) {
env->ReleaseIntArrayElements(defaultArray, saveFormats, 0); env->ReleaseIntArrayElements(defaultArray, saveFormats, 0);
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return defaultArray; return defaultArray;
} }
...@@ -794,6 +856,7 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env, ...@@ -794,6 +856,7 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env,
::ClosePrinter(hPrinter); ::ClosePrinter(hPrinter);
env->ReleaseIntArrayElements(defaultArray, saveFormats, 0); env->ReleaseIntArrayElements(defaultArray, saveFormats, 0);
JNU_ReleaseStringPlatformChars(env, printer, printerName); JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return defaultArray; return defaultArray;
} }
...@@ -863,7 +926,6 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env, ...@@ -863,7 +926,6 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env,
defIndices[8] = pDevMode->dmColor; defIndices[8] = pDevMode->dmColor;
} }
GlobalFree(pDevMode); GlobalFree(pDevMode);
::ClosePrinter(hPrinter); ::ClosePrinter(hPrinter);
...@@ -873,8 +935,6 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env, ...@@ -873,8 +935,6 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env,
JNU_ReleaseStringPlatformChars(env, port, printerPort); JNU_ReleaseStringPlatformChars(env, port, printerPort);
return defaultArray; return defaultArray;
CATCH_BAD_ALLOC_RET(NULL);
} }
...@@ -891,6 +951,9 @@ Java_sun_print_Win32PrintService_getJobStatus(JNIEnv *env, ...@@ -891,6 +951,9 @@ Java_sun_print_Win32PrintService_getJobStatus(JNIEnv *env,
int ret=0; int ret=0;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
if (printerName == NULL) {
return -1;
}
// Start by opening the printer // Start by opening the printer
if (!::OpenPrinter(printerName, &hPrinter, NULL)) { if (!::OpenPrinter(printerName, &hPrinter, NULL)) {
...@@ -959,13 +1022,15 @@ static jfieldID getIdOfLongField(JNIEnv *env, jobject self, ...@@ -959,13 +1022,15 @@ static jfieldID getIdOfLongField(JNIEnv *env, jobject self,
jclass myClass = env->GetObjectClass(self); jclass myClass = env->GetObjectClass(self);
jfieldID fieldId = env->GetFieldID(myClass, fieldName, "J"); jfieldID fieldId = env->GetFieldID(myClass, fieldName, "J");
DASSERT(fieldId != 0); DASSERT(fieldId != 0);
return fieldId; return fieldId;
} }
static inline HANDLE getHPrinter(JNIEnv *env, jobject self) { static inline HANDLE getHPrinter(JNIEnv *env, jobject self) {
jfieldID fieldId = getIdOfLongField(env, self, HPRINTER_STR); jfieldID fieldId = getIdOfLongField(env, self, HPRINTER_STR);
if (fieldId == (jfieldID)0) {
return (HANDLE)NULL;
}
return (HANDLE)(env->GetLongField(self, fieldId)); return (HANDLE)(env->GetLongField(self, fieldId));
} }
...@@ -979,6 +1044,9 @@ Java_sun_print_Win32PrintJob_startPrintRawData(JNIEnv *env, ...@@ -979,6 +1044,9 @@ Java_sun_print_Win32PrintJob_startPrintRawData(JNIEnv *env,
HANDLE hPrinter; HANDLE hPrinter;
DOC_INFO_1 DocInfo; DOC_INFO_1 DocInfo;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
if (printerName == NULL) {
return false;
}
DASSERT(jobname != NULL); DASSERT(jobname != NULL);
LPTSTR lpJobName = (LPTSTR)JNU_GetStringPlatformChars(env, jobname, NULL); LPTSTR lpJobName = (LPTSTR)JNU_GetStringPlatformChars(env, jobname, NULL);
LPTSTR jname = _tcsdup(lpJobName); LPTSTR jname = _tcsdup(lpJobName);
...@@ -1016,8 +1084,12 @@ Java_sun_print_Win32PrintJob_startPrintRawData(JNIEnv *env, ...@@ -1016,8 +1084,12 @@ Java_sun_print_Win32PrintJob_startPrintRawData(JNIEnv *env,
// store handle // store handle
jfieldID fieldId = getIdOfLongField(env, peer, HPRINTER_STR); jfieldID fieldId = getIdOfLongField(env, peer, HPRINTER_STR);
env->SetLongField(peer, fieldId, reinterpret_cast<jlong>(hPrinter)); if (fieldId == (jfieldID)0) {
return true; return false;
} else {
env->SetLongField(peer, fieldId, reinterpret_cast<jlong>(hPrinter));
return true;
}
} }
...@@ -1039,6 +1111,9 @@ Java_sun_print_Win32PrintJob_printRawData(JNIEnv *env, ...@@ -1039,6 +1111,9 @@ Java_sun_print_Win32PrintJob_printRawData(JNIEnv *env,
try { try {
data=(jbyte *)env->GetPrimitiveArrayCritical(dataArray, 0); data=(jbyte *)env->GetPrimitiveArrayCritical(dataArray, 0);
if (data == NULL) {
return false;
}
// Send the data to the printer. // Send the data to the printer.
if( ! ::WritePrinter(hPrinter, data, count,(LPDWORD)&dwBytesWritten)) { if( ! ::WritePrinter(hPrinter, data, count,(LPDWORD)&dwBytesWritten)) {
......
...@@ -149,7 +149,7 @@ void ...@@ -149,7 +149,7 @@ void
handle_bad_alloc(void) { handle_bad_alloc(void) {
if (jvm != NULL) { if (jvm != NULL) {
JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env != NULL) { if (env != NULL && !env->ExceptionCheck()) {
JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册