# HG changeset patch # User Frank Benoit # Date 1202915039 -3600 # Node ID 127a3e1fca052a1251e286d3a32585d7366b6e22 # Parent 18847a0560e9737cea342bcf67f1aac838860f1e HTMLTransfer diff -r 18847a0560e9 -r 127a3e1fca05 dwt/dnd/HTMLTransfer.d --- a/dwt/dnd/HTMLTransfer.d Wed Feb 13 15:27:57 2008 +0100 +++ b/dwt/dnd/HTMLTransfer.d Wed Feb 13 16:03:59 2008 +0100 @@ -13,8 +13,18 @@ module dwt.dnd.HTMLTransfer; import dwt.internal.ole.win32.COM; +import dwt.internal.ole.win32.OBJIDL; import dwt.internal.win32.OS; +import dwt.dnd.ByteArrayTransfer; +import dwt.dnd.TransferData; +import dwt.dnd.DND; + +import dwt.dwthelper.Integer; +import dwt.dwthelper.utils; +static import tango.text.Text; +alias tango.text.Text.Text!(char) StringBuffer; + /** * The class HTMLTransfer provides a platform specific mechanism * for converting text in HTML format represented as a java String @@ -30,15 +40,19 @@ */ public class HTMLTransfer : ByteArrayTransfer { - static HTMLTransfer _instance = new HTMLTransfer(); - static final String HTML_FORMAT = "HTML Format"; //$NON-NLS-1$ - static final int HTML_FORMATID = registerType(HTML_FORMAT); - static final String NUMBER = "00000000"; //$NON-NLS-1$ - static final String HEADER = "Version:0.9\r\nStartHTML:"+NUMBER+"\r\nEndHTML:"+NUMBER+"\r\nStartFragment:"+NUMBER+"\r\nEndFragment:"+NUMBER+"\r\n"; - static final String PREFIX = ""; //$NON-NLS-1$ - static final String SUFFIX = ""; //$NON-NLS-1$ - static final String StartFragment = "StartFragment:"; //$NON-NLS-1$ - static final String EndFragment = "EndFragment:"; //$NON-NLS-1$ + static HTMLTransfer _instance; + static const char[] HTML_FORMAT = "HTML Format"; //$NON-NLS-1$ + static const int HTML_FORMATID; + static const char[] NUMBER = "00000000"; //$NON-NLS-1$ + static const char[] HEADER = "Version:0.9\r\nStartHTML:"~NUMBER~"\r\nEndHTML:"~NUMBER~"\r\nStartFragment:"~NUMBER~"\r\nEndFragment:"~NUMBER~"\r\n"; + static const char[] PREFIX = ""; //$NON-NLS-1$ + static const char[] SUFFIX = ""; //$NON-NLS-1$ + static const char[] StartFragment = "StartFragment:"; //$NON-NLS-1$ + static const char[] EndFragment = "EndFragment:"; //$NON-NLS-1$ + +static this(){ + HTML_FORMATID = registerType(HTML_FORMAT); +} private this() {} @@ -48,6 +62,13 @@ * @return the singleton instance of the HTMLTransfer class */ public static HTMLTransfer getInstance () { + if( _instance is null ){ + synchronized { + if( _instance is null ){ + _instance = new HTMLTransfer(); + } + } + } return _instance; } @@ -64,55 +85,60 @@ if (!checkHTML(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } - String string = (String)object; - int count = string.length(); - char[] chars = new char[count + 1]; - string.getChars(0, count, chars, 0); + char[] string = ( cast(ArrayWrapperString)object ).array; int codePage = OS.GetACP(); - int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null); + int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, StrToTCHARz(string), -1, null, 0, null, null); if (cchMultiByte is 0) { transferData.stgmedium = new STGMEDIUM(); transferData.result = COM.DV_E_STGMEDIUM; return; } - int startHTML = HEADER.length(); - int startFragment = startHTML + PREFIX.length(); + int startHTML = HEADER.length; + int startFragment = startHTML + PREFIX.length; int endFragment = startFragment + cchMultiByte - 1; - int endHTML = endFragment + SUFFIX.length(); + int endHTML = endFragment + SUFFIX.length; StringBuffer buffer = new StringBuffer(HEADER); - int maxLength = NUMBER.length(); + int maxLength = NUMBER.length; //startHTML int start = buffer.toString().indexOf(NUMBER); - String temp = Integer.toString(startHTML); - buffer.replace(start + maxLength-temp.length(), start + maxLength, temp); + char[] temp = Integer.toString(startHTML); + buffer.select(start + maxLength-temp.length, temp.length); + buffer.replace(temp); + buffer.select(); + //endHTML start = buffer.toString().indexOf(NUMBER, start); temp = Integer.toString(endHTML); - buffer.replace(start + maxLength-temp.length(), start + maxLength, temp); + buffer.select(start + maxLength-temp.length, temp.length); + buffer.replace( temp); + buffer.select(); + //startFragment start = buffer.toString().indexOf(NUMBER, start); temp = Integer.toString(startFragment); - buffer.replace(start + maxLength-temp.length(), start + maxLength, temp); + buffer.select(start + maxLength-temp.length, temp.length); + buffer.replace(temp); + buffer.select(); //endFragment start = buffer.toString().indexOf(NUMBER, start); temp = Integer.toString(endFragment); - buffer.replace(start + maxLength-temp.length(), start + maxLength, temp); + buffer.select(start + maxLength-temp.length, temp.length); + buffer.replace(temp); + buffer.select(); buffer.append(PREFIX); buffer.append(string); buffer.append(SUFFIX); - count = buffer.length(); - chars = new char[count + 1]; - buffer.getChars(0, count, chars, 0); - cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null); - int lpMultiByteStr = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); - OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr, cchMultiByte, null, null); + auto wstrz = StrToTCHARz(codePage,buffer.toString); + cchMultiByte = OS.WideCharToMultiByte(codePage, 0, wstrz, -1, null, 0, null, null); + auto lpMultiByteStr = cast(char*) OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); + OS.WideCharToMultiByte(codePage, 0, wstrz, -1, lpMultiByteStr, cchMultiByte, null, null); transferData.stgmedium = new STGMEDIUM(); transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; transferData.stgmedium.unionField = lpMultiByteStr; - transferData.stgmedium.pUnkForRelease = 0; + transferData.stgmedium.pUnkForRelease = null; transferData.result = COM.S_OK; return; } @@ -128,32 +154,32 @@ * conversion was successful; otherwise null */ public Object nativeToJava(TransferData transferData){ - if (!isSupportedType(transferData) || transferData.pIDataObject is 0) return null; - IDataObject data = new IDataObject(transferData.pIDataObject); + if (!isSupportedType(transferData) || transferData.pIDataObject is null) return null; + IDataObject data = transferData.pIDataObject; data.AddRef(); - STGMEDIUM stgmedium = new STGMEDIUM(); - FORMATETC formatetc = transferData.formatetc; + STGMEDIUM* stgmedium = new STGMEDIUM(); + FORMATETC* formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; transferData.result = data.GetData(formatetc, stgmedium); data.Release(); if (transferData.result !is COM.S_OK) return null; - int hMem = stgmedium.unionField; + auto hMem = stgmedium.unionField; try { - int lpMultiByteStr = OS.GlobalLock(hMem); - if (lpMultiByteStr is 0) return null; + auto lpMultiByteStr = cast(char*) OS.GlobalLock(hMem); + if (lpMultiByteStr is null) return null; try { int codePage = OS.GetACP(); - int cchWideChar = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0); + auto cchWideChar = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0); if (cchWideChar is 0) return null; - char[] lpWideCharStr = new char [cchWideChar - 1]; - OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, lpWideCharStr.length); - String string = new String(lpWideCharStr); + wchar[] lpWideCharStr = new wchar [cchWideChar - 1]; + OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length); + char[] string = WCHARzToStr(lpWideCharStr.ptr); int fragmentStart = 0, fragmentEnd = 0; - int start = string.indexOf(StartFragment) + StartFragment.length(); + int start = string.indexOf(StartFragment) + StartFragment.length; int end = start + 1; - while (end < string.length()) { - String s = string.substring(start, end); + while (end < string.length) { + char[] s = string.substring(start, end); try { fragmentStart = Integer.parseInt(s); end++; @@ -161,10 +187,10 @@ break; } } - start = string.indexOf(EndFragment) + EndFragment.length(); + start = string.indexOf(EndFragment) + EndFragment.length; end = start + 1; - while (end < string.length()) { - String s = string.substring(start, end); + while (end < string.length) { + char[] s = string.substring(start, end); try { fragmentEnd = Integer.parseInt(s); end++; @@ -177,17 +203,17 @@ * FragmentStart and FragmentEnd are offsets in original byte stream, not * the wide char version of the byte stream. */ - String s = string.substring(fragmentStart, fragmentEnd); + char[] s = string.substring(fragmentStart, fragmentEnd); /* * Firefox includes in the fragment, so remove it. */ - String foxStart = "\r\n"; //$NON-NLS-1$ + char[] foxStart = "\r\n"; //$NON-NLS-1$ int prefix = s.indexOf(foxStart); if (prefix !is -1) { - prefix += foxStart.length(); + prefix += foxStart.length; s = s.substring(prefix); } - return s; + return new ArrayWrapperString(s); } finally { OS.GlobalUnlock(hMem); } @@ -196,13 +222,16 @@ } } protected int[] getTypeIds(){ - return new int[] {HTML_FORMATID}; + return [HTML_FORMATID]; } -protected String[] getTypeNames(){ - return new String[] {HTML_FORMAT}; +protected char[][] getTypeNames(){ + return [HTML_FORMAT]; } bool checkHTML(Object object) { - return (object !is null && object instanceof String && ((String)object).length() > 0); + if( auto ws = cast(ArrayWrapperString)object ){ + return ws.array.length > 0; + } + return false; } protected bool validate(Object object) { return checkHTML(object);