Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,10 @@ public String getTypeSignature2() {
if (name.equals("Ljava/lang/String;")) return "jstring";
if (name.equals("Ljava/lang/Class;")) return "jclass";
if (isArray()) {
return getComponentType().getTypeSignature2() + "Array";
if (getComponentType().isPrimitive()) {
return getComponentType().getTypeSignature2() + "Array";
}
return "jobjectArray";
}
return "jobject";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,14 @@ boolean generateGetParameter(JNIParameter param, boolean critical, int indent) {
output(iStr);
output(", NULL)");
}
} else if (componentType.isType("java.lang.String")) {
if (param.getFlag(FLAG_UNICODE)) {
throw new Error("not done");
}

output("swt_getArrayOfStringsUTF(env, arg");
output(iStr);
output(")");
} else {
throw new Error("not done");
}
Expand Down Expand Up @@ -381,6 +389,16 @@ void generateSetParameter(JNIParameter param, boolean critical) {
output("0");
}
output(");");
} else if (componentType.isType("java.lang.String")) {
if (param.getFlag(FLAG_UNICODE)) {
throw new Error("not done");
}

output("swt_releaseArrayOfStringsUTF(env, arg");
output(iStr);
output(", lparg");
output(iStr);
output(");");
} else {
throw new Error("not done");
}
Expand Down Expand Up @@ -452,6 +470,12 @@ boolean generateLocalVars(JNIParameter[] params, JNIType returnType) {
output(componentType.getTypeSignature2());
output(" *lparg" + i);
output("=NULL;");
} else if (componentType.isType("java.lang.String")) {
if (param.getFlag(FLAG_UNICODE)) {
output("jchar **lparg" + i + "=NULL");
} else {
output("char **lparg" + i+ "=NULL");
}
} else {
throw new Error("not done");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ public String getTypeSignature2() {
if (clazz == String.class) return "jstring";
if (clazz == Class.class) return "jclass";
if (clazz.isArray()) {
return getComponentType().getTypeSignature2() + "Array";
if (getComponentType().isPrimitive()) {
return getComponentType().getTypeSignature2() + "Array";
}
return "jobjectArray";
}
return "jobject";
}
Expand Down
2 changes: 1 addition & 1 deletion bundles/org.eclipse.swt.tools/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-SymbolicName: org.eclipse.swt.tools; singleton:=true
Bundle-Version: 3.110.800.qualifier
Bundle-Version: 3.110.900.qualifier
Bundle-ManifestVersion: 2
Export-Package: org.eclipse.swt.tools.internal; x-internal:=true
Bundle-ActivationPolicy: lazy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,10 @@ public static int registerType(String formatName) {
int index = 1;
while (index < TYPES.length) {
String type = TYPES[index];
if (type != null && formatName.equals(type)) {
if (type == null) {
break;
}
if (formatName.equals(type)) {
return index;
}
index++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*******************************************************************************/
package org.eclipse.swt.dnd;

import org.eclipse.swt.dnd.TransferData.*;
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.gtk.*;

Expand Down Expand Up @@ -136,6 +137,7 @@ public TransferData[] getSupportedTypes() {

@Override
public boolean isSupportedType(TransferData transferData){
if (GTK.GTK4) return isSupportedTypeGTK4(transferData);
if (transferData == null) return false;
int[] types = getTypeIds();
for (int i = 0; i < types.length; i++) {
Expand All @@ -144,6 +146,15 @@ public boolean isSupportedType(TransferData transferData){
return false;
}

private boolean isSupportedTypeGTK4(TransferData transferData) {
if (transferData == null) return false;
int[] types = getTypeIds();
for (int i = 0; i < types.length; i++) {
if (transferData.gtk4().type == types[i]) return true;
}
return false;
}

/**
* This implementation of <code>javaToNative</code> converts a java
* <code>byte[]</code> to a platform specific representation.
Expand All @@ -156,7 +167,11 @@ public boolean isSupportedType(TransferData transferData){
*/
@Override
protected void javaToNative (Object object, TransferData transferData) {
transferData.result = 0;
if (GTK.GTK4) {
javaToNativeGTK4(object, transferData);
return;
}
transferData.gtk3().result = 0;
if (!checkByteArray(object) || !isSupportedType(transferData)) {
DND.error(DND.ERROR_INVALID_DATA);
}
Expand All @@ -165,10 +180,59 @@ protected void javaToNative (Object object, TransferData transferData) {
long pValue = OS.g_malloc(buffer.length);
if (pValue == 0) return;
C.memmove(pValue, buffer, buffer.length);
transferData.length = buffer.length;
transferData.format = 8;
transferData.pValue = pValue;
transferData.result = 1;
transferData.gtk3().length = buffer.length;
transferData.gtk3().format = 8;
transferData.gtk3().pValue = pValue;
transferData.gtk3().result = 1;
}

private void javaToNativeGTK4(Object object, TransferData transferData) {
if (!checkByteArray(object) || !isSupportedType(transferData)) {
DND.error(DND.ERROR_INVALID_DATA);
}
byte[] buffer = (byte[]) object;
if (buffer.length == 0) {
return;
}
TransferDataGTK4 data = transferData.gtk4();
GdkContentSerializer serializer = data.serializer;

long pValue = OS.g_malloc(buffer.length);
if (pValue == 0) {
return;
}
C.memmove(pValue, buffer, buffer.length);

// Sync version - this won't work if the other end of the stream is in our process (such as a Clipboard.getContents call).
// long[] error = new long[1];
// boolean finish = OS.g_output_stream_write_all(serializer.output_stream(), pValue, buffer.length, null,
// serializer.cancellable(), error);
// if (!finish) {
// serializer.return_error(error[0]);
// } else {
// serializer.return_success();
// }
// Async version:
new AsyncFinishUtil().run(data.display, new AsyncReadyCallback() {
@Override
public void async(long result) {
OS.g_output_stream_write_all_async(serializer.output_stream(), pValue, buffer.length, serializer.priority(),
serializer.cancellable(), result, 0);
}

@Override
public long await(long result) {
long[] error = new long[1];
boolean finish = OS.g_output_stream_write_all_finish(serializer.output_stream(), result, null, error);
if (!finish) {
serializer.return_error(error[0]);
} else {
serializer.return_success();
}
OS.g_free(pValue);
return 0;
}
});
}

/**
Expand All @@ -183,14 +247,56 @@ protected void javaToNative (Object object, TransferData transferData) {
*/
@Override
protected Object nativeToJava(TransferData transferData) {
if ( !isSupportedType(transferData) || transferData.pValue == 0) return null;
int size = transferData.format * transferData.length / 8;
if (GTK.GTK4) return nativeToJavaGTK4(transferData);
if ( !isSupportedType(transferData) || transferData.gtk3().pValue == 0) return null;
int size = transferData.gtk3().format * transferData.gtk3().length / 8;
if (size == 0) return null;
byte[] buffer = new byte[size];
C.memmove(buffer, transferData.pValue, size);
C.memmove(buffer, transferData.gtk3().pValue, size);
return buffer;
}

private Object nativeToJavaGTK4(TransferData transferData) {
TransferDataGTK4 data = transferData.gtk4();
if (!isSupportedType(transferData) || data.deserializer == null)
return null;

GdkContentDeserializer deserializer = data.deserializer;
long memoryStream = OS.g_memory_output_stream_new_resizable();
System.out.println("About to run g_output_stream_splice_async");
boolean success = new SyncFinishUtil<Boolean>().run(data.display, new SyncFinishCallback<Boolean>() {
@Override
public void async(long result) {
OS.g_output_stream_splice_async(memoryStream, deserializer.input_stream(),
OS.G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | OS.G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
deserializer.priority(), deserializer.cancellable(), result, 0);
}

@Override
public Boolean await(long result) {
long[] error = new long[1];
long spliced = OS.g_output_stream_splice_finish(memoryStream, result, null);
if (spliced < 0) {
deserializer.return_error(error[0]);
return false;
} else {
deserializer.return_success();
return true;
}
}
});

if (success) {
long data_size = OS.g_memory_output_stream_get_data_size(memoryStream);
long dataPtr = OS.g_memory_output_stream_get_data(memoryStream);
byte[] buffer = new byte[(int)data_size];
C.memmove(buffer, dataPtr, data_size);
return buffer;
}

return null;
}

boolean checkByteArray(Object object) {
return (object instanceof byte[] && ((byte[])object).length > 0);
}
Expand Down
Loading
Loading