| /******************************************************************************* |
| * Copyright (c) 2000, 2008 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| #include "swt.h" |
| #include "os_structs.h" |
| #include "os_stats.h" |
| |
| #define OS_NATIVE(func) Java_org_eclipse_swt_internal_win32_OS_##func |
| |
| __declspec(dllexport) HRESULT DllGetVersion(DLLVERSIONINFO *dvi); |
| HRESULT DllGetVersion(DLLVERSIONINFO *dvi) |
| { |
| dvi->dwMajorVersion = SWT_VERSION / 1000; |
| dvi->dwMinorVersion = SWT_VERSION % 1000; |
| dvi->dwBuildNumber = 0; |
| dvi->dwPlatformID = DLLVER_PLATFORM_WINDOWS; |
| return 1; |
| } |
| |
| HINSTANCE g_hInstance = NULL; |
| BOOL WINAPI DllMain(HANDLE hInstDLL, DWORD dwReason, LPVOID lpvReserved) |
| { |
| if (dwReason == DLL_PROCESS_ATTACH) { |
| if (g_hInstance == NULL) g_hInstance = hInstDLL; |
| } |
| return TRUE; |
| } |
| |
| #ifndef NO_GetLibraryHandle |
| JNIEXPORT jintLong JNICALL OS_NATIVE(GetLibraryHandle) |
| (JNIEnv *env, jclass that) |
| { |
| jintLong rc; |
| OS_NATIVE_ENTER(env, that, GetLibraryHandle_FUNC) |
| rc = (jintLong)g_hInstance; |
| OS_NATIVE_EXIT(env, that, GetLibraryHandle_FUNC) |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_IsPPC |
| JNIEXPORT jboolean JNICALL OS_NATIVE(IsPPC) |
| (JNIEnv *env, jclass that) |
| { |
| jboolean rc; |
| OS_NATIVE_ENTER(env, that, IsPPC_FUNC) |
| #ifdef WIN32_PLATFORM_PSPC |
| rc = (jboolean)TRUE; |
| #else |
| rc = (jboolean)FALSE; |
| #endif |
| OS_NATIVE_EXIT(env, that, IsPPC_FUNC) |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_IsSP |
| JNIEXPORT jboolean JNICALL OS_NATIVE(IsSP) |
| (JNIEnv *env, jclass that) |
| { |
| jboolean rc; |
| OS_NATIVE_ENTER(env, that, IsSP_FUNC) |
| #ifdef WIN32_PLATFORM_WFSP |
| rc = (jboolean)TRUE; |
| #else |
| rc = (jboolean)FALSE; |
| #endif |
| OS_NATIVE_EXIT(env, that, IsSP_FUNC) |
| return rc; |
| } |
| #endif |
| |
| #if (!defined(NO_SendMessageW__II_3I_3I) && !defined(JNI64)) || (!defined(SendMessageW__JI_3I_3I) && defined(JNI64)) |
| #ifdef JNI64 |
| JNIEXPORT jintLong JNICALL OS_NATIVE(SendMessageW__JI_3I_3I) |
| #else |
| JNIEXPORT jintLong JNICALL OS_NATIVE(SendMessageW__II_3I_3I) |
| #endif |
| (JNIEnv *env, jclass that, jintLong arg0, jint arg1, jintArray arg2, jintArray arg3) |
| { |
| jint *lparg2=NULL; |
| jint *lparg3=NULL; |
| jintLong rc = 0; |
| #ifdef JNI64 |
| OS_NATIVE_ENTER(env, that, SendMessageW__JI_3I_3I_FUNC) |
| #else |
| OS_NATIVE_ENTER(env, that, SendMessageW__II_3I_3I_FUNC) |
| #endif |
| if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail; |
| if (arg3) if ((lparg3 = (*env)->GetIntArrayElements(env, arg3, NULL)) == NULL) goto fail; |
| #ifdef _WIN32_WCE |
| /* |
| * Bug on WinCE. SendMessage can fail (return 0) when being passed references |
| * to parameters allocated from the heap. The workaround is to allocate |
| * the parameters on the stack and to copy them back to the java array. |
| * Observed on Pocket PC WinCE 3.0 with EM_GETSEL and CB_GETEDITSEL messages. |
| */ |
| switch (arg1) { |
| case EM_GETSEL: |
| case CB_GETEDITSEL: { |
| jint wParam = 0, lParam = 0; |
| jintLong *lpwParam = NULL, *lplParam = NULL; |
| if (lparg2 != NULL) lpwParam = &wParam; |
| if (lparg3 != NULL) lplParam = &lParam; |
| rc = (jintLong)SendMessageW((HWND)arg0, arg1, (WPARAM)lpwParam, (LPARAM)lplParam); |
| if (lparg2 != NULL) lparg2[0] = wParam; |
| if (lparg3 != NULL) lparg3[0] = lParam; |
| break; |
| } |
| default: |
| rc = (jintLong)SendMessageW((HWND)arg0, arg1, (WPARAM)lparg2, (LPARAM)lparg3); |
| } |
| #else |
| rc = (jintLong)SendMessageW((HWND)arg0, arg1, (WPARAM)lparg2, (LPARAM)lparg3); |
| #endif |
| fail: |
| if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0); |
| if (arg3 && lparg3) (*env)->ReleaseIntArrayElements(env, arg3, lparg3, 0); |
| #ifdef JNI64 |
| OS_NATIVE_EXIT(env, that, SendMessageW__JI_3I_3I_FUNC) |
| #else |
| OS_NATIVE_EXIT(env, that, SendMessageW__II_3I_3I_FUNC) |
| #endif |
| return rc; |
| } |
| #endif |