< prev index next >

src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp

Print this page




  27 
  28 #include "stdhdrs.h"
  29 #include <commdlg.h>
  30 #include <winspool.h>
  31 #include <limits.h>
  32 #include <float.h>
  33 
  34 #include "awt_Toolkit.h"
  35 #include "awt_PrintControl.h"
  36 
  37 /* values for parameter "type" of XXX_getJobStatus() */
  38 #define GETJOBCOUNT  1
  39 #define ACCEPTJOB    2
  40 
  41 static const char *HPRINTER_STR = "hPrintJob";
  42 
  43 /* constants for DeviceCapability buffer lengths */
  44 #define PAPERNAME_LENGTH 64
  45 #define TRAYNAME_LENGTH 24
  46 
  47 
  48 static BOOL IsSupportedLevel(HANDLE hPrinter, DWORD dwLevel) {
  49     BOOL isSupported = FALSE;
  50     DWORD cbBuf = 0;
  51     LPBYTE pPrinter = NULL;
  52 
  53     DASSERT(hPrinter != NULL);
  54 
  55     VERIFY(::GetPrinter(hPrinter, dwLevel, NULL, 0, &cbBuf) == 0);
  56     if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
  57         pPrinter = new BYTE[cbBuf];
  58         if (::GetPrinter(hPrinter, dwLevel, pPrinter, cbBuf, &cbBuf)) {
  59             isSupported = TRUE;
  60         }
  61         delete[] pPrinter;
  62     }
  63 
  64     return isSupported;
  65 }
  66 
  67 


 100        int len = lstrlen(cBuffer);
 101        while ((index < len) && cBuffer[index] != _T(',')) {
 102               index++;
 103        }
 104        if (index==0) {
 105          return NULL;
 106        }
 107 
 108        pPrinterName = (LPTSTR)GlobalAlloc(GPTR, (index+1)*sizeof(TCHAR));
 109        lstrcpyn(pPrinterName, cBuffer, index+1);
 110        jPrinterName = JNU_NewStringPlatform(env, pPrinterName);
 111        GlobalFree(pPrinterName);
 112        return jPrinterName;
 113     } else {
 114         return NULL;
 115     }
 116 
 117     CATCH_BAD_ALLOC_RET(NULL);
 118 }
 119 
 120 
 121 JNIEXPORT jobjectArray JNICALL
 122 Java_sun_print_PrintServiceLookupProvider_getAllPrinterNames(JNIEnv *env,
 123                                                           jobject peer)
 124 {
 125     TRY;
 126 
 127     DWORD cbNeeded = 0;
 128     DWORD cReturned = 0;
 129     LPBYTE pPrinterEnum = NULL;
 130 
 131     jstring utf_str;
 132     jclass clazz = env->FindClass("java/lang/String");
 133     if (clazz == NULL) {
 134         return NULL;
 135     }
 136     jobjectArray nameArray;
 137 
 138     try {
 139         ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 140                        NULL, 4, NULL, 0, &cbNeeded, &cReturned);


 157             PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
 158                 (pPrinterEnum + i * sizeof(PRINTER_INFO_4));
 159             utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
 160             if (utf_str == NULL) {
 161                 throw std::bad_alloc();
 162             }
 163             env->SetObjectArrayElement(nameArray, i, utf_str);
 164             env->DeleteLocalRef(utf_str);
 165         }
 166     } catch (std::bad_alloc&) {
 167         delete [] pPrinterEnum;
 168         throw;
 169     }
 170 
 171     delete [] pPrinterEnum;
 172     return nameArray;
 173 
 174     CATCH_BAD_ALLOC_RET(NULL);
 175 }
 176 
 177 
 178 JNIEXPORT jlong JNICALL
 179 Java_sun_print_PrintServiceLookupProvider_notifyFirstPrinterChange(JNIEnv *env,
 180                                                                 jobject peer,
 181                                                                 jstring printer) {
 182     HANDLE hPrinter;
 183 
 184     LPTSTR printerName = NULL;
 185     if (printer != NULL) {
 186         printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
 187                                                          printer,
 188                                                          NULL);
 189         JNU_ReleaseStringPlatformChars(env, printer, printerName);
 190     }
 191 
 192     // printerName - "Win NT/2K/XP: If NULL, it indicates the local printer
 193     // server" - MSDN.   Win9x : OpenPrinter returns 0.
 194     BOOL ret = OpenPrinter(printerName, &hPrinter, NULL);
 195     if (!ret) {
 196       return (jlong)-1;
 197     }
 198 
 199     // PRINTER_CHANGE_PRINTER = PRINTER_CHANGE_ADD_PRINTER |
 200     //                          PRINTER_CHANGE_SET_PRINTER |
 201     //                          PRINTER_CHANGE_DELETE_PRINTER |
 202     //                          PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
 203     HANDLE chgObj = FindFirstPrinterChangeNotification(hPrinter,
 204                                                        PRINTER_CHANGE_PRINTER,
 205                                                        0,
 206                                                        NULL);
 207     return (chgObj == INVALID_HANDLE_VALUE) ? (jlong)-1 : (jlong)chgObj;
 208 }
 209 
 210 
 211 
 212 JNIEXPORT void JNICALL
 213 Java_sun_print_PrintServiceLookupProvider_notifyClosePrinterChange(JNIEnv *env,
 214                                                                 jobject peer,
 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




  27 
  28 #include "stdhdrs.h"
  29 #include <commdlg.h>
  30 #include <winspool.h>
  31 #include <limits.h>
  32 #include <float.h>
  33 
  34 #include "awt_Toolkit.h"
  35 #include "awt_PrintControl.h"
  36 
  37 /* values for parameter "type" of XXX_getJobStatus() */
  38 #define GETJOBCOUNT  1
  39 #define ACCEPTJOB    2
  40 
  41 static const char *HPRINTER_STR = "hPrintJob";
  42 
  43 /* constants for DeviceCapability buffer lengths */
  44 #define PAPERNAME_LENGTH 64
  45 #define TRAYNAME_LENGTH 24
  46 

  47 static BOOL IsSupportedLevel(HANDLE hPrinter, DWORD dwLevel) {
  48     BOOL isSupported = FALSE;
  49     DWORD cbBuf = 0;
  50     LPBYTE pPrinter = NULL;
  51 
  52     DASSERT(hPrinter != NULL);
  53 
  54     VERIFY(::GetPrinter(hPrinter, dwLevel, NULL, 0, &cbBuf) == 0);
  55     if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
  56         pPrinter = new BYTE[cbBuf];
  57         if (::GetPrinter(hPrinter, dwLevel, pPrinter, cbBuf, &cbBuf)) {
  58             isSupported = TRUE;
  59         }
  60         delete[] pPrinter;
  61     }
  62 
  63     return isSupported;
  64 }
  65 
  66 


  99        int len = lstrlen(cBuffer);
 100        while ((index < len) && cBuffer[index] != _T(',')) {
 101               index++;
 102        }
 103        if (index==0) {
 104          return NULL;
 105        }
 106 
 107        pPrinterName = (LPTSTR)GlobalAlloc(GPTR, (index+1)*sizeof(TCHAR));
 108        lstrcpyn(pPrinterName, cBuffer, index+1);
 109        jPrinterName = JNU_NewStringPlatform(env, pPrinterName);
 110        GlobalFree(pPrinterName);
 111        return jPrinterName;
 112     } else {
 113         return NULL;
 114     }
 115 
 116     CATCH_BAD_ALLOC_RET(NULL);
 117 }
 118 

 119 JNIEXPORT jobjectArray JNICALL
 120 Java_sun_print_PrintServiceLookupProvider_getAllPrinterNames(JNIEnv *env,
 121                                                           jobject peer)
 122 {
 123     TRY;
 124 
 125     DWORD cbNeeded = 0;
 126     DWORD cReturned = 0;
 127     LPBYTE pPrinterEnum = NULL;
 128 
 129     jstring utf_str;
 130     jclass clazz = env->FindClass("java/lang/String");
 131     if (clazz == NULL) {
 132         return NULL;
 133     }
 134     jobjectArray nameArray;
 135 
 136     try {
 137         ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 138                        NULL, 4, NULL, 0, &cbNeeded, &cReturned);


 155             PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
 156                 (pPrinterEnum + i * sizeof(PRINTER_INFO_4));
 157             utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
 158             if (utf_str == NULL) {
 159                 throw std::bad_alloc();
 160             }
 161             env->SetObjectArrayElement(nameArray, i, utf_str);
 162             env->DeleteLocalRef(utf_str);
 163         }
 164     } catch (std::bad_alloc&) {
 165         delete [] pPrinterEnum;
 166         throw;
 167     }
 168 
 169     delete [] pPrinterEnum;
 170     return nameArray;
 171 
 172     CATCH_BAD_ALLOC_RET(NULL);
 173 }
 174 

 175 JNIEXPORT jlong JNICALL
 176 Java_sun_print_PrintServiceLookupProvider_GetRemotePrintersCount(JNIEnv *env,
 177                                                            jobject peer) {
 178     DWORD cbNeeded = 0;
 179     DWORD cReturned = 0;



































 180 
 181     ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
 182                        NULL, 4, NULL, 0, &cbNeeded, &cReturned);
 183 
 184     return (cbNeeded/sizeof(PRINTER_INFO_4));












 185 }

 186 
 187 JNIEXPORT jfloatArray JNICALL
 188 Java_sun_print_Win32PrintService_getMediaPrintableArea(JNIEnv *env,
 189                                                   jobject peer,
 190                                                   jstring printer,
 191                                                   jint  papersize)
 192 {
 193     TRY;
 194 
 195     LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env,
 196                                                             printer, NULL);
 197     if (printerName == NULL) {
 198         return NULL;
 199     }
 200 
 201     jfloatArray printableArray = NULL;
 202 
 203     SAVE_CONTROLWORD
 204     HDC pdc = CreateDC(TEXT("WINSPOOL"), printerName, NULL, NULL);
 205     RESTORE_CONTROLWORD


< prev index next >