Changeset 145:82d3cef3912d

Show
Ignore:
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
  • dwt/dnd/URLTransfer.d

    r135 r145  
    1313module dwt.dnd.URLTransfer; 
    1414 
    15 import java.net.URL; 
     15//import java.net.URL; 
    1616 
    1717import dwt.internal.ole.win32.COM; 
     18import dwt.internal.ole.win32.OBJIDL; 
    1819import dwt.internal.win32.OS; 
     20 
     21import dwt.dnd.ByteArrayTransfer; 
     22import dwt.dnd.TransferData; 
     23import dwt.dnd.DND; 
     24 
     25import dwt.dwthelper.Integer; 
     26import dwt.dwthelper.utils; 
     27static import tango.text.Text; 
     28alias tango.text.Text.Text!(char) StringBuffer; 
    1929 
    2030/** 
     
    3646/*public*/ class URLTransfer : ByteArrayTransfer { 
    3747 
    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 
     52static this(){ 
     53    CFSTR_INETURLID = registerType(CFSTR_INETURL); 
     54
    4155 
    4256private this() {} 
     
    4862 */ 
    4963public static URLTransfer getInstance () { 
     64    if( _instance is null ){ 
     65        synchronized { 
     66            if( _instance is null ){ 
     67                _instance = new URLTransfer(); 
     68            } 
     69        } 
     70    } 
    5071    return _instance; 
    5172} 
     
    6687    transferData.result = COM.E_FAIL; 
    6788    // 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]; 
    7290    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); 
    7493    if (cchMultiByte is 0) { 
    7594        transferData.stgmedium = new STGMEDIUM(); 
     
    7796        return; 
    7897    } 
    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); 
    81100    transferData.stgmedium = new STGMEDIUM(); 
    82101    transferData.stgmedium.tymed = COM.TYMED_HGLOBAL; 
    83102    transferData.stgmedium.unionField = lpMultiByteStr; 
    84     transferData.stgmedium.pUnkForRelease = 0
     103    transferData.stgmedium.pUnkForRelease = null
    85104    transferData.result = COM.S_OK; 
    86105    return; 
     
    98117 */ 
    99118public 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
    102121    data.AddRef(); 
    103     STGMEDIUM stgmedium = new STGMEDIUM(); 
    104     FORMATETC formatetc = transferData.formatetc; 
     122    STGMEDIUM* stgmedium = new STGMEDIUM(); 
     123    FORMATETC* formatetc = transferData.formatetc; 
    105124    stgmedium.tymed = COM.TYMED_HGLOBAL; 
    106125    transferData.result = data.GetData(formatetc, stgmedium); 
    107126    data.Release(); 
    108127    if (transferData.result !is COM.S_OK) return null; 
    109     int hMem = stgmedium.unionField; 
     128    auto hMem = stgmedium.unionField; 
    110129    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; 
    113132        try { 
    114133            int codePage = OS.GetACP(); 
    115134            int cchWideChar  = OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0); 
    116135            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) ])
    120139        } finally { 
    121140            OS.GlobalUnlock(hMem); 
     
    127146 
    128147protected int[] getTypeIds(){ 
    129     return new int[] {CFSTR_INETURLID}
     148    return [CFSTR_INETURLID]
    130149} 
    131150 
    132 protected String[] getTypeNames(){ 
    133     return new String[] {CFSTR_INETURL}
     151protected char[][] getTypeNames(){ 
     152    return [CFSTR_INETURL]
    134153} 
    135154 
    136155bool 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; 
    144167    } 
    145     return true; 
     168    return false; 
    146169} 
    147170