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
|