Mercurial > projects > dwt-win
changeset 145:82d3cef3912d
URLTransfer
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 13 Feb 2008 16:50:35 +0100 |
parents | 35669d0d0dc5 |
children | c605bf6c2f48 |
files | dwt/dnd/URLTransfer.d |
diffstat | 1 files changed, 56 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/dwt/dnd/URLTransfer.d Wed Feb 13 16:35:16 2008 +0100 +++ b/dwt/dnd/URLTransfer.d Wed Feb 13 16:50:35 2008 +0100 @@ -12,11 +12,21 @@ *******************************************************************************/ module dwt.dnd.URLTransfer; -import java.net.URL; +//import java.net.URL; 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 <code>URLTransfer</code> provides a platform specific mechanism * for converting text in URL format represented as a java <code>String[]</code> @@ -35,9 +45,13 @@ */ /*public*/ class URLTransfer : ByteArrayTransfer { - static URLTransfer _instance = new URLTransfer(); - static final String CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$ - static final int CFSTR_INETURLID = registerType(CFSTR_INETURL); + static URLTransfer _instance; + static const char[] CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$ + static const int CFSTR_INETURLID; + +static this(){ + CFSTR_INETURLID = registerType(CFSTR_INETURL); +} private this() {} @@ -47,6 +61,13 @@ * @return the singleton instance of the URLTransfer class */ public static URLTransfer getInstance () { + if( _instance is null ){ + synchronized { + if( _instance is null ){ + _instance = new URLTransfer(); + } + } + } return _instance; } @@ -65,23 +86,21 @@ } transferData.result = COM.E_FAIL; // URL is stored as a null terminated byte array - String url = ((String[])object)[0]; - int count = url.length(); - char[] chars = new char[count + 1]; - url.getChars(0, count, chars, 0); + char[] url = (cast(ArrayWrapperString2)object).array[0]; int codePage = OS.GetACP(); - int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null); + wchar[] chars = StrToWCHARs(codePage, url, true ); + int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, null, 0, null, null); if (cchMultiByte is 0) { transferData.stgmedium = new STGMEDIUM(); transferData.result = COM.DV_E_STGMEDIUM; return; } - int lpMultiByteStr = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); - OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr, cchMultiByte, null, null); + auto lpMultiByteStr = cast(char*)OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); + OS.WideCharToMultiByte(codePage, 0, chars.ptr, -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; } @@ -97,26 +116,26 @@ * 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); if (cchWideChar is 0) return null; - char[] lpWideCharStr = new char [cchWideChar - 1]; - OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, lpWideCharStr.length); - return new String[]{new String(lpWideCharStr)}; + wchar[] lpWideCharStr = new wchar [cchWideChar - 1]; + OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length); + return new ArrayWrapperString2( [ WCHARzToStr( lpWideCharStr.ptr) ]); } finally { OS.GlobalUnlock(hMem); } @@ -126,23 +145,27 @@ } protected int[] getTypeIds(){ - return new int[] {CFSTR_INETURLID}; + return [CFSTR_INETURLID]; } -protected String[] getTypeNames(){ - return new String[] {CFSTR_INETURL}; +protected char[][] getTypeNames(){ + return [CFSTR_INETURL]; } bool checkURL(Object object) { - if (object is null || !(object instanceof String[]) || ((String[])object).length is 0) return false; - String[] strings = (String[])object; - if (strings[0] is null || strings[0].length() is 0) return false; - try { - new URL(strings[0]); - } catch (java.net.MalformedURLException e) { - return false; + if( auto s = cast(ArrayWrapperString2)object ){ + if( s.array.length is 0 ) return false; + char[][] strings = s.array; + if (strings[0] is null || strings[0].length is 0) return false; + //PORTING_FIXME: how to validata URL? + /+try { + new URL(strings[0]); + } catch (java.net.MalformedURLException e) { + return false; + }+/ + return true; } - return true; + return false; } protected bool validate(Object object) {