configure.in: Added new MinGW-specific configure flag --with-win32-nlsapi.

* configure.in: Added new MinGW-specific configure flag
	--with-win32-nlsapi.
	Added new AC_DEFINE MINGW_LIBGCJ_UNICODE.
	Add -lunicows to MinGW SYSTEMSPEC if --with-win32-nlsapi
	is set to unicows.
	* configure: Rebuilt.
	* include/config.h.in: Rebuilt.
	* win32.cc (_Jv_Win32NewString): Implemented.
	(nativeToUnicode): New helper function defined only for
	non-UNICODE builds.
	(unicodeToNative): Likewise.
	(_Jv_Win32TempString): Implemented.
	(lots): Refactored using tchar.h macros.
	(WSAEventWrapper): Use _Jv_Win32NewString.
	(_Jv_platform_initialize): Use GetModuleFileNameA instead
	of GetModuleFileName.
	(_Jv_platform_initProperties): Use _Jv_Win32NewString.
	Use temporary stack buffer instead of a heap buffer.
	* include/win32.h
	Added defines for UNICODE and _UNICODE if MINGW_LIBGCJ_UNICODE is
	defined; added tchar.h include.
	(_Jv_Win32TempString): Declared new helper class.
	(JV_TEMP_STRING_WIN32): New helper macro.
	(_Jv_Win32NewString): Declared new helper method.
	* java/io/natFileDescriptorWin32.cc (open): Use
	JV_TEMP_STRING_WIN32 instead of JV_TEMP_UTF_STRING.
	(write): Reformatted slightly.
	* java/io/natFileWin32.cc (lots): Use tchar.h macros;
	use JV_TEMP_STRING_WIN32 instead of JV_TEMP_UTF_STRING.
	(getCanonicalPath): Use _Jv_Win32NewString instead of
	JvNewStringUTF.
	(performList): Likewise.
	* java/lang/natWin32Process.cc (ChildProcessPipe):
	Use tchar.h macros.
	(startProcess): Use tchar.h macros, JV_TEMP_STRING_WIN32,
	and UNICODE environment flag for CreateProcess.
	* java/net/natNetworkInterfaceWin32.cc
	(winsock2GetRealNetworkInterfaces): Use tchar.h macros and
	_Jv_Win32NewString.

From-SVN: r74201
This commit is contained in:
Mohan Embar 2003-12-02 22:26:50 +00:00 committed by Mohan Embar
parent 5f8a45f75c
commit 83c02e38a3
10 changed files with 721 additions and 471 deletions

View File

@ -1,3 +1,45 @@
2003-12-02 Mohan Embar <gnustuff@thisiscool.com>
* configure.in: Added new MinGW-specific configure flag
--with-win32-nlsapi.
Added new AC_DEFINE MINGW_LIBGCJ_UNICODE.
Add -lunicows to MinGW SYSTEMSPEC if --with-win32-nlsapi
is set to unicows.
* configure: Rebuilt.
* include/config.h.in: Rebuilt.
* win32.cc (_Jv_Win32NewString): Implemented.
(nativeToUnicode): New helper function defined only for
non-UNICODE builds.
(unicodeToNative): Likewise.
(_Jv_Win32TempString): Implemented.
(lots): Refactored using tchar.h macros.
(WSAEventWrapper): Use _Jv_Win32NewString.
(_Jv_platform_initialize): Use GetModuleFileNameA instead
of GetModuleFileName.
(_Jv_platform_initProperties): Use _Jv_Win32NewString.
Use temporary stack buffer instead of a heap buffer.
* include/win32.h
Added defines for UNICODE and _UNICODE if MINGW_LIBGCJ_UNICODE is
defined; added tchar.h include.
(_Jv_Win32TempString): Declared new helper class.
(JV_TEMP_STRING_WIN32): New helper macro.
(_Jv_Win32NewString): Declared new helper method.
* java/io/natFileDescriptorWin32.cc (open): Use
JV_TEMP_STRING_WIN32 instead of JV_TEMP_UTF_STRING.
(write): Reformatted slightly.
* java/io/natFileWin32.cc (lots): Use tchar.h macros;
use JV_TEMP_STRING_WIN32 instead of JV_TEMP_UTF_STRING.
(getCanonicalPath): Use _Jv_Win32NewString instead of
JvNewStringUTF.
(performList): Likewise.
* java/lang/natWin32Process.cc (ChildProcessPipe):
Use tchar.h macros.
(startProcess): Use tchar.h macros, JV_TEMP_STRING_WIN32,
and UNICODE environment flag for CreateProcess.
* java/net/natNetworkInterfaceWin32.cc
(winsock2GetRealNetworkInterfaces): Use tchar.h macros and
_Jv_Win32NewString.
2003-12-02 Thomas Fitzsimmons <fitzsim@redhat.com>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c

748
libjava/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -97,6 +97,26 @@ AC_ARG_ENABLE(libgcj-multifile,
esac],[enable_libgcj_multifile=no])
AM_CONDITIONAL(ONESTEP, test "$enable_libgcj_multifile" = yes)
# What is the native OS API for MinGW?
AC_ARG_WITH(win32-nlsapi,
changequote(<<,>>)dnl
<< --with-win32-nlsapi=ansi, unicows or unicode
native MinGW libgcj Win32 OS API [ansi]>>,
changequote([,])
[case "${withval}" in
ansi) with_win32_nlsapi=ansi ;;
unicows) with_win32_nlsapi=unicows ;;
unicode) with_win32_nlsapi=unicode ;;
*) AC_MSG_ERROR(Bad value ${withval} for --with-win32-nlsapi.) ;;
esac],[with_win32_nlsapi=ansi])
case "${with_win32_nlsapi}" in
unicows | unicode)
AC_DEFINE(MINGW_LIBGCJ_UNICODE, 1,
[Define if MinGW libgcj uses the Windows UNICODE OS API.])
;;
esac
dnl configure.host sets slow_pthread_self if the synchronization code should
dnl try to avoid pthread_self calls by caching thread IDs in a hashtable.
if test "${slow_pthread_self}" = "yes"; then
@ -313,6 +333,9 @@ AC_LINK_FILES(gnu/java/nio/natSelectorImpl${PLATFORM}.cc, gnu/java/nio/natSelect
case "${host}" in
*mingw*)
SYSTEMSPEC="-lgdi32 -lwsock32 -lws2_32"
if test "${with_win32_nlsapi}" = "unicows"; then
SYSTEMSPEC="-lunicows $SYSTEMSPEC"
fi
;;
*)
SYSTEMSPEC=

View File

@ -272,6 +272,9 @@
/* Define if we should ignore arguments to main(). */
#undef DISABLE_MAIN_ARGS
/* Define if MinGW libgcj uses the Windows UNICODE OS API. */
#undef MINGW_LIBGCJ_UNICODE
/* Define if if the synchronization code should try to avoid pthread_self calls by caching thread IDs in a hashtable. */
#undef SLOW_PTHREAD_SELF

View File

@ -11,6 +11,16 @@ details. */
#ifndef __JV_WIN32_H__
#define __JV_WIN32_H__
// Enable UNICODE Support.?
#ifdef MINGW_LIBGCJ_UNICODE
#define UNICODE
#define _UNICODE
#endif // MINGW_LIBGCJ_UNICODE
#include <tchar.h>
// Includes
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
@ -23,6 +33,43 @@ details. */
#include <io.h>
/* Begin UNICODE Support Classes and Functions */
/* Helper class which creates a temporary, null-terminated,
wide-character C string. */
class _Jv_Win32TempString
{
public:
_Jv_Win32TempString(jstring jstr);
~_Jv_Win32TempString();
// Accessors
operator LPCTSTR() const
{
return buf_;
}
LPCTSTR buf() const
{
return buf_;
}
LPTSTR buf()
{
return buf_;
}
private:
TCHAR stackbuf_[500];
LPTSTR buf_;
};
// Mimics the JV_TEMP_STRING_UTF macro in jvm.h
#define JV_TEMP_STRING_WIN32(x,y) _Jv_Win32TempString x(y);
// Creates a jstring from a LPCTSTR
extern jstring _Jv_Win32NewString (LPCTSTR pcsz);
/* End UNICODE Helpers */
// Prefix and suffix for shared libraries.
#define _Jv_platform_solib_prefix ""
#define _Jv_platform_solib_suffix ".dll"

View File

@ -87,7 +87,7 @@ java::io::FileDescriptor::open (jstring path, jint jflags) {
DWORD access = 0;
DWORD create = OPEN_EXISTING;
JV_TEMP_UTF_STRING(cpath, path)
JV_TEMP_STRING_WIN32(cpath, path)
JvAssert((jflags & READ) || (jflags & WRITE));
@ -115,7 +115,8 @@ java::io::FileDescriptor::open (jstring path, jint jflags) {
create = CREATE_ALWAYS;
}
handle = CreateFile(cpath, access, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, create, 0, NULL);
handle = CreateFile(cpath, access, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, create, 0, NULL);
if (handle == INVALID_HANDLE_VALUE)
{
@ -174,13 +175,14 @@ java::io::FileDescriptor::write(jbyteArray b, jint offset, jint len)
jbyte *buf = elements (b) + offset;
DWORD bytesWritten;
if (WriteFile ((HANDLE)fd, buf, len, &bytesWritten, NULL))
{
if (java::lang::Thread::interrupted())
{
InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted"));
iioe->bytesTransferred = bytesWritten;
throw iioe;
throw iioe;
}
}
else

View File

@ -40,7 +40,7 @@ details. */
jboolean
java::io::File::_access (jint query)
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;
@ -54,13 +54,14 @@ java::io::File::_access (jint query)
if ((query == EXISTS) || (query == READ))
return (attributes == 0xffffffff) ? false : true;
else
return ((attributes != 0xffffffff) && ((attributes & FILE_ATTRIBUTE_READONLY) == 0)) ? true : false;
return ((attributes != 0xffffffff) &&
((attributes & FILE_ATTRIBUTE_READONLY) == 0)) ? true : false;
}
jboolean
java::io::File::_stat (jint query)
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;
@ -79,7 +80,7 @@ java::io::File::_stat (jint query)
jlong
java::io::File::attr (jint query)
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;
@ -108,21 +109,19 @@ java::io::File::attr (jint query)
jstring
java::io::File::getCanonicalPath (void)
{
JV_TEMP_UTF_STRING (cpath, path);
JV_TEMP_STRING_WIN32 (cpath, path);
// If the filename is blank, use the current directory.
const char* thepath = cpath.buf();
if (*thepath == '\0')
thepath = ".";
LPCTSTR thepath = cpath.buf();
if (*thepath == 0)
thepath = _T(".");
LPTSTR unused;
char buf2[MAX_PATH];
TCHAR buf2[MAX_PATH];
if(!GetFullPathName(thepath, MAX_PATH, buf2, &unused))
throw new IOException (JvNewStringLatin1 ("GetFullPathName failed"));
// FIXME: what encoding to assume for file names? This affects many
// calls.
return JvNewStringUTF(buf2);
return _Jv_Win32NewString (buf2);
}
jboolean
@ -161,12 +160,17 @@ java::io::File::performList (java::io::FilenameFilter *filter,
jstring canon = getCanonicalPath();
if (! canon)
return NULL;
char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (canon) + 5);
jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf);
if (buf[total-1] == '\\')
strcpy (&buf[total], "*.*");
int len = canon->length();
TCHAR buf[len + 5];
JV_TEMP_STRING_WIN32(canonstr, canon);
_tcscpy(buf, canonstr);
if (buf[len - 1] == _T('\\'))
_tcscpy (&buf[len], _T("*.*"));
else
strcpy (&buf[total], "\\*.*");
_tcscpy (&buf[len], _T("\\*.*"));
WIN32_FIND_DATA data;
HANDLE handle = FindFirstFile (buf, &data);
@ -177,21 +181,22 @@ java::io::File::performList (java::io::FilenameFilter *filter,
do
{
if (strcmp (data.cFileName, ".") && strcmp (data.cFileName, ".."))
if (_tcscmp (data.cFileName, _T(".")) &&
_tcscmp (data.cFileName, _T("..")))
{
jstring name = JvNewStringUTF (data.cFileName);
jstring name = _Jv_Win32NewString (data.cFileName);
if (filter && !filter->accept(this, name))
continue;
continue;
if (clazz == &java::io::File::class$)
{
{
java::io::File *file = new java::io::File (this, name);
if (fileFilter && !fileFilter->accept(file))
continue;
vec->addElement (file);
}
else
vec->addElement (name);
continue;
vec->addElement (file);
}
else
vec->addElement (name);
}
}
while (FindNextFile (handle, &data));
@ -209,22 +214,22 @@ java::io::File::performList (java::io::FilenameFilter *filter,
jboolean
java::io::File::performMkdir (void)
{
JV_TEMP_UTF_STRING (cpath, path);
JV_TEMP_STRING_WIN32 (cpath, path);
return (CreateDirectory(cpath, NULL)) ? true : false;
}
jboolean
java::io::File::performRenameTo (File *dest)
{
JV_TEMP_UTF_STRING (pathFrom, path);
JV_TEMP_UTF_STRING (pathTo, dest->path);
JV_TEMP_STRING_WIN32 (pathFrom, path);
JV_TEMP_STRING_WIN32 (pathTo, dest->path);
return (MoveFile(pathFrom, pathTo)) ? true : false;
}
jboolean
java::io::File::performDelete ()
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;
@ -240,7 +245,7 @@ java::io::File::performDelete ()
jboolean java::io::File::performCreate (void)
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;
@ -262,7 +267,7 @@ jboolean java::io::File::performCreate (void)
jboolean java::io::File::performSetReadOnly ()
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;
@ -280,7 +285,7 @@ jboolean java::io::File::performSetReadOnly ()
jboolean java::io::File::performSetLastModified (jlong time)
{
JV_TEMP_UTF_STRING (canon, getCanonicalPath());
JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
if (!canon)
return false;

View File

@ -173,7 +173,7 @@ ChildProcessPipe::ChildProcessPipe(EType eType):
{
DWORD dwErrorCode = GetLastError ();
throw new java::io::IOException (
_Jv_WinStrError ("Error creating pipe", dwErrorCode));
_Jv_WinStrError (_T("Error creating pipe"), dwErrorCode));
}
// If this is the read end of the child, we need
@ -220,48 +220,53 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
int cmdLineLen = 0;
for (int i = 0; i < progarray->length; ++i)
cmdLineLen += (_Jv_GetStringUTFLength (elts[i]) + 1);
cmdLineLen += (elts[i]->length() + 1);
char *cmdLine = (char *) _Jv_Malloc (cmdLineLen + 1);
char *cmdLineCurPos = cmdLine;
LPTSTR cmdLine = (LPTSTR) _Jv_Malloc ((cmdLineLen + 1) * sizeof(TCHAR));
LPTSTR cmdLineCurPos = cmdLine;
for (int i = 0; i < progarray->length; ++i)
{
if (i > 0)
*cmdLineCurPos++ = ' ';
jsize s = _Jv_GetStringUTFLength (elts[i]);
_Jv_GetStringUTFRegion (elts[i], 0, elts[i]->length(), cmdLineCurPos);
cmdLineCurPos += s;
*cmdLineCurPos++ = _T(' ');
jint len = elts[i]->length();
JV_TEMP_STRING_WIN32(thiselt, elts[i]);
_tcscpy(cmdLineCurPos, thiselt);
cmdLineCurPos += len;
}
*cmdLineCurPos = '\0';
*cmdLineCurPos = _T('\0');
// Get the environment, if any.
char *env = NULL;
LPTSTR env = NULL;
if (envp)
{
elts = elements (envp);
int envLen = 0;
for (int i = 0; i < envp->length; ++i)
envLen += (_Jv_GetStringUTFLength (elts[i]) + 1);
envLen += (elts[i]->length() + 1);
env = (char *) _Jv_Malloc (envLen + 1);
env = (LPTSTR) _Jv_Malloc ((envLen + 1) * sizeof(TCHAR));
int j = 0;
for (int i = 0; i < envp->length; ++i)
{
jsize s = _Jv_GetStringUTFLength (elts[i]);
_Jv_GetStringUTFRegion (elts[i], 0, elts[i]->length(), (env + j));
j += s;
*(env + j) = '\0';
jint len = elts[i]->length();
JV_TEMP_STRING_WIN32(thiselt, elts[i]);
_tcscpy(env + j, thiselt);
j += len;
// Skip past the null terminator that _tcscpy just inserted.
j++;
}
*(env + j) = '\0';
*(env + j) = _T('\0');
}
// Get the working directory path, if specified.
JV_TEMP_UTF_STRING (wdir, dir ? dir->getPath () : 0);
JV_TEMP_STRING_WIN32 (wdir, dir ? dir->getPath () : 0);
errorStream = NULL;
inputStream = NULL;
@ -304,12 +309,13 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
// starting a console application; it suppresses the
// creation of a console window. This flag is ignored on
// Win9X.
if (CreateProcess (NULL,
cmdLine,
NULL,
NULL,
1,
CREATE_NO_WINDOW,
CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT,
env,
wdir,
&si,
@ -317,7 +323,7 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
{
DWORD dwErrorCode = GetLastError ();
throw new IOException (
_Jv_WinStrError ("Error creating child process", dwErrorCode));
_Jv_WinStrError (_T("Error creating child process"), dwErrorCode));
}
procHandle = (jint ) pi.hProcess;

View File

@ -70,18 +70,18 @@ winsock2GetRealNetworkInterfaces (jstring* pjstrName,
// have access to the real name under Winsock 2, we use
// "lo" for the loopback interface and ethX for the
// real ones.
char szName[30];
TCHAR szName[30];
u_long lFlags = arInterfaceInfo[i].iiFlags;
if (lFlags & IFF_LOOPBACK)
strcpy (szName, "lo");
_tcscpy (szName, _T("lo"));
else
{
strcpy (szName, "eth");
wsprintf(szName+3, "%d", nCurETHInterface++);
_tcscpy (szName, _T("eth"));
wsprintf(szName+3, _T("%d"), nCurETHInterface++);
}
jstring if_name = JvNewStringLatin1 (szName);
jstring if_name = _Jv_Win32NewString (szName);
java::net::Inet4Address* address =
new java::net::Inet4Address (baddr, JvNewStringLatin1 (""));
pjstrName[i] = if_name;

View File

@ -42,6 +42,106 @@ const char *_Jv_ThisExecutable (void)
// Helper classes and methods implementation
#ifdef MINGW_LIBGCJ_UNICODE
// We're using the OS W (UNICODE) API, which means that we're speaking
// the same language....
jstring
_Jv_Win32NewString (LPCTSTR pcsz)
{
return JvNewString ((jchar*) pcsz, _tcslen (pcsz));
}
#else
// We're using the OS A functions, which means we need to translate between
// UNICODE and the native character set.
// First, let's set up some helper translation functions....
// Converts the native string to any specified jstring, returning the
// length of the jstring. If the specified jstring is null, we simply
// compute and return the length.
static int nativeToUnicode(LPCSTR pcsz, jstring jstr = 0)
{
jchar* buf = 0;
int len = 0;
if (jstr)
{
len = jstr->length();
buf = JvGetStringChars(jstr);
}
return ::MultiByteToWideChar(GetACP(), 0, pcsz,
strlen(pcsz), (LPWSTR) buf, len);
}
// Does the inverse of nativeToUnicode, with the same calling semantics.
static int unicodeToNative(jstring jstr, LPSTR buf, int buflen)
{
return ::WideCharToMultiByte(GetACP(), 0, (LPWSTR) JvGetStringChars(jstr),
jstr->length(), buf, buflen, NULL, NULL);
}
// Convenience function when the caller only wants to compute the length
// of the native string.
static int unicodeToNative(jstring jstr)
{
return unicodeToNative(jstr, 0, 0);
}
jstring
_Jv_Win32NewString (LPCTSTR pcsz)
{
// Compute the length, allocate the jstring, then perform the conversion.
int len = nativeToUnicode(pcsz);
jstring jstr = JvAllocString(len);
nativeToUnicode(pcsz, jstr);
return jstr;
}
#endif // MINGW_LIBGCJ_UNICODE
// class _Jv_Win32TempString
_Jv_Win32TempString::_Jv_Win32TempString(jstring jstr):
buf_(0)
{
if (jstr == 0)
return;
// We need space for the string length plus a null terminator.
// Determine whether to use our stack-allocated buffer or a heap-
// allocated one.
#ifdef MINGW_LIBGCJ_UNICODE
// A UNICODE character is a UNICODE character is a UNICODE character....
int len = jstr->length();
#else
// Compute the length of the native character string.
int len = unicodeToNative(jstr);
#endif // MINGW_LIBGCJ_UNICODE
int bytesNeeded = (len + 1) * sizeof(TCHAR);
if (bytesNeeded <= (int) sizeof(stackbuf_))
buf_ = stackbuf_;
else
buf_ = (LPTSTR) _Jv_Malloc(bytesNeeded);
#ifdef MINGW_LIBGCJ_UNICODE
// Copy the UNICODE characters to our buffer.
_tcsncpy(buf_, (LPCTSTR) JvGetStringChars (jstr), len);
#else
// Convert the UNICODE string to a native one.
unicodeToNative(jstr, buf_, len);
#endif // MINGW_LIBGCJ_UNICODE
buf_[len] = 0;
}
_Jv_Win32TempString::~_Jv_Win32TempString()
{
if (buf_ && buf_ != stackbuf_)
_Jv_Free (buf_);
}
// class WSAEventWrapper
WSAEventWrapper::WSAEventWrapper (int fd, DWORD dwSelFlags):
m_hEvent(0),
@ -92,16 +192,17 @@ _Jv_WinStrError (LPCTSTR lpszPrologue, int nErrorCode)
if (lpszPrologue)
{
LPTSTR lpszTemp =
(LPTSTR) _Jv_Malloc (strlen (lpszPrologue) +
strlen (lpMsgBuf) + 3);
strcpy (lpszTemp, lpszPrologue);
strcat (lpszTemp, ": ");
strcat (lpszTemp, lpMsgBuf);
ret = JvNewStringLatin1 (lpszTemp);
(LPTSTR) _Jv_Malloc ((_tcslen (lpszPrologue) +
_tcslen (lpMsgBuf) + 3) * sizeof(TCHAR) );
_tcscpy (lpszTemp, lpszPrologue);
_tcscat (lpszTemp, _T(": "));
_tcscat (lpszTemp, lpMsgBuf);
ret = _Jv_Win32NewString (lpszTemp);
_Jv_Free (lpszTemp);
}
else
{
ret = JvNewStringLatin1 (lpMsgBuf);
ret = _Jv_Win32NewString (lpMsgBuf);
}
LocalFree(lpMsgBuf);
@ -143,14 +244,17 @@ _Jv_platform_initialize (void)
// Initialise winsock for networking
WSADATA data;
if (WSAStartup (MAKEWORD (1, 1), &data))
MessageBox (NULL, "Error initialising winsock library.", "Error",
MessageBox (NULL, _T("Error initialising winsock library."), _T("Error"),
MB_OK | MB_ICONEXCLAMATION);
// Install exception handler
SetUnhandledExceptionFilter (win32_exception_handler);
// Initialize our executable name
GetModuleFileName(NULL, exec_name, sizeof(exec_name));
// Initialize our executable name.
// FIXME: We unconditionally use the ANSI function because
// _Jv_ThisExecutable returns a const char*. We should really
// change _Jv_ThisExecutable to return a jstring.
GetModuleFileNameA(NULL, exec_name, sizeof(exec_name));
}
// gettimeofday implementation.
@ -177,19 +281,19 @@ __mingwthr_key_dtor (DWORD, void (*) (void *))
return 0;
}
static bool dirExists (const char* dir)
static bool dirExists (LPCTSTR dir)
{
DWORD dwAttrs = ::GetFileAttributes (dir);
return dwAttrs != 0xFFFFFFFF &&
(dwAttrs & FILE_ATTRIBUTE_DIRECTORY) != 0;
}
static void getUserHome(char* userHome, const char* userId)
static void getUserHome(LPTSTR userHome, LPCTSTR userId)
{
char* uh = ::getenv ("USERPROFILE");
LPTSTR uh = _tgetenv (_T("USERPROFILE"));
if (uh)
{
strcpy(userHome, uh);
_tcscpy(userHome, uh);
}
else
{
@ -202,15 +306,15 @@ static void getUserHome(char* userHome, const char* userId)
// To do this correctly, we'd have to factor in the
// Windows version, but if we did that, then this attempt
// wouldn't be half-hearted.
char userHomePath[MAX_PATH], winHome[MAX_PATH];
TCHAR userHomePath[MAX_PATH], winHome[MAX_PATH];
::GetWindowsDirectory(winHome, MAX_PATH);
// assume this call always succeeds
sprintf(userHomePath, "%s\\Profiles\\%s", winHome, userId);
_stprintf(userHomePath, _T("%s\\Profiles\\%s"), winHome, userId);
if (dirExists (userHomePath))
strcpy(userHome, userHomePath);
_tcscpy(userHome, userHomePath);
else
strcpy(userHome, winHome);
_tcscpy(userHome, winHome);
}
}
@ -220,15 +324,15 @@ _Jv_platform_initProperties (java::util::Properties* newprops)
{
// A convenience define.
#define SET(Prop,Val) \
newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val))
newprops->put(JvNewStringLatin1 (Prop), _Jv_Win32NewString (Val))
SET ("file.separator", "\\");
SET ("path.separator", ";");
SET ("line.separator", "\r\n");
SET ("file.separator", _T("\\"));
SET ("path.separator", _T(";"));
SET ("line.separator", _T("\r\n"));
// Use GetCurrentDirectory to set 'user.dir'.
DWORD buflen = MAX_PATH;
char *buffer = (char *) _Jv_MallocUnchecked (buflen);
TCHAR buffer[buflen];
if (buffer != NULL)
{
if (GetCurrentDirectory (buflen, buffer))
@ -236,18 +340,16 @@ _Jv_platform_initProperties (java::util::Properties* newprops)
if (GetTempPath (buflen, buffer))
SET ("java.io.tmpdir", buffer);
_Jv_Free (buffer);
}
// Use GetUserName to set 'user.name'.
buflen = 257; // UNLEN + 1
char userName[buflen];
TCHAR userName[buflen];
if (GetUserName (userName, &buflen))
SET ("user.name", userName);
// Set user.home
char userHome[MAX_PATH];
TCHAR userHome[MAX_PATH];
getUserHome(userHome, userName);
SET ("user.home", userHome);
@ -257,41 +359,39 @@ _Jv_platform_initProperties (java::util::Properties* newprops)
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx (&osvi))
{
char *buffer = (char *) _Jv_MallocUnchecked (30);
if (buffer != NULL)
{
sprintf (buffer, "%d.%d", (int) osvi.dwMajorVersion,
_stprintf (buffer, _T("%d.%d"), (int) osvi.dwMajorVersion,
(int) osvi.dwMinorVersion);
SET ("os.version", buffer);
_Jv_Free (buffer);
}
switch (osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
SET ("os.name", "Windows 95");
SET ("os.name", _T("Windows 95"));
else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
SET ("os.name", "Windows 98");
SET ("os.name", _T("Windows 98"));
else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
SET ("os.name", "Windows Me");
SET ("os.name", _T("Windows Me"));
else
SET ("os.name", "Windows ??");
SET ("os.name", _T("Windows ??"));
break;
case VER_PLATFORM_WIN32_NT:
if (osvi.dwMajorVersion <= 4 )
SET ("os.name", "Windows NT");
SET ("os.name", _T("Windows NT"));
else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
SET ("os.name", "Windows 2000");
SET ("os.name", _T("Windows 2000"));
else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
SET ("os.name", "Windows XP");
SET ("os.name", _T("Windows XP"));
else
SET ("os.name", "Windows NT ??");
SET ("os.name", _T("Windows NT ??"));
break;
default:
SET ("os.name", "Windows UNKNOWN");
SET ("os.name", _T("Windows UNKNOWN"));
break;
}
}
@ -302,23 +402,23 @@ _Jv_platform_initProperties (java::util::Properties* newprops)
switch (si.wProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_INTEL:
SET ("os.arch", "x86");
SET ("os.arch", _T("x86"));
break;
case PROCESSOR_ARCHITECTURE_MIPS:
SET ("os.arch", "mips");
SET ("os.arch", _T("mips"));
break;
case PROCESSOR_ARCHITECTURE_ALPHA:
SET ("os.arch", "alpha");
SET ("os.arch", _T("alpha"));
break;
case PROCESSOR_ARCHITECTURE_PPC:
SET ("os.arch", "ppc");
case PROCESSOR_ARCHITECTURE_PPC:
SET ("os.arch", _T("ppc"));
break;
case PROCESSOR_ARCHITECTURE_IA64:
SET ("os.arch", "ia64");
SET ("os.arch", _T("ia64"));
break;
case PROCESSOR_ARCHITECTURE_UNKNOWN:
default:
SET ("os.arch", "unknown");
SET ("os.arch", _T("unknown"));
break;
}
}