void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID, LPCTSTR propName, float invScale) { HGDIOBJ font = GetStockObject(fontID); if (font != NULL && SelectObject(dc, font) != NULL) { int length = GetTextFace(dc, 0, NULL); if (length > 0) { LPTSTR face = new TCHAR[length]; if (GetTextFace(dc, length, face) > 0) { TEXTMETRIC metrics; if (GetTextMetrics(dc, &metrics) > 0) { jstring fontName = NULL; if (!wcscmp(face, L"MS Shell Dlg")) { // MS Shell Dlg is an indirect font name, find the // real face name from the registry. LPTSTR shellDialogFace = resolveShellDialogFont(); if (shellDialogFace != NULL) { fontName = JNU_NewStringPlatform(GetEnv(), shellDialogFace); free(shellDialogFace); } else { // Couldn't determine mapping for MS Shell Dlg, // fall back to Microsoft Sans Serif fontName = JNU_NewStringPlatform(GetEnv(), L"Microsoft Sans Serif"); } } else { fontName = JNU_NewStringPlatform(GetEnv(), face); } if (fontName == NULL) { delete[] face; throw std::bad_alloc(); } jint pointSize = rescale(metrics.tmHeight - metrics.tmInternalLeading, invScale); jint style = java_awt_Font_PLAIN; if (metrics.tmWeight >= FW_BOLD) { style = java_awt_Font_BOLD; } if (metrics.tmItalic ) { style |= java_awt_Font_ITALIC; } jstring key = JNU_NewStringPlatform(GetEnv(), propName); if (key == NULL) { GetEnv()->DeleteLocalRef(fontName); delete[] face; throw std::bad_alloc(); } GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setFontPropertyID, key, fontName, style, pointSize); GetEnv()->DeleteLocalRef(key); GetEnv()->DeleteLocalRef(fontName); } } delete[] face; } } }
Bool awt_x11inputmethod_lookupString(XKeyPressedEvent *event, KeySym *keysymp) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); X11InputMethodData *pX11IMData; KeySym keysym = NoSymbol; Status status; int mblen; jstring javastr; XIC ic; Bool result = True; static Bool composing = False; /* printf("lookupString: entering...\n"); */ pX11IMData = getX11InputMethodData(env, currentX11InputMethodInstance); if (pX11IMData == NULL) { #ifdef __linux__ return False; #else return result; #endif } if ((ic = pX11IMData->current_ic) == (XIC)0){ #ifdef __linux__ return False; #else return result; #endif } /* allocate the lookup buffer at the first invocation */ if (pX11IMData->lookup_buf_len == 0) { pX11IMData->lookup_buf = (char *)malloc(INITIAL_LOOKUP_BUF_SIZE); if (pX11IMData->lookup_buf == NULL) { THROW_OUT_OF_MEMORY_ERROR(); return result; } pX11IMData->lookup_buf_len = INITIAL_LOOKUP_BUF_SIZE; } mblen = XmbLookupString(ic, event, pX11IMData->lookup_buf, pX11IMData->lookup_buf_len - 1, &keysym, &status); /* * In case of overflow, a buffer is allocated and it retries * XmbLookupString(). */ if (status == XBufferOverflow) { free((void *)pX11IMData->lookup_buf); pX11IMData->lookup_buf_len = 0; pX11IMData->lookup_buf = (char *)malloc(mblen + 1); if (pX11IMData->lookup_buf == NULL) { THROW_OUT_OF_MEMORY_ERROR(); return result; } pX11IMData->lookup_buf_len = mblen + 1; mblen = XmbLookupString(ic, event, pX11IMData->lookup_buf, pX11IMData->lookup_buf_len - 1, &keysym, &status); } pX11IMData->lookup_buf[mblen] = 0; /* Get keysym without taking modifiers into account first to map * to AWT keyCode table. */ if (((event->state & ShiftMask) || (event->state & LockMask)) && keysym >= 'A' && keysym <= 'Z') { keysym = XLookupKeysym(event, 0); } switch (status) { case XLookupBoth: if (!composing) { if (keysym < 128 || ((keysym & 0xff00) == 0xff00)) { *keysymp = keysym; result = False; break; } } composing = False; /*FALLTHRU*/ case XLookupChars: /* printf("lookupString: status=XLookupChars, type=%d, state=%x, keycode=%x, keysym=%x\n", event->type, event->state, event->keycode, keysym); */ javastr = JNU_NewStringPlatform(env, (const char *)pX11IMData->lookup_buf); if (javastr != NULL) { JNU_CallMethodByName(env, NULL, currentX11InputMethodInstance, "dispatchCommittedText", "(Ljava/lang/String;J)V", javastr, #ifndef XAWT_HACK awt_util_nowMillisUTC_offset(event->time)); #else event->time); #endif } break; case XLookupKeySym: /* printf("lookupString: status=XLookupKeySym, type=%d, state=%x, keycode=%x, keysym=%x\n", event->type, event->state, event->keycode, keysym); */ if (keysym == XK_Multi_key) composing = True; if (! composing) { *keysymp = keysym; result = False; } break; case XLookupNone: /* printf("lookupString: status=XLookupNone, type=%d, state=%x, keycode=%x, keysym=%x\n", event->type, event->state, event->keycode, keysym); */ break; }
/* * Class: sun_awt_datatransfer_DataTransferer * Method: draqQueryFile * Signature: ([B)[Ljava/lang/String; */ JNIEXPORT jobjectArray JNICALL Java_sun_awt_windows_WDataTransferer_dragQueryFile (JNIEnv *env, jobject obj, jbyteArray bytes) { TRY; /* * Fix for the BugTraq ID 4327064 - inter-jvm DnD crashes the droping jvm. * On Win9X DragQueryFile() doesn't accept a pointer to the local help as the first * argument, so we should dump the bits into global memory. */ UINT size = env->GetArrayLength(bytes); HGLOBAL hglobal = NULL; jbyte *bBytes = NULL; HDROP hdrop = NULL; LPTSTR buffer = NULL; hglobal = ::GlobalAlloc(GALLOCFLG, size); if (hglobal == NULL) { throw std::bad_alloc(); } try { bBytes = (jbyte*)::GlobalLock(hglobal); env->GetByteArrayRegion(bytes, 0, size, bBytes); hdrop = (HDROP)bBytes; UINT nFilenames = ::DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0); jclass str_clazz = env->FindClass("java/lang/String"); DASSERT(str_clazz != NULL); jobjectArray filenames = env->NewObjectArray(nFilenames, str_clazz, NULL); if (filenames == NULL) { throw std::bad_alloc(); } UINT bufsize = 512; // in characters, not in bytes buffer = (LPTSTR)SAFE_SIZE_ARRAY_ALLOC(safe_Malloc, bufsize, sizeof(TCHAR)); for (UINT i = 0; i < nFilenames; i++) { UINT size = ::DragQueryFile(hdrop, i, NULL, 0); if (size > bufsize) { bufsize = size; buffer = (LPTSTR)SAFE_SIZE_ARRAY_REALLOC(safe_Realloc, buffer, bufsize, sizeof(TCHAR)); } ::DragQueryFile(hdrop, i, buffer, bufsize); jstring name = JNU_NewStringPlatform(env, buffer); if (name == NULL) { throw std::bad_alloc(); } env->SetObjectArrayElement(filenames, i, name); } free(buffer); ::GlobalUnlock(hglobal); ::GlobalFree(hglobal); return filenames; } catch (std::bad_alloc&) { free(buffer); ::GlobalUnlock(hglobal); ::GlobalFree(hglobal); throw; } CATCH_BAD_ALLOC_RET(NULL); }
/* * Returns list of media: pages + trays */ JNIEXPORT jobjectArray JNICALL Java_sun_print_CUPSPrinter_getMedia(JNIEnv *env, jobject printObj, jstring printer) { ppd_file_t *ppd; ppd_option_t *optionTray, *optionPage; ppd_choice_t *choice; const char *name; const char *filename; int i, nTrays=0, nPages=0, nTotal=0; jstring utf_str; jclass cls; jobjectArray nameArray = NULL; name = (*env)->GetStringUTFChars(env, printer, NULL); if (name == NULL) { (*env)->ExceptionClear(env); JNU_ThrowOutOfMemoryError(env, "Could not create printer name"); return NULL; } // NOTE: cupsGetPPD returns a pointer to a filename of a temporary file. // unlink() must be caled to remove the file when finished using it. filename = j2d_cupsGetPPD(name); (*env)->ReleaseStringUTFChars(env, printer, name); CHECK_NULL_RETURN(filename, NULL); cls = (*env)->FindClass(env, "java/lang/String"); CHECK_NULL_RETURN(cls, NULL); if ((ppd = j2d_ppdOpenFile(filename)) == NULL) { unlink(filename); DPRINTF("CUPSfuncs::unable to open PPD %s\n", filename); return NULL; } optionPage = j2d_ppdFindOption(ppd, "PageSize"); if (optionPage != NULL) { nPages = optionPage->num_choices; } optionTray = j2d_ppdFindOption(ppd, "InputSlot"); if (optionTray != NULL) { nTrays = optionTray->num_choices; } if ((nTotal = (nPages+nTrays) *2) > 0) { nameArray = (*env)->NewObjectArray(env, nTotal, cls, NULL); if (nameArray == NULL) { unlink(filename); j2d_ppdClose(ppd); DPRINTF("CUPSfuncs::bad alloc new array\n", "") (*env)->ExceptionClear(env); JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); return NULL; } for (i = 0; optionPage!=NULL && i<nPages; i++) { choice = (optionPage->choices)+i; utf_str = JNU_NewStringPlatform(env, choice->text); if (utf_str == NULL) { unlink(filename); j2d_ppdClose(ppd); DPRINTF("CUPSfuncs::bad alloc new string ->text\n", "") JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); return NULL; } (*env)->SetObjectArrayElement(env, nameArray, i*2, utf_str); (*env)->DeleteLocalRef(env, utf_str); utf_str = JNU_NewStringPlatform(env, choice->choice); if (utf_str == NULL) { unlink(filename); j2d_ppdClose(ppd); DPRINTF("CUPSfuncs::bad alloc new string ->choice\n", "") JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); return NULL; } (*env)->SetObjectArrayElement(env, nameArray, i*2+1, utf_str); (*env)->DeleteLocalRef(env, utf_str); } for (i = 0; optionTray!=NULL && i<nTrays; i++) { choice = (optionTray->choices)+i; utf_str = JNU_NewStringPlatform(env, choice->text); if (utf_str == NULL) { unlink(filename); j2d_ppdClose(ppd); DPRINTF("CUPSfuncs::bad alloc new string text\n", "") JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); return NULL; } (*env)->SetObjectArrayElement(env, nameArray, (nPages+i)*2, utf_str); (*env)->DeleteLocalRef(env, utf_str); utf_str = JNU_NewStringPlatform(env, choice->choice); if (utf_str == NULL) { unlink(filename); j2d_ppdClose(ppd); DPRINTF("CUPSfuncs::bad alloc new string choice\n", "") JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); return NULL; } (*env)->SetObjectArrayElement(env, nameArray, (nPages+i)*2+1, utf_str); (*env)->DeleteLocalRef(env, utf_str); } } j2d_ppdClose(ppd); unlink(filename); return nameArray; }
jint AWT_OnLoad(JavaVM *vm, void *reserved) { Dl_info dlinfo; char buf[MAXPATHLEN]; int32_t len; char *p, *tk = 0; JNI_OnLoad_type *JNI_OnLoad_ptr; struct utsname name; JNIEnv *env = (JNIEnv *)JNU_GetEnv(vm, JNI_VERSION_1_2); void *v; char *envvar; jstring fmanager = NULL; jstring fmProp = NULL; if (awtHandle != NULL) { /* Avoid several loading attempts */ return JNI_VERSION_1_2; } jvm = vm; /* Get address of this library and the directory containing it. */ dladdr((void *)JNI_OnLoad, &dlinfo); realpath((char *)dlinfo.dli_fname, buf); len = strlen(buf); p = strrchr(buf, '/'); /* * 1. Set the "sun.font.fontmanager" system property, * 2. Choose the library image name. */ fmProp = (*env)->NewStringUTF(env, "sun.font.fontmanager"); /* Check if toolkit is specified in env variable */ #ifdef MACOSX envvar = getenv("AWT_TOOLKIT"); if (envvar && strstr(envvar, "XToolkit")) { #endif fmanager = (*env)->NewStringUTF(env, "sun.awt.X11FontManager"); tk = "/xawt/libmawt"; #ifdef MACOSX } else { fmanager = (*env)->NewStringUTF(env, "sun.font.CFontManager"); tk = "/lwawt/liblwawt"; } #endif if (fmanager && fmProp) { JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", fmProp, fmanager); } /* Calculate library name to load */ #ifndef MACOSX if (AWTIsHeadless()) { strcpy(p, "/headless/libmawt"); } else if (tk) { #endif strcpy(p, tk); #ifndef MACOSX } #endif #ifdef MACOSX strcat(p, ".dylib"); #else strcat(p, ".so"); #endif if (tk) { JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "load", "(Ljava/lang/String;)V", JNU_NewStringPlatform(env, buf)); awtHandle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); } return JNI_VERSION_1_2; }
/* * Class: sun_awt_shell_Win32ShellFolder * Method: getLinkLocation * Signature: (JJ)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder_getLinkLocation (JNIEnv* env, jobject folder, jlong parentIShellFolder, jlong relativePIDL) { HRESULT hres; IShellLink* psl; char szGotPath[MAX_PATH]; WIN32_FIND_DATA wfd; CHAR szBuf[MAX_PATH]; STRRET strret; OLECHAR olePath[MAX_PATH]; // wide-char version of path name LPWSTR wstr; IShellFolder* pParent = (IShellFolder*)parentIShellFolder; if (pParent == NULL) { return NULL; } LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL; if (pidl == NULL) { return NULL; } pParent->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_FORPARSING, &strret); switch (strret.uType) { case STRRET_CSTR : // IShellFolder::ParseDisplayName requires the path name in Unicode. MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, strret.cStr, -1, olePath, MAX_PATH); wstr = olePath; break; case STRRET_OFFSET : MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (CHAR *)(pidl + strret.uOffset), -1, olePath, MAX_PATH); wstr = olePath; break; case STRRET_WSTR : wstr = strret.pOleStr; break; } CoInitialize(NULL); hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl); if (SUCCEEDED(hres)) { IPersistFile* ppf; hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); if (SUCCEEDED(hres)) { hres = ppf->Load(wstr, STGM_READ); if (SUCCEEDED(hres)) { //hres = psl->Resolve(NULL, SLR_NO_UI); hres = psl->Resolve(NULL, 0); if (SUCCEEDED(hres)) { hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd, SLGP_SHORTPATH); if (SUCCEEDED(hres)) { lstrcpy(szBuf, szGotPath); } } } ppf->Release(); } psl->Release(); } CoUninitialize(); if (SUCCEEDED(hres)) { return JNU_NewStringPlatform(env, szBuf); } else { return NULL; } }
BOOL AwtPrintControl::UpdateAttributes(JNIEnv *env, jobject printCtrl, PRINTDLG &pd) { DEVNAMES *devnames = NULL; DEVMODE *devmode = NULL; unsigned int copies = 1; DWORD pdFlags = pd.Flags; DWORD dmFields = 0, dmValues = 0; bool newDC = false; // This call ensures that default PrintService gets updated for the // case where initially, there weren't any printers. env->CallObjectMethod(printCtrl, AwtPrintControl::getPrinterID); if (pd.hDevMode != NULL) { devmode = (DEVMODE *)::GlobalLock(pd.hDevMode); DASSERT(!IsBadReadPtr(devmode, sizeof(DEVMODE))); } if (devmode != NULL) { /* Query the settings we understand and are interested in. * For the flags that are set in dmFields, where the values * are a simple enumeration, set the same bits in a clean dmFields * variable, and set bits in a dmValues variable to indicate the * selected value. These can all be passed up to Java in one * call to sync up the Java view of this. */ if (devmode->dmFields & DM_COPIES) { dmFields |= DM_COPIES; copies = devmode->dmCopies; if (pd.nCopies == 1) { env->SetBooleanField(printCtrl, driverDoesMultipleCopiesID, JNI_TRUE); } else { copies = pd.nCopies; } } if (devmode->dmFields & DM_PAPERSIZE) { env->CallVoidMethod(printCtrl, AwtPrintControl::setWin32MediaID, devmode->dmPaperSize, devmode->dmPaperWidth, devmode->dmPaperLength); } if (devmode->dmFields & DM_DEFAULTSOURCE) { env->CallVoidMethod(printCtrl, AwtPrintControl::setWin32MediaTrayID, devmode->dmDefaultSource); } if (devmode->dmFields & DM_COLOR) { dmFields |= DM_COLOR; if (devmode->dmColor == DMCOLOR_COLOR) { dmValues |= SET_COLOR; } } if (devmode->dmFields & DM_ORIENTATION) { dmFields |= DM_ORIENTATION; if (devmode->dmOrientation == DMORIENT_LANDSCAPE) { dmValues |= SET_ORIENTATION; } } if (devmode->dmFields & DM_COLLATE) { dmFields |= DM_COLLATE; if (devmode->dmCollate == DMCOLLATE_TRUE) { pdFlags |= PD_COLLATE; env->SetBooleanField(printCtrl, driverDoesCollationID, JNI_TRUE); } else { pdFlags &= ~PD_COLLATE; } } if (devmode->dmFields & DM_PRINTQUALITY) { /* value < 0 indicates quality setting. * value > 0 indicates X resolution. In that case * hopefully we will also find y-resolution specified. * If its not, assume its the same as x-res. * Maybe Java code should try to reconcile this against * the printers claimed set of supported resolutions. */ if (devmode->dmPrintQuality < 0) { if (dmFields |= DM_PRINTQUALITY) { if (devmode->dmPrintQuality == DMRES_HIGH) { dmValues |= SET_RES_HIGH; } else if ((devmode->dmPrintQuality == DMRES_LOW) || (devmode->dmPrintQuality == DMRES_DRAFT)) { dmValues |= SET_RES_LOW; } else if (devmode->dmPrintQuality == DMRES_MEDIUM) { /* default */ } } } else { int xRes = devmode->dmPrintQuality; int yRes = (devmode->dmFields & DM_YRESOLUTION) ? devmode->dmYResolution : devmode->dmPrintQuality; env->CallVoidMethod(printCtrl, AwtPrintControl::setResID, xRes, yRes); } } if (devmode->dmFields & DM_DUPLEX) { dmFields |= DM_DUPLEX; if (devmode->dmDuplex == DMDUP_HORIZONTAL) { dmValues |= SET_DUP_HORIZONTAL; } else if (devmode->dmDuplex == DMDUP_VERTICAL) { dmValues |= SET_DUP_VERTICAL; } } ::GlobalUnlock(pd.hDevMode); devmode = NULL; } else { copies = pd.nCopies; } if (pd.hDevNames != NULL) { DEVNAMES *devnames = (DEVNAMES*)::GlobalLock(pd.hDevNames); DASSERT(!IsBadReadPtr(devnames, sizeof(DEVNAMES))); LPTSTR lpcNames = (LPTSTR)devnames; LPTSTR pbuf = (_tcslen(lpcNames + devnames->wDeviceOffset) == 0 ? TEXT("") : lpcNames + devnames->wDeviceOffset); if (pbuf != NULL) { jstring jstr = JNU_NewStringPlatform(env, pbuf); env->CallVoidMethod(printCtrl, AwtPrintControl::setPrinterID, jstr); env->DeleteLocalRef(jstr); } pbuf = (_tcslen(lpcNames + devnames->wOutputOffset) == 0 ? TEXT("") : lpcNames + devnames->wOutputOffset); if (pbuf != NULL) { if (wcscmp(pbuf, L"FILE:") == 0) { pdFlags |= PD_PRINTTOFILE; } } ::GlobalUnlock(pd.hDevNames); devnames = NULL; } env->CallVoidMethod(printCtrl, AwtPrintControl::setNativeAttID, pdFlags, dmFields, dmValues); // copies & range are always set so no need to check for any flags env->CallVoidMethod(printCtrl, AwtPrintControl::setRangeCopiesID, pd.nFromPage, pd.nToPage, (pdFlags & PD_PAGENUMS), copies); // repeated calls to printDialog should not leak handles HDC oldDC = AwtPrintControl::getPrintDC(env, printCtrl); if (pd.hDC != oldDC) { if (oldDC != NULL) { ::DeleteDC(oldDC); } AwtPrintControl::setPrintDC(env, printCtrl, pd.hDC); newDC = true; } // Need to update WPrinterJob with device resolution settings for // new or changed DC. setCapabilities(env, printCtrl, pd.hDC); HGLOBAL oldG = AwtPrintControl::getPrintHDMode(env, printCtrl); if (pd.hDevMode != oldG) { AwtPrintControl::setPrintHDMode(env, printCtrl, pd.hDevMode); } oldG = AwtPrintControl::getPrintHDName(env, printCtrl); if (pd.hDevNames != oldG) { AwtPrintControl::setPrintHDName(env, printCtrl, pd.hDevNames); } return newDC; }
/* * Copy settings from print dialog & any devmode back into attributes * or properties. */ BOOL AwtPrintControl::UpdateAttributes(JNIEnv *env, jobject printCtrl, PRINTDLG &pd) { DEVNAMES *devnames = NULL; DEVMODE *devmode = NULL; unsigned int copies = 1; DWORD pdFlags = pd.Flags; DWORD dmFields; bool newDC = false; // This call ensures that default PrintService gets updated for the // case where initially, there weren't any printers. env->CallObjectMethod(printCtrl, AwtPrintControl::getPrinterID); if (pd.hDevMode != NULL) { devmode = (DEVMODE *)::GlobalLock(pd.hDevMode); DASSERT(!IsBadReadPtr(devmode, sizeof(DEVMODE))); } if (devmode != NULL) { dmFields = devmode->dmFields; if (devmode->dmFields & DM_COPIES) { copies = devmode->dmCopies; if (pd.nCopies == 1) { env->SetBooleanField(printCtrl, driverDoesMultipleCopiesID, JNI_TRUE); } else { copies = pd.nCopies; } } if (devmode->dmFields & DM_PAPERSIZE) { env->CallVoidMethod(printCtrl, AwtPrintControl::setWin32MediaID, devmode->dmPaperSize, devmode->dmPaperWidth, devmode->dmPaperLength); } if (devmode->dmFields & DM_COLOR) { if (devmode->dmColor == DMCOLOR_COLOR) { dmFields |= SET_COLOR; } else { dmFields &= ~SET_COLOR; } } if (devmode->dmFields & DM_ORIENTATION) { if (devmode->dmOrientation == DMORIENT_LANDSCAPE) { dmFields |= SET_ORIENTATION; } else { dmFields &= ~SET_ORIENTATION; } } if (devmode->dmFields & DM_COLLATE) { if (devmode->dmCollate == DMCOLLATE_TRUE) { pdFlags |= PD_COLLATE; env->SetBooleanField(printCtrl, driverDoesCollationID, JNI_TRUE); } else { pdFlags &= ~PD_COLLATE; } } if (devmode->dmFields & DM_PRINTQUALITY) { if (devmode->dmPrintQuality == DMRES_HIGH) { dmFields |= SET_RES_HIGH; } else if ((devmode->dmPrintQuality == DMRES_LOW) || (devmode->dmPrintQuality == DMRES_DRAFT)) { dmFields |= SET_RES_LOW; } else if (devmode->dmPrintQuality == DMRES_MEDIUM) { dmFields &= ~(SET_RES_HIGH | SET_RES_LOW); } else { int xRes = devmode->dmPrintQuality; int yRes = (devmode->dmFields & DM_YRESOLUTION) ? devmode->dmYResolution : devmode->dmPrintQuality; env->CallVoidMethod(printCtrl, AwtPrintControl::setResID, xRes, yRes); dmFields &= ~DM_PRINTQUALITY; } } if (devmode->dmFields & DM_DUPLEX) { if (devmode->dmDuplex == DMDUP_HORIZONTAL) { dmFields |= SET_DUP_HORIZONTAL; } else if (devmode->dmDuplex == DMDUP_VERTICAL) { dmFields |= SET_DUP_VERTICAL; } else { dmFields &= ~(SET_DUP_HORIZONTAL | SET_DUP_VERTICAL); } } ::GlobalUnlock(pd.hDevMode); devmode = NULL; } else { copies = pd.nCopies; } if (pd.hDevNames != NULL) { DEVNAMES *devnames = (DEVNAMES*)::GlobalLock(pd.hDevNames); DASSERT(!IsBadReadPtr(devnames, sizeof(DEVNAMES))); LPTSTR lpcNames = (LPTSTR)devnames; LPTSTR pbuf = (_tcslen(lpcNames + devnames->wDeviceOffset) == 0 ? TEXT("") : lpcNames + devnames->wDeviceOffset); if (pbuf != NULL) { jstring jstr = JNU_NewStringPlatform(env, pbuf); env->CallVoidMethod(printCtrl, AwtPrintControl::setPrinterID, jstr); env->DeleteLocalRef(jstr); } ::GlobalUnlock(pd.hDevNames); devnames = NULL; } env->CallVoidMethod(printCtrl, AwtPrintControl::setNativeAttID, pdFlags, dmFields); // copies & range are always set so no need to check for any flags env->CallVoidMethod(printCtrl, AwtPrintControl::setRangeCopiesID, pd.nFromPage, pd.nToPage, (pdFlags & PD_PAGENUMS), copies); // repeated calls to printDialog should not leak handles HDC oldDC = AwtPrintControl::getPrintDC(env, printCtrl); if (pd.hDC != oldDC) { if (oldDC != NULL) { ::DeleteDC(oldDC); } AwtPrintControl::setPrintDC(env, printCtrl, pd.hDC); newDC = true; } // Need to update WPrinterJob with device resolution settings for // new or changed DC. setCapabilities(env, printCtrl, pd.hDC); HGLOBAL oldG = AwtPrintControl::getPrintHDMode(env, printCtrl); if (pd.hDevMode != oldG) { AwtPrintControl::setPrintHDMode(env, printCtrl, pd.hDevMode); } oldG = AwtPrintControl::getPrintHDName(env, printCtrl); if (pd.hDevNames != oldG) { AwtPrintControl::setPrintHDName(env, printCtrl, pd.hDevNames); } return newDC; }
JNIEXPORT jstring JNICALL Java_sun_awt_Win32GraphicsEnvironment_getEUDCFontFile(JNIEnv *env, jclass cl) { int rc; HKEY key; DWORD type; WCHAR fontPathBuf[MAX_PATH + 1]; unsigned long fontPathLen = MAX_PATH + 1; WCHAR tmpPath[MAX_PATH + 1]; LPWSTR fontPath = fontPathBuf; LPWSTR eudcKey = NULL; LANGID langID = GetSystemDefaultLangID(); //lookup for encoding ID, EUDC only supported in //codepage 932, 936, 949, 950 (and unicode) if (langID == LANGID_JA_JP) { eudcKey = EUDCKEY_JA_JP; } else if (langID == LANGID_ZH_CN || langID == LANGID_ZH_SG) { eudcKey = EUDCKEY_ZH_CN; } else if (langID == LANGID_ZH_HK || langID == LANGID_ZH_TW || langID == LANGID_ZH_MO) { eudcKey = EUDCKEY_ZH_TW; } else if (langID == LANGID_KO_KR) { eudcKey = EUDCKEY_KO_KR; } else { return NULL; } rc = RegOpenKeyEx(HKEY_CURRENT_USER, eudcKey, 0, KEY_READ, &key); if (rc != ERROR_SUCCESS) { return NULL; } rc = RegQueryValueEx(key, L"SystemDefaultEUDCFont", 0, &type, (LPBYTE)fontPath, &fontPathLen); RegCloseKey(key); if (rc != ERROR_SUCCESS || type != REG_SZ) { return NULL; } fontPath[fontPathLen] = L'\0'; if (wcsstr(fontPath, L"%SystemRoot%")) { //if the fontPath includes %SystemRoot% LPWSTR systemRoot = _wgetenv(L"SystemRoot"); if (systemRoot != NULL && swprintf(tmpPath, L"%s%s", systemRoot, fontPath + 12) != -1) { fontPath = tmpPath; } else { return NULL; } } else if (wcscmp(fontPath, L"EUDC.TTE") == 0) { //else to see if it only inludes "EUDC.TTE" WCHAR systemRoot[MAX_PATH + 1]; if (GetWindowsDirectory(systemRoot, MAX_PATH + 1) != 0) { swprintf(tmpPath, L"%s\\FONTS\\EUDC.TTE", systemRoot); fontPath = tmpPath; } else { return NULL; } } return JNU_NewStringPlatform(env, fontPath); }
jstring GetStringPlatform(JNIEnv *env, nchar* cstr) { return JNU_NewStringPlatform(env, cstr); }