src/windows/native/sun/windows/WPrinterJob.cpp
Print this page
*** 128,137 ****
--- 128,140 ----
DWORD cReturned = 0;
LPBYTE pPrinterEnum = NULL;
jstring utf_str;
jclass clazz = env->FindClass("java/lang/String");
+ if (clazz == NULL) {
+ return NULL;
+ }
jobjectArray nameArray;
try {
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, NULL, 0, &cbNeeded, &cReturned);
*** 238,247 ****
--- 241,253 ----
{
TRY;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
printer, NULL);
+ if (printerName == NULL) {
+ return NULL;
+ }
jfloatArray printableArray = NULL;
SAVE_CONTROLWORD
HDC pdc = CreateDC(TEXT("WINSPOOL"), printerName, NULL, NULL);
*** 260,270 ****
/* if failure, cleanup and return failure */
if (pDevMode != NULL) {
::GlobalFree(pDevMode);
}
!
::ClosePrinter(hPrinter);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
return printableArray;
}
--- 266,276 ----
/* if failure, cleanup and return failure */
if (pDevMode != NULL) {
::GlobalFree(pDevMode);
}
! DeleteDC(pdc);
::ClosePrinter(hPrinter);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
return printableArray;
}
*** 281,515 ****
int resx = GetDeviceCaps(pdc, LOGPIXELSX);
int resy = GetDeviceCaps(pdc, LOGPIXELSY);
printableArray=env->NewFloatArray(4);
! if (printableArray == NULL) {
! throw std::bad_alloc();
! }
! 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);
}
- DeleteDC(pdc);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
return printableArray;
CATCH_BAD_ALLOC_RET(NULL);
}
!
! 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 printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
! jintArray mediasizeArray = NULL;
SAVE_CONTROLWORD
! int numSizes = ::DeviceCapabilities(printerName, printerPort,
! DC_PAPERS, NULL, NULL);
RESTORE_CONTROLWORD
! if (numSizes > 0) {
!
! mediasizeArray = env->NewIntArray(numSizes);
! if (mediasizeArray == NULL) {
! throw std::bad_alloc();
}
!
! jboolean isCopy;
! jint *jpcIndices = env->GetIntArrayElements(mediasizeArray,
! &isCopy), *saveFormats = jpcIndices;
! LPTSTR papersBuf = (LPTSTR)new char[numSizes * sizeof(WORD)];
if (::DeviceCapabilities(printerName, printerPort,
! DC_PAPERS, papersBuf, NULL) != -1) {
RESTORE_CONTROLWORD
! WORD *pDmPaperSize = (WORD *)papersBuf;
! for (int i = 0; i < numSizes; i++, pDmPaperSize++) {
! jpcIndices[i] = *pDmPaperSize;
}
}
- delete[] papersBuf;
- env->ReleaseIntArrayElements(mediasizeArray, saveFormats, 0);
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
! return mediasizeArray;
! CATCH_BAD_ALLOC_RET(NULL);
}
JNIEXPORT jintArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaTrays(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
! TRY;
!
! 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);
}
JNIEXPORT jintArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaSizes(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
! TRY;
!
! LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
! printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
! jintArray mediaArray = NULL;
SAVE_CONTROLWORD
! int nPapers = ::DeviceCapabilities(printerName, printerPort,
! DC_PAPERSIZE, NULL, NULL) ;
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
!
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);
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return mediaArray;
- CATCH_BAD_ALLOC_RET(NULL);
}
jobjectArray getAllDCNames(JNIEnv *env, jobject peer, jstring printer,
jstring port, unsigned int dc_id, unsigned int buf_len)
{
- TRY;
! LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
! printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
jstring utf_str;
! jclass cls = env->FindClass("java/lang/String");
! jobjectArray names= NULL;
LPTSTR buf = NULL;
SAVE_CONTROLWORD
int cReturned = ::DeviceCapabilities(printerName, printerPort,
dc_id, NULL, NULL);
RESTORE_CONTROLWORD
! if (cReturned > 0) {
buf = (LPTSTR)new char[cReturned * buf_len * sizeof(TCHAR)];
if (buf == NULL) {
! throw std::bad_alloc();
}
cReturned = ::DeviceCapabilities(printerName, printerPort,
dc_id, buf, NULL);
RESTORE_CONTROLWORD
if (cReturned > 0) {
names = env->NewObjectArray(cReturned, cls, NULL);
! if (names == NULL) {
! throw std::bad_alloc();
}
for (int i = 0; i < cReturned; i++) {
utf_str = JNU_NewStringPlatform(env, buf+(buf_len*i));
if (utf_str == NULL) {
! throw std::bad_alloc();
}
env->SetObjectArrayElement(names, i, utf_str);
env->DeleteLocalRef(utf_str);
}
}
delete[] buf;
- }
return names;
- CATCH_BAD_ALLOC_RET(NULL);
}
JNIEXPORT jobjectArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaNames(JNIEnv *env,
--- 287,532 ----
int resx = GetDeviceCaps(pdc, LOGPIXELSX);
int resy = GetDeviceCaps(pdc, LOGPIXELSY);
printableArray=env->NewFloatArray(4);
! if (printableArray != NULL) {
! 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);
! }
! }
GlobalFree(pDevMode);
+ DeleteDC(pdc);
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
return printableArray;
CATCH_BAD_ALLOC_RET(NULL);
}
! jintArray getIDs(JNIEnv *env, jstring printer, jstring port, int dm_id)
{
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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;
! }
SAVE_CONTROLWORD
! int numIDs = ::DeviceCapabilities(printerName, printerPort, dm_id,
! NULL, NULL);
RESTORE_CONTROLWORD
! jintArray idArray = NULL;
! if (numIDs > 0) {
! idArray = env->NewIntArray(numIDs);
! if (idArray != NULL) {
! jint *jpcIndices = env->GetIntArrayElements(idArray, NULL);
! if (jpcIndices != NULL) {
! jint *saveFormats = jpcIndices;
! LPTSTR buf = NULL;
! try {
! buf = (LPTSTR)new char[numIDs * sizeof(WORD)];
! } catch (std::bad_alloc&) {
! buf = NULL;
}
! if (buf != NULL) {
if (::DeviceCapabilities(printerName, printerPort,
! dm_id, buf, NULL) != -1) {
! WORD *id = (WORD *)buf;
! for (int i = 0; i < numIDs; i++, id++) {
! jpcIndices[i] = *id;
! }
! }
RESTORE_CONTROLWORD
! delete[] buf;
! }
! env->ReleaseIntArrayElements(idArray, saveFormats, 0);
}
}
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
! return idArray;
! }
! JNIEXPORT jintArray JNICALL
! Java_sun_print_Win32PrintService_getAllMediaIDs(JNIEnv *env,
! jobject peer,
! jstring printer,
! jstring port)
! {
! return getIDs(env, printer, port, DC_PAPERS);
}
JNIEXPORT jintArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaTrays(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
! return getIDs(env, printer, port, DC_BINS);
}
JNIEXPORT jintArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaSizes(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
! LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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;
! }
SAVE_CONTROLWORD
! int nPapers = ::DeviceCapabilities(printerName, printerPort, DC_PAPERSIZE,
! NULL, NULL) ;
RESTORE_CONTROLWORD
+
+ jintArray mediaArray = NULL;
+ jint *saveFormats = NULL;
+
if (nPapers > 0) {
mediaArray = env->NewIntArray(nPapers*2);
! if (mediaArray != NULL) {
! 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;
+ }
+ }
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
+ if (mediaArray != NULL && saveFormats != NULL) {
+ env->ReleaseIntArrayElements(mediaArray, saveFormats, 0);
+ }
return mediaArray;
}
jobjectArray getAllDCNames(JNIEnv *env, jobject peer, jstring printer,
jstring port, unsigned int dc_id, unsigned int buf_len)
{
! LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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;
! jobjectArray names = NULL;
LPTSTR buf = NULL;
SAVE_CONTROLWORD
int cReturned = ::DeviceCapabilities(printerName, printerPort,
dc_id, NULL, NULL);
RESTORE_CONTROLWORD
! if (cReturned <= 0) {
! JNU_ReleaseStringPlatformChars(env, printer, printerName);
! JNU_ReleaseStringPlatformChars(env, port, printerPort);
! return NULL;
! }
+ try {
buf = (LPTSTR)new char[cReturned * buf_len * sizeof(TCHAR)];
+ } 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,
dc_id, buf, NULL);
RESTORE_CONTROLWORD
+ JNU_ReleaseStringPlatformChars(env, printer, printerName);
+ JNU_ReleaseStringPlatformChars(env, port, printerPort);
+
if (cReturned > 0) {
+ jclass cls = env->FindClass("java/lang/String");
+ if (cls != NULL) {
names = env->NewObjectArray(cReturned, cls, NULL);
! }
! if (names == NULL || cls == NULL) {
! delete buf;
! return names;
}
for (int i = 0; i < cReturned; i++) {
utf_str = JNU_NewStringPlatform(env, buf+(buf_len*i));
if (utf_str == NULL) {
! delete buf;
! return names;
}
env->SetObjectArrayElement(names, i, utf_str);
env->DeleteLocalRef(utf_str);
}
}
delete[] buf;
return names;
}
JNIEXPORT jobjectArray JNICALL
Java_sun_print_Win32PrintService_getAllMediaNames(JNIEnv *env,
*** 538,547 ****
--- 555,574 ----
jstring port)
{
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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
int numCopies = ::DeviceCapabilities(printerName, printerPort,
DC_COPIES, NULL, NULL);
RESTORE_CONTROLWORD
*** 571,622 ****
Java_sun_print_Win32PrintService_getAllResolutions(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
- TRY;
-
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
! jintArray resolutionArray = NULL;
SAVE_CONTROLWORD
int nResolutions = ::DeviceCapabilities(printerName, printerPort,
DC_ENUMRESOLUTIONS, NULL, NULL);
RESTORE_CONTROLWORD
if (nResolutions > 0) {
resolutionArray = env->NewIntArray(nResolutions*2);
! if (resolutionArray == NULL) {
! throw std::bad_alloc();
}
!
! jboolean isCopy;
! jint *jpcIndices = env->GetIntArrayElements(resolutionArray,
! &isCopy), *saveFormats = jpcIndices;
!
! LPTSTR resBuf = (LPTSTR)new char[nResolutions * sizeof(LONG) * 2]; // pairs of long
!
if (::DeviceCapabilities(printerName, printerPort,
! DC_ENUMRESOLUTIONS, resBuf, NULL) != -1) {
!
LONG *pResolution = (LONG *)resBuf;
for (int i = 0; i < nResolutions; i++) {
jpcIndices[i*2] = *pResolution++;
jpcIndices[i*2+1] = *pResolution++;
}
}
RESTORE_CONTROLWORD
delete[] resBuf;
env->ReleaseIntArrayElements(resolutionArray, saveFormats, 0);
}
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, printer, printerPort);
return resolutionArray;
-
- CATCH_BAD_ALLOC_RET(NULL);
}
static BOOL IsDCPostscript( HDC hDC )
{
--- 598,659 ----
Java_sun_print_Win32PrintService_getAllResolutions(JNIEnv *env,
jobject peer,
jstring printer,
jstring port)
{
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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;
! }
SAVE_CONTROLWORD
int nResolutions = ::DeviceCapabilities(printerName, printerPort,
DC_ENUMRESOLUTIONS, NULL, NULL);
RESTORE_CONTROLWORD
+
+ jintArray resolutionArray = NULL;
if (nResolutions > 0) {
resolutionArray = env->NewIntArray(nResolutions*2);
! if (resolutionArray != NULL) {
! jint *jpcIndices = env->GetIntArrayElements(resolutionArray, NULL);
! if (jpcIndices != NULL) {
! jint *saveFormats = jpcIndices;
! LPTSTR resBuf = NULL;
! try {
! resBuf = (LPTSTR)new char[nResolutions * sizeof(LONG) * 2];
! } catch (std::bad_alloc&) {
! resBuf = NULL;
}
! if (resBuf != NULL) {
if (::DeviceCapabilities(printerName, printerPort,
! DC_ENUMRESOLUTIONS, resBuf,
! NULL) != -1) {
LONG *pResolution = (LONG *)resBuf;
for (int i = 0; i < nResolutions; i++) {
jpcIndices[i*2] = *pResolution++;
jpcIndices[i*2+1] = *pResolution++;
}
}
RESTORE_CONTROLWORD
delete[] resBuf;
+ }
env->ReleaseIntArrayElements(resolutionArray, saveFormats, 0);
}
+ }
+ }
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, printer, printerPort);
return resolutionArray;
}
static BOOL IsDCPostscript( HDC hDC )
{
*** 670,679 ****
--- 707,717 ----
AwtPrintControl::FindPrinter(printer, buffer, &cbBuf,
&printerName, &printerPort);
} catch (std::bad_alloc&) {
delete [] buffer;
JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
+ return NULL;
}
if (printerPort == NULL) {
printerPort = TEXT("LPT1");
}
*** 690,699 ****
--- 728,748 ----
jstring printer,
jstring port)
{
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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.
// 0x0001 is a flag for color support and supported is the default.
jint ret = 0x1001;
DWORD dmFields;
*** 759,790 ****
jstring port)
{
HANDLE hPrinter;
LPDEVMODE pDevMode = NULL;
- TRY;
-
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL);
jintArray defaultArray = env->NewIntArray(NDEFAULT);
! if (defaultArray == NULL) {
! throw std::bad_alloc();
}
! jboolean isCopy;
! jint *defIndices = env->GetIntArrayElements(defaultArray,
! &isCopy), *saveFormats = defIndices;
! for (int i=0; i<NDEFAULT; i++) {
! defIndices[i]=GETDEFAULT_ERROR;
}
/* Start by opening the printer */
if (!::OpenPrinter(printerName, &hPrinter, NULL)) {
env->ReleaseIntArrayElements(defaultArray, saveFormats, 0);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
return defaultArray;
}
if (!AwtPrintControl::getDevmode(hPrinter, printerName, &pDevMode)) {
/* if failure, cleanup and return failure */
--- 808,852 ----
jstring port)
{
HANDLE hPrinter;
LPDEVMODE pDevMode = NULL;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, 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);
! if (defaultArray != NULL) {
! defIndices = env->GetIntArrayElements(defaultArray, NULL);
! }
! if (defIndices == NULL) {
! JNU_ReleaseStringPlatformChars(env, printer, printerName);
! JNU_ReleaseStringPlatformChars(env, port, printerPort);
! return NULL;
}
! jint *saveFormats = defIndices;
! for (int i=0; i < NDEFAULT; i++) {
! defIndices[i] = GETDEFAULT_ERROR;
}
/* Start by opening the printer */
if (!::OpenPrinter(printerName, &hPrinter, NULL)) {
env->ReleaseIntArrayElements(defaultArray, saveFormats, 0);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
+ JNU_ReleaseStringPlatformChars(env, port, printerPort);
return defaultArray;
}
if (!AwtPrintControl::getDevmode(hPrinter, printerName, &pDevMode)) {
/* if failure, cleanup and return failure */
*** 792,801 ****
--- 854,864 ----
::GlobalFree(pDevMode);
}
::ClosePrinter(hPrinter);
env->ReleaseIntArrayElements(defaultArray, saveFormats, 0);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
+ JNU_ReleaseStringPlatformChars(env, port, printerPort);
return defaultArray;
}
/* Have seen one driver which reports a default paper id which is not
* one of their supported paper ids. If what is returned is not
*** 861,882 ****
if (pDevMode->dmFields & DM_COLOR) {
defIndices[8] = pDevMode->dmColor;
}
-
GlobalFree(pDevMode);
::ClosePrinter(hPrinter);
env->ReleaseIntArrayElements(defaultArray, saveFormats, 0);
JNU_ReleaseStringPlatformChars(env, printer, printerName);
JNU_ReleaseStringPlatformChars(env, port, printerPort);
return defaultArray;
-
- CATCH_BAD_ALLOC_RET(NULL);
}
JNIEXPORT jint JNICALL
Java_sun_print_Win32PrintService_getJobStatus(JNIEnv *env,
--- 924,942 ----
*** 889,898 ****
--- 949,961 ----
DWORD cByteUsed;
PRINTER_INFO_2 *pPrinterInfo = NULL;
int ret=0;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
+ if (printerName == NULL) {
+ return -1;
+ }
// Start by opening the printer
if (!::OpenPrinter(printerName, &hPrinter, NULL)) {
JNU_ReleaseStringPlatformChars(env, printer, printerName);
return -1;
*** 957,973 ****
static jfieldID getIdOfLongField(JNIEnv *env, jobject self,
const char *fieldName) {
jclass myClass = env->GetObjectClass(self);
jfieldID fieldId = env->GetFieldID(myClass, fieldName, "J");
DASSERT(fieldId != 0);
-
return fieldId;
}
static inline HANDLE getHPrinter(JNIEnv *env, jobject self) {
jfieldID fieldId = getIdOfLongField(env, self, HPRINTER_STR);
return (HANDLE)(env->GetLongField(self, fieldId));
}
JNIEXPORT jboolean JNICALL
--- 1020,1038 ----
static jfieldID getIdOfLongField(JNIEnv *env, jobject self,
const char *fieldName) {
jclass myClass = env->GetObjectClass(self);
jfieldID fieldId = env->GetFieldID(myClass, fieldName, "J");
DASSERT(fieldId != 0);
return fieldId;
}
static inline HANDLE getHPrinter(JNIEnv *env, jobject self) {
jfieldID fieldId = getIdOfLongField(env, self, HPRINTER_STR);
+ if (fieldId == (jfieldID)0) {
+ return (HANDLE)NULL;
+ }
return (HANDLE)(env->GetLongField(self, fieldId));
}
JNIEXPORT jboolean JNICALL
*** 977,986 ****
--- 1042,1054 ----
jstring jobname)
{
HANDLE hPrinter;
DOC_INFO_1 DocInfo;
LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL);
+ if (printerName == NULL) {
+ return false;
+ }
DASSERT(jobname != NULL);
LPTSTR lpJobName = (LPTSTR)JNU_GetStringPlatformChars(env, jobname, NULL);
LPTSTR jname = _tcsdup(lpJobName);
JNU_ReleaseStringPlatformChars(env, jobname, lpJobName);
*** 1014,1025 ****
--- 1082,1097 ----
return false;
}
// store handle
jfieldID fieldId = getIdOfLongField(env, peer, HPRINTER_STR);
+ if (fieldId == (jfieldID)0) {
+ return false;
+ } else {
env->SetLongField(peer, fieldId, reinterpret_cast<jlong>(hPrinter));
return true;
+ }
}
JNIEXPORT jboolean JNICALL
Java_sun_print_Win32PrintJob_printRawData(JNIEnv *env,
*** 1037,1046 ****
--- 1109,1121 ----
return false;
}
try {
data=(jbyte *)env->GetPrimitiveArrayCritical(dataArray, 0);
+ if (data == NULL) {
+ return false;
+ }
// Send the data to the printer.
if( ! ::WritePrinter(hPrinter, data, count,(LPDWORD)&dwBytesWritten)) {
env->ReleasePrimitiveArrayCritical(dataArray, data, 0);
return false;