Changeset 145:82d3cef3912d
- Timestamp:
- 02/13/08 10:50:35
(9 months ago)
- Author:
- Frank Benoit <benoit@tionex.de>
- branch:
- default
- Message:
URLTransfer
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r135 |
r145 |
|
| 13 | 13 | module dwt.dnd.URLTransfer; |
|---|
| 14 | 14 | |
|---|
| 15 | | import java.net.URL; |
|---|
| | 15 | //import java.net.URL; |
|---|
| 16 | 16 | |
|---|
| 17 | 17 | import dwt.internal.ole.win32.COM; |
|---|
| | 18 | import dwt.internal.ole.win32.OBJIDL; |
|---|
| 18 | 19 | import dwt.internal.win32.OS; |
|---|
| | 20 | |
|---|
| | 21 | import dwt.dnd.ByteArrayTransfer; |
|---|
| | 22 | import dwt.dnd.TransferData; |
|---|
| | 23 | import dwt.dnd.DND; |
|---|
| | 24 | |
|---|
| | 25 | import dwt.dwthelper.Integer; |
|---|
| | 26 | import dwt.dwthelper.utils; |
|---|
| | 27 | static import tango.text.Text; |
|---|
| | 28 | alias tango.text.Text.Text!(char) StringBuffer; |
|---|
| 19 | 29 | |
|---|
| 20 | 30 | /** |
|---|
| … | … | |
| 36 | 46 | /*public*/ class URLTransfer : ByteArrayTransfer { |
|---|
| 37 | 47 | |
|---|
| 38 | | static URLTransfer _instance = new URLTransfer(); |
|---|
| 39 | | static final String CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$ |
|---|
| 40 | | static final int CFSTR_INETURLID = registerType(CFSTR_INETURL); |
|---|
| | 48 | static URLTransfer _instance; |
|---|
| | 49 | static const char[] CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$ |
|---|
| | 50 | static const int CFSTR_INETURLID; |
|---|
| | 51 | |
|---|
| | 52 | static this(){ |
|---|
| | 53 | CFSTR_INETURLID = registerType(CFSTR_INETURL); |
|---|
| | 54 | } |
|---|
| 41 | 55 | |
|---|
| 42 | 56 | private this() {} |
|---|
| … | … | |
| 48 | 62 | */ |
|---|
| 49 | 63 | public static URLTransfer getInstance () { |
|---|
| | 64 | if( _instance is null ){ |
|---|
| | 65 | synchronized { |
|---|
| | 66 | if( _instance is null ){ |
|---|
| | 67 | _instance = new URLTransfer(); |
|---|
| | 68 | } |
|---|
| | 69 | } |
|---|
| | 70 | } |
|---|
| 50 | 71 | return _instance; |
|---|
| 51 | 72 | } |
|---|
| … | … | |
| 66 | 87 | transferData.result = COM.E_FAIL; |
|---|
| 67 | 88 | // URL is stored as a null terminated byte array |
|---|
| 68 | | String url = ((String[])object)[0]; |
|---|
| 69 | | int count = url.length(); |
|---|
| 70 | | char[] chars = new char[count + 1]; |
|---|
| 71 | | url.getChars(0, count, chars, 0); |
|---|
| | 89 | char[] url = (cast(ArrayWrapperString2)object).array[0]; |
|---|
| 72 | 90 | int codePage = OS.GetACP(); |
|---|
| 73 | | int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null); |
|---|
| | 91 | wchar[] chars = StrToWCHARs(codePage, url, true ); |
|---|
| | 92 | int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, null, 0, null, null); |
|---|
| 74 | 93 | if (cchMultiByte is 0) { |
|---|
| 75 | 94 | transferData.stgmedium = new STGMEDIUM(); |
|---|
| … | … | |
| 77 | 96 | return; |
|---|
| 78 | 97 | } |
|---|
| 79 | | int lpMultiByteStr = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); |
|---|
| 80 | | OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr, cchMultiByte, null, null); |
|---|
| | 98 | auto lpMultiByteStr = cast(char*)OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); |
|---|
| | 99 | OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, lpMultiByteStr, cchMultiByte, null, null); |
|---|
| 81 | 100 | transferData.stgmedium = new STGMEDIUM(); |
|---|
| 82 | 101 | transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; |
|---|
| 83 | 102 | transferData.stgmedium.unionField = lpMultiByteStr; |
|---|
| 84 | | transferData.stgmedium.pUnkForRelease = 0; |
|---|
| | 103 | transferData.stgmedium.pUnkForRelease = null; |
|---|
| 85 | 104 | transferData.result = COM.S_OK; |
|---|
| 86 | 105 | return; |
|---|
| … | … | |
| 98 | 117 | */ |
|---|
| 99 | 118 | public Object nativeToJava(TransferData transferData){ |
|---|
| 100 | | if (!isSupportedType(transferData) || transferData.pIDataObject is 0) return null; |
|---|
| 101 | | IDataObject data = new IDataObject(transferData.pIDataObject); |
|---|
| | 119 | if (!isSupportedType(transferData) || transferData.pIDataObject is null) return null; |
|---|
| | 120 | IDataObject data = transferData.pIDataObject; |
|---|
| 102 | 121 | data.AddRef(); |
|---|
| 103 | | STGMEDIUM stgmedium = new STGMEDIUM(); |
|---|
| 104 | | FORMATETC formatetc = transferData.formatetc; |
|---|
| | 122 | STGMEDIUM* stgmedium = new STGMEDIUM(); |
|---|
| | 123 | FORMATETC* formatetc = transferData.formatetc; |
|---|
| 105 | 124 | stgmedium.tymed = COM.TYMED_HGLOBAL; |
|---|
| 106 | 125 | transferData.result = data.GetData(formatetc, stgmedium); |
|---|
| 107 | 126 | data.Release(); |
|---|
| 108 | 127 | if (transferData.result !is COM.S_OK) return null; |
|---|
| 109 | | int hMem = stgmedium.unionField; |
|---|
| | 128 | auto hMem = stgmedium.unionField; |
|---|
| 110 | 129 | try { |
|---|
| 111 | | int lpMultiByteStr = OS.GlobalLock(hMem); |
|---|
| 112 | | if (lpMultiByteStr is 0) return null; |
|---|
| | 130 | auto lpMultiByteStr = cast(char*)OS.GlobalLock(hMem); |
|---|
| | 131 | if (lpMultiByteStr is null) return null; |
|---|
| 113 | 132 | try { |
|---|
| 114 | 133 | int codePage = OS.GetACP(); |
|---|
| 115 | 134 | int cchWideChar = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0); |
|---|
| 116 | 135 | if (cchWideChar is 0) return null; |
|---|
| 117 | | char[] lpWideCharStr = new char [cchWideChar - 1]; |
|---|
| 118 | | OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, lpWideCharStr.length); |
|---|
| 119 | | return new String[]{new String(lpWideCharStr)}; |
|---|
| | 136 | wchar[] lpWideCharStr = new wchar [cchWideChar - 1]; |
|---|
| | 137 | OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length); |
|---|
| | 138 | return new ArrayWrapperString2( [ WCHARzToStr( lpWideCharStr.ptr) ]); |
|---|
| 120 | 139 | } finally { |
|---|
| 121 | 140 | OS.GlobalUnlock(hMem); |
|---|
| … | … | |
| 127 | 146 | |
|---|
| 128 | 147 | protected int[] getTypeIds(){ |
|---|
| 129 | | return new int[] {CFSTR_INETURLID}; |
|---|
| | 148 | return [CFSTR_INETURLID]; |
|---|
| 130 | 149 | } |
|---|
| 131 | 150 | |
|---|
| 132 | | protected String[] getTypeNames(){ |
|---|
| 133 | | return new String[] {CFSTR_INETURL}; |
|---|
| | 151 | protected char[][] getTypeNames(){ |
|---|
| | 152 | return [CFSTR_INETURL]; |
|---|
| 134 | 153 | } |
|---|
| 135 | 154 | |
|---|
| 136 | 155 | bool checkURL(Object object) { |
|---|
| 137 | | if (object is null || !(object instanceof String[]) || ((String[])object).length is 0) return false; |
|---|
| 138 | | String[] strings = (String[])object; |
|---|
| 139 | | if (strings[0] is null || strings[0].length() is 0) return false; |
|---|
| 140 | | try { |
|---|
| 141 | | new URL(strings[0]); |
|---|
| 142 | | } catch (java.net.MalformedURLException e) { |
|---|
| 143 | | return false; |
|---|
| | 156 | if( auto s = cast(ArrayWrapperString2)object ){ |
|---|
| | 157 | if( s.array.length is 0 ) return false; |
|---|
| | 158 | char[][] strings = s.array; |
|---|
| | 159 | if (strings[0] is null || strings[0].length is 0) return false; |
|---|
| | 160 | //PORTING_FIXME: how to validata URL? |
|---|
| | 161 | /+try { |
|---|
| | 162 | new URL(strings[0]); |
|---|
| | 163 | } catch (java.net.MalformedURLException e) { |
|---|
| | 164 | return false; |
|---|
| | 165 | }+/ |
|---|
| | 166 | return true; |
|---|
| 144 | 167 | } |
|---|
| 145 | | return true; |
|---|
| | 168 | return false; |
|---|
| 146 | 169 | } |
|---|
| 147 | 170 | |
|---|