summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVeronika Irvine <veronika>2002-05-06 20:26:13 +0000
committerVeronika Irvine <veronika>2002-05-06 20:26:13 +0000
commitfb65c554be6a3a1e1959739ca6c1354d5cc361a3 (patch)
treec3b02c871fd772f913fbb88aabcd79e6aa388ae8
parent5be038b998cd27bf503c68ee3f43ba54105e38ff (diff)
downloadeclipse.platform.swt-fb65c554be6a3a1e1959739ca6c1354d5cc361a3.tar.gz
eclipse.platform.swt-fb65c554be6a3a1e1959739ca6c1354d5cc361a3.tar.xz
eclipse.platform.swt-fb65c554be6a3a1e1959739ca6c1354d5cc361a3.zip
Removing String.getBytes and new String(byte[])
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java77
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/swt.c49
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java2
3 files changed, 108 insertions, 20 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java
index 3dba0b73db..362b8b54cd 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/RTFTransfer.java
@@ -4,7 +4,10 @@ package org.eclipse.swt.dnd;
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved
*/
-
+
+import org.eclipse.swt.internal.win32.OS;
+import org.eclipse.swt.internal.ole.win32.*;
+
/**
* The <code>RTFTransfer</code> class is used to transfer text with the RTF format
* in a drag and drop operation.
@@ -14,6 +17,7 @@ public class RTFTransfer extends ByteArrayTransfer {
private static final String CF_RTF_NAME = "Rich Text Format";
private static final int CF_RTF = registerType(CF_RTF_NAME);
private static RTFTransfer _instance = new RTFTransfer();
+ private static int CodePage = OS.GetACP ();
private RTFTransfer() {}
/**
@@ -44,13 +48,35 @@ public static RTFTransfer getInstance () {
* with the platform specific format of the data
*/
public void javaToNative (Object object, TransferData transferData){
- if (object == null || !(object instanceof String)) return;
-
+ if (object == null || !(object instanceof String)) {
+ transferData.result = COM.E_FAIL;
+ return;
+ }
// CF_RTF is stored as a null terminated byte array
- // create a byte array from object
- String text = (String) object+'\0';
- // pass byte array on to super to convert to native
- super.javaToNative(text.getBytes(), transferData);
+ if (isSupportedType(transferData)) {
+ String string = (String)object;
+ int count = string.length ();
+ char [] buffer = new char [count + 1];
+ string.getChars (0, count, buffer, 0);
+ int cchMultiByte = OS.WideCharToMultiByte (CodePage, 0, buffer, -1, null, 0, null, null);
+ if (cchMultiByte == 0) {
+ transferData.stgmedium = new STGMEDIUM();
+ transferData.result = COM.DV_E_STGMEDIUM;
+ return;
+ }
+ int lpMultiByteStr = COM.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, cchMultiByte);
+ OS.WideCharToMultiByte (CodePage, 0, buffer, -1, lpMultiByteStr, cchMultiByte, null, null);
+ transferData.stgmedium = new STGMEDIUM();
+ transferData.stgmedium.tymed = COM.TYMED_HGLOBAL;
+ transferData.stgmedium.unionField = lpMultiByteStr;
+ transferData.stgmedium.pUnkForRelease = 0;
+ transferData.result = COM.S_OK;
+ return;
+ }
+
+ // did not match the TYMED
+ transferData.stgmedium = new STGMEDIUM();
+ transferData.result = COM.DV_E_TYMED;
}
/**
* Converts a platform specific representation of a string to a Java String.
@@ -60,15 +86,34 @@ public void javaToNative (Object object, TransferData transferData){
* otherwise null
*/
public Object nativeToJava(TransferData transferData){
- // get byte array from super
- byte[] buffer = (byte[])super.nativeToJava(transferData);
- if (buffer == null) return null;
- // convert byte array to a string
- String string = new String(buffer);
- // remove null terminator
- int index = string.indexOf("\0");
- string = string.substring(0, index);
- return string;
+ if (!isSupportedType(transferData) || transferData.pIDataObject == 0) {
+ transferData.result = COM.E_FAIL;
+ return null;
+ }
+
+ IDataObject data = new IDataObject(transferData.pIDataObject);
+ data.AddRef();
+ STGMEDIUM stgmedium = new STGMEDIUM();
+ FORMATETC formatetc = transferData.formatetc;
+ stgmedium.tymed = COM.TYMED_HGLOBAL;
+ transferData.result = data.GetData(formatetc, stgmedium);
+ data.Release();
+ if (transferData.result != COM.S_OK) return null;
+
+ int lpMultiByteStr = COM.GlobalLock(stgmedium.unionField);
+ if (lpMultiByteStr != 0) {
+ try {
+ int cchWideChar = OS.MultiByteToWideChar (CodePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0);
+ if (cchWideChar != 0) {
+ char[] lpWideCharStr = new char [cchWideChar];
+ OS.MultiByteToWideChar (CodePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, cchWideChar);
+ return new String(lpWideCharStr);
+ }
+ } finally {
+ COM.GlobalUnlock(lpMultiByteStr);
+ }
+ }
+ return null;
}
protected int[] getTypeIds(){
return new int[] {CF_RTF};
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/swt.c b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/swt.c
index 6ea78c0c85..9ba9e8e260 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/swt.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/swt.c
@@ -4601,14 +4601,14 @@ JNIEXPORT jboolean JNICALL Java_org_eclipse_swt_internal_win32_OS_MoveToEx
}
#endif // _WIN32_WCE
-JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_MultiByteToWideChar
+JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_MultiByteToWideChar__II_3BI_3CI
(JNIEnv *env, jclass that, jint arg0, jint arg1, jbyteArray arg2, jint arg3, jcharArray arg4, jint arg5)
{
jbyte *lparg2=NULL;
jchar *lparg4=NULL;
jint rc;
- DEBUG_CALL("MultiByteToWideChar\n")
+ DEBUG_CALL("MultiByteToWideChar__II_3BI_3CI\n")
if (arg2) lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL);
if (arg4) lparg4 = (*env)->GetCharArrayElements(env, arg4, NULL);
@@ -4621,6 +4621,23 @@ JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_MultiByteToWideCha
return rc;
}
+JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_MultiByteToWideChar__IIII_3CI
+ (JNIEnv *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3, jcharArray arg4, jint arg5)
+{
+ jchar *lparg4=NULL;
+ jint rc;
+
+ DEBUG_CALL("MultiByteToWideChar__IIII_3CI\n")
+
+ if (arg4) lparg4 = (*env)->GetCharArrayElements(env, arg4, NULL);
+
+ rc = (jint)MultiByteToWideChar(arg0, arg1, (LPCSTR)arg2, arg3, (LPWSTR)lparg4, arg5);
+
+ if (arg4) (*env)->ReleaseCharArrayElements(env, arg4, lparg4, 0);
+
+ return rc;
+}
+
#ifndef _WIN32_WCE
JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_OleInitialize
(JNIEnv *env, jclass that, jint arg0)
@@ -7043,7 +7060,7 @@ JNIEXPORT jboolean JNICALL Java_org_eclipse_swt_internal_win32_OS_WaitMessage
}
#endif // _WIN32_WCE
-JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_WideCharToMultiByte
+JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_WideCharToMultiByte__II_3CI_3BI_3B_3Z
(JNIEnv *env, jclass that, jint arg0, jint arg1, jcharArray arg2, jint arg3, jbyteArray arg4, jint arg5, jbyteArray arg6, jbooleanArray arg7)
{
jchar *lparg2=NULL;
@@ -7052,7 +7069,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_WideCharToMultiByt
jboolean *lparg7=NULL;
jint rc;
- DEBUG_CALL("WideCharToMultiByte\n")
+ DEBUG_CALL("WideCharToMultiByte__II_3CI_3BI_3B_3Z\n")
if (arg2) lparg2 = (*env)->GetCharArrayElements(env, arg2, NULL);
if (arg4) lparg4 = (*env)->GetByteArrayElements(env, arg4, NULL);
@@ -7069,6 +7086,30 @@ JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_WideCharToMultiByt
return rc;
}
+JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_WideCharToMultiByte__II_3CIII_3B_3Z
+ (JNIEnv *env, jclass that, jint arg0, jint arg1, jcharArray arg2, jint arg3, jint arg4, jint arg5, jbyteArray arg6, jbooleanArray arg7)
+{
+ jchar *lparg2=NULL;
+ jbyte *lparg4=NULL;
+ jbyte *lparg6=NULL;
+ jboolean *lparg7=NULL;
+ jint rc;
+
+ DEBUG_CALL("WideCharToMultiByte__II_3CIII_3B_3Z\n")
+
+ if (arg2) lparg2 = (*env)->GetCharArrayElements(env, arg2, NULL);
+ if (arg6) lparg6 = (*env)->GetByteArrayElements(env, arg6, NULL);
+ if (arg7) lparg7 = (*env)->GetBooleanArrayElements(env, arg7, NULL);
+
+ rc = (jint)WideCharToMultiByte(arg0, arg1, (LPCWSTR)lparg2, arg3, (LPSTR)arg4, arg5, (LPCSTR)lparg6, (LPBOOL)lparg7);
+
+ if (arg2) (*env)->ReleaseCharArrayElements(env, arg2, lparg2, 0);
+ if (arg6) (*env)->ReleaseByteArrayElements(env, arg6, lparg6, 0);
+ if (arg7) (*env)->ReleaseBooleanArrayElements(env, arg7, lparg7, 0);
+
+ return rc;
+}
+
#ifndef _WIN32_WCE
JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_win32_OS_WindowFromDC
(JNIEnv *env, jclass that, jint arg0)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java
index 95f7e39aa6..1637da8ab2 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java
@@ -2168,6 +2168,7 @@ public static final native void MoveMemory(int DestinationPtr, float[] Source, i
public static final native void MoveMemory(int DestinationPtr, short[] Source, int Length);
public static final native boolean MoveToEx (int hdc,int x1, int x2, int lPoint);
public static final native int MultiByteToWideChar (int CodePage, int dwFlags, byte [] lpMultiByteStr, int cchMultiByte, char [] lpWideCharStr, int cchWideChar);
+public static final native int MultiByteToWideChar (int CodePage, int dwFlags, int lpMultiByteStr, int cchMultiByte, char [] lpWideCharStr, int cchWideChar);
public static final native int OleInitialize (int pvReserved);
public static final native void OleUninitialize ();
public static final native boolean OpenClipboard (int hWndNewOwner);
@@ -2323,6 +2324,7 @@ public static final native short VkKeyScanA (short ch);
public static final native int VtblCall (int ppVtbl, int fnNumber, int arg0);
public static final native boolean WaitMessage ();
public static final native int WideCharToMultiByte (int CodePage, int dwFlags, char [] lpWideCharStr, int cchWideChar, byte [] lpMultiByteStr, int cchMultiByte, byte [] lpDefaultChar, boolean [] lpUsedDefaultChar);
+public static final native int WideCharToMultiByte (int CodePage, int dwFlags, char [] lpWideCharStr, int cchWideChar, int lpMultiByteStr, int cchMultiByte, byte [] lpDefaultChar, boolean [] lpUsedDefaultChar);
public static final native int WindowFromDC (int lpPoint);
public static final native int WindowFromPoint (POINT lpPoint);
}