src/windows/native/java/lang/java_props_md.c
Print this page
*** 21,30 ****
--- 21,35 ----
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+ /* Access APIs for Windows Vista and above */
+ #ifndef _WIN32_WINNT
+ #define _WIN32_WINNT 0x0601
+ #endif
+
#include <windows.h>
#include <shlobj.h>
#include <objidl.h>
#include <locale.h>
#include <sys/types.h>
*** 47,58 ****
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
static void SetupI18nProps(LCID lcid, char** language, char** script, char** country,
char** variant, char** encoding);
- #define SHELL_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
-
#define PROPSIZE 9 // eight-letter + null terminator
#define SNAMESIZE 86 // max number of chars for LOCALE_SNAME is 85
static char *
getEncodingInternal(LCID lcid)
--- 52,61 ----
*** 172,250 ****
return ret;
}
/*
- * Code to figure out the user's home directory using the registry
- */
- static WCHAR*
- getHomeFromRegistry()
- {
- HKEY key;
- int rc;
- DWORD type;
- WCHAR *p;
- WCHAR path[MAX_PATH+1];
- int size = MAX_PATH+1;
-
- rc = RegOpenKeyEx(HKEY_CURRENT_USER, SHELL_KEY, 0, KEY_READ, &key);
- if (rc != ERROR_SUCCESS) {
- // Shell folder doesn't exist??!!
- return NULL;
- }
-
- path[0] = 0;
- rc = RegQueryValueExW(key, L"Desktop", 0, &type, (LPBYTE)path, &size);
- if (rc != ERROR_SUCCESS || type != REG_SZ) {
- return NULL;
- }
- RegCloseKey(key);
- /* Get the parent of Desktop directory */
- p = wcsrchr(path, L'\\');
- if (p == NULL) {
- return NULL;
- }
- *p = L'\0';
- return _wcsdup(path);
- }
-
- /*
* Code to figure out the user's home directory using shell32.dll
*/
WCHAR*
getHomeFromShell32()
{
! HRESULT rc;
! LPITEMIDLIST item_list = 0;
! WCHAR *p;
! WCHAR path[MAX_PATH+1];
! int size = MAX_PATH+1;
! rc = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &item_list);
! if (!SUCCEEDED(rc)) {
! // we can't find the shell folder.
! return NULL;
}
! path[0] = 0;
! SHGetPathFromIDListW(item_list, (LPWSTR)path);
!
! /* Get the parent of Desktop directory */
! p = wcsrchr(path, L'\\');
! if (p) {
! *p = 0;
! }
! /*
! * We've been successful. Note that we don't free the memory allocated
! * by ShGetSpecialFolderLocation. We only ever come through here once,
! * and only if the registry lookup failed, so it's just not worth it.
! *
! * We also don't unload the SHELL32 DLL. We've paid the hit for loading
! * it and we may need it again later.
*/
! return _wcsdup(path);
}
static boolean
haveMMX(void)
{
--- 175,231 ----
return ret;
}
/*
* Code to figure out the user's home directory using shell32.dll
*/
WCHAR*
getHomeFromShell32()
{
! /*
! * Note that we don't free the memory allocated
! * by getHomeFromShell32.
! */
! static WCHAR *u_path = NULL;
! if (u_path == NULL) {
! HRESULT hr;
! /*
! * SHELL32 DLL is delay load DLL and we can use the trick with
! * __try/__except block.
! */
! __try {
! /*
! * For Windows Vista and later (or patched MS OS) we need to use
! * [SHGetKnownFolderPath] call to avoid MAX_PATH length limitation.
! * Shell32.dll (version 6.0.6000 or later)
! */
! hr = SHGetKnownFolderPath(&FOLDERID_Profile, KF_FLAG_DONT_VERIFY, NULL, &u_path);
! } __except(EXCEPTION_EXECUTE_HANDLER) {
! /* Exception: no [SHGetKnownFolderPath] entry */
! hr = E_FAIL;
}
! if (FAILED(hr)) {
! WCHAR path[MAX_PATH+1];
! /* fallback solution for WinXP and Windows 2000 */
! hr = SHGetFolderPathW(NULL, CSIDL_FLAG_DONT_VERIFY | CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, path);
! if (FAILED(hr)) {
! /* we can't find the shell folder. */
! u_path = NULL;
! } else {
! /* Just to be sure about the path length until Windows Vista approach.
! * [S_FALSE] could not be returned due to [CSIDL_FLAG_DONT_VERIFY] flag and UNICODE version.
*/
! path[MAX_PATH] = 0;
! u_path = _wcsdup(path);
! }
! }
! }
! return u_path;
}
static boolean
haveMMX(void)
{
*** 334,344 ****
{
static java_props_t sprops = {0};
OSVERSIONINFOEX ver;
! if (sprops.user_dir) {
return &sprops;
}
/* AWT properties */
sprops.awt_toolkit = "sun.awt.windows.WToolkit";
--- 315,325 ----
{
static java_props_t sprops = {0};
OSVERSIONINFOEX ver;
! if (sprops.line_separator) {
return &sprops;
}
/* AWT properties */
sprops.awt_toolkit = "sun.awt.windows.WToolkit";
*** 536,568 ****
sprops.user_name = (uname != NULL) ? uname : L"unknown";
}
}
/*
! * Home directory/
! *
! * We first look under a standard registry key. If that fails we
! * fall back on using a SHELL32.DLL API. If that fails we use a
! * default value.
! *
! * Note: To save space we want to avoid loading SHELL32.DLL
! * unless really necessary. However if we do load it, we leave it
! * in memory, as it may be needed again later.
*
* The normal result is that for a given user name XXX:
* On multi-user NT, user.home gets set to c:\winnt\profiles\XXX.
* On multi-user Win95, user.home gets set to c:\windows\profiles\XXX.
* On single-user Win95, user.home gets set to c:\windows.
*/
{
! WCHAR *homep = getHomeFromRegistry();
if (homep == NULL) {
- homep = getHomeFromShell32();
- if (homep == NULL)
homep = L"C:\\";
}
! sprops.user_home = _wcsdup(homep);
}
/*
* user.language
* user.script, user.country, user.variant (if user's environment specifies them)
--- 517,539 ----
sprops.user_name = (uname != NULL) ? uname : L"unknown";
}
}
/*
! * Home directory
*
* The normal result is that for a given user name XXX:
* On multi-user NT, user.home gets set to c:\winnt\profiles\XXX.
* On multi-user Win95, user.home gets set to c:\windows\profiles\XXX.
* On single-user Win95, user.home gets set to c:\windows.
*/
{
! WCHAR *homep = getHomeFromShell32();
if (homep == NULL) {
homep = L"C:\\";
}
! sprops.user_home = homep;
}
/*
* user.language
* user.script, user.country, user.variant (if user's environment specifies them)