# HG changeset patch # User Frank Benoit # Date 1233047727 -3600 # Node ID fd2409fb852ea7d8390d65fec1a34e02c30d8ddc # Parent 558cbe388376b3995ec6f4d78bd69efa8866a358 transfered data shall be utf16. Thanks hduregger. diff -r 558cbe388376 -r fd2409fb852e dwt/dnd/URLTransfer.d --- a/dwt/dnd/URLTransfer.d Tue Jan 27 10:09:26 2009 +0100 +++ b/dwt/dnd/URLTransfer.d Tue Jan 27 10:15:27 2009 +0100 @@ -72,14 +72,15 @@ if (!checkURL(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } - String string = (cast(ArrayWrapperString)object).array; - char* pValue = cast(char*)OS.g_malloc(string.length+1); + wchar[] string = (cast(ArrayWrapperString)object).array.toString16(); + int byteCount = (string.length+1)*2; + wchar* pValue = cast(wchar*)OS.g_malloc(byteCount); if (pValue is null) return; pValue[ 0 .. string.length ] = string[]; pValue[ string.length ] = '\0'; - transferData.length = string.length; + transferData.length = byteCount; transferData.format = 8; - transferData.pValue = pValue; + transferData.pValue = cast(char*)pValue; transferData.result = 1; } @@ -95,11 +96,18 @@ */ public Object nativeToJava(TransferData transferData){ if (!isSupportedType(transferData) || transferData.pValue is null) return null; - int size = (transferData.format * transferData.length / 8); + /* Ensure byteCount is a multiple of 2 bytes */ + int size = (transferData.format * transferData.length / 8) / 2 * 2; if (size <= 0) return null; - String string = fromStringz(cast(char*)transferData.pValue).dup; - int end = string.indexOf('\0'); - return new ArrayWrapperString((end is -1) ? string : string.substring(0, end)); + // The string can be terminated with NULL or it is as a maximum of length size + for( int i = 0; i < size; i++ ){ + if( (cast(wchar*)transferData.pValue)[i] == '\0' ){ + size = i; + break; + } + } + String string = tango.text.convert.Utf.toString((cast(wchar*)transferData.pValue)[ 0 .. size ]); + return new ArrayWrapperString( string ); } protected int[] getTypeIds(){