Mercurial > projects > dwt-mac
diff dwt/dnd/FileTransfer.d @ 45:d8635bb48c7c
Merge with SWT 3.5
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Mon, 01 Dec 2008 17:07:00 +0100 |
parents | 1a8b3cb347e0 |
children | e655f9f35342 |
line wrap: on
line diff
--- a/dwt/dnd/FileTransfer.d Tue Oct 21 15:20:04 2008 +0200 +++ b/dwt/dnd/FileTransfer.d Mon Dec 01 17:07:00 2008 +0100 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2006 IBM Corporation and others. + * Copyright (c) 2000, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -9,10 +9,14 @@ * IBM Corporation - initial API and implementation * Outhink - support for typeFileURL *******************************************************************************/ -module dwt.dnd; +module dwt.dnd.FileTransfer; + +import dwt.dwthelper.utils; -import java.io.*; -import dwt.internal.carbon.*; +import dwt.internal.cocoa.NSArray; +import dwt.internal.cocoa.NSMutableArray; +import dwt.internal.cocoa.NSString; +import dwt.internal.cocoa.OS; /** * The class <code>FileTransfer</code> provides a platform specific mechanism @@ -20,7 +24,6 @@ * platform specific representation of the data and vice versa. * Each <code>String</code> in the array contains the absolute path for a single * file or directory. - * See <code>Transfer</code> for additional information. * * <p>An example of a java <code>String[]</code> containing a list of files is shown * below:</p> @@ -32,16 +35,16 @@ * fileData[0] = file1.getAbsolutePath(); * fileData[1] = file2.getAbsolutePath(); * </code></pre> + * + * @see Transfer */ -public class FileTransfer : ByteArrayTransfer { +public class FileTransfer extends ByteArrayTransfer { static FileTransfer _instance = new FileTransfer(); - static final String HFS = "hfs "; //$NON-NLS-1$ - static final String FURL = "furl"; //$NON-NLS-1$ - static final int HFSID = registerType(HFS); - static final int FURLID = registerType(FURL); + static final String ID_NAME = OS.NSFilenamesPboardType.getString(); + static final int ID = registerType(ID_NAME); -this() {} +FileTransfer() {} /** * Returns the singleton instance of the FileTransfer class. @@ -56,136 +59,65 @@ * This implementation of <code>javaToNative</code> converts a list of file names * represented by a java <code>String[]</code> to a platform specific representation. * Each <code>String</code> in the array contains the absolute path for a single - * file or directory. For additional information see - * <code>Transfer#javaToNative</code>. + * file or directory. * - * @param object a java <code>String[]</code> containing the file names to be - * converted - * @param transferData an empty <code>TransferData</code> object; this - * object will be filled in on return with the platform specific format of the data + * @param object a java <code>String[]</code> containing the file names to be converted + * @param transferData an empty <code>TransferData</code> object that will + * be filled in on return with the platform specific format of the data + * + * @see Transfer#nativeToJava */ public void javaToNative(Object object, TransferData transferData) { if (!checkFile(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } String[] files = (String[])object; - transferData.result = -1; - byte[][] data = new byte[files.length][]; - for (int i = 0; i < data.length; i++) { - File file = new File(files[i]); - bool isDirectory = file.isDirectory(); + int length = files.length; + NSMutableArray array = NSMutableArray.arrayWithCapacity(length); + for (int i = 0; i < length; i++) { String fileName = files[i]; - char [] chars = new char [fileName.length ()]; - fileName.getChars (0, chars.length, chars, 0); - int cfString = OS.CFStringCreateWithCharacters (OS.kCFAllocatorDefault, chars, chars.length); - if (cfString is 0) return; - try { - int url = OS.CFURLCreateWithFileSystemPath(OS.kCFAllocatorDefault, cfString, OS.kCFURLPOSIXPathStyle, isDirectory); - if (url is 0) return; - try { - if (transferData.type is HFSID) { - byte[] fsRef = new byte[80]; - if (!OS.CFURLGetFSRef(url, fsRef)) return; - byte[] fsSpec = new byte[70]; - if (OS.FSGetCatalogInfo(fsRef, 0, null, null, fsSpec, null) !is OS.noErr) return; - byte[] hfsflavor = new byte[10 + fsSpec.length]; - byte[] finfo = new byte[16]; - OS.FSpGetFInfo(fsSpec, finfo); - System.arraycopy(finfo, 0, hfsflavor, 0, 10); - System.arraycopy(fsSpec, 0, hfsflavor, 10, fsSpec.length); - data[i] = hfsflavor; - } - if (transferData.type is FURLID) { - int encoding = OS.CFStringGetSystemEncoding(); - int theData = OS.CFURLCreateData(OS.kCFAllocatorDefault, url, encoding, true); - if (theData is 0) return; - try { - int length = OS.CFDataGetLength(theData); - byte[] buffer = new byte[length]; - CFRange range = new CFRange(); - range.length = length; - OS.CFDataGetBytes(theData, range, buffer); - data[i] = buffer; - } finally { - OS.CFRelease(theData); - } - } - } finally { - OS.CFRelease(url); - } - } finally { - OS.CFRelease(cfString); - } + NSString string = NSString.stringWith(fileName); + array.addObject(string); } - transferData.data = data; - transferData.result = 0; + transferData.data = array; } /** * This implementation of <code>nativeToJava</code> converts a platform specific * representation of a list of file names to a java <code>String[]</code>. * Each String in the array contains the absolute path for a single file or directory. - * For additional information see <code>Transfer#nativeToJava</code>. * - * @param transferData the platform specific representation of the data to be - * been converted - * @return a java <code>String[]</code> containing a list of file names if the - * conversion was successful; otherwise null + * @param transferData the platform specific representation of the data to be converted + * @return a java <code>String[]</code> containing a list of file names if the conversion + * was successful; otherwise null + * + * @see Transfer#javaToNative */ public Object nativeToJava(TransferData transferData) { if (!isSupportedType(transferData) || transferData.data is null) return null; - if (transferData.data.length is 0) return null; - int count = transferData.data.length; + NSArray array = (NSArray) transferData.data; + if (array.count() is 0) return null; + int count = (int)/*64*/array.count(); String[] fileNames = new String[count]; for (int i=0; i<count; i++) { - byte[] data = transferData.data[i]; - int url = 0; - if (transferData.type is HFSID) { - byte[] fsspec = new byte[data.length - 10]; - System.arraycopy(data, 10, fsspec, 0, fsspec.length); - byte[] fsRef = new byte[80]; - if (OS.FSpMakeFSRef(fsspec, fsRef) !is OS.noErr) return null; - url = OS.CFURLCreateFromFSRef(OS.kCFAllocatorDefault, fsRef); - if (url is 0) return null; - } - if (transferData.type is FURLID) { - int encoding = OS.kCFStringEncodingUTF8; - url = OS.CFURLCreateWithBytes(OS.kCFAllocatorDefault, data, data.length, encoding, 0); - if (url is 0) return null; - } - try { - int path = OS.CFURLCopyFileSystemPath(url, OS.kCFURLPOSIXPathStyle); - if (path is 0) return null; - try { - int length = OS.CFStringGetLength(path); - if (length is 0) return null; - char[] buffer= new char[length]; - CFRange range = new CFRange(); - range.length = length; - OS.CFStringGetCharacters(path, range, buffer); - fileNames[i] = new String(buffer); - } finally { - OS.CFRelease(path); - } - } finally { - OS.CFRelease(url); - } + NSString string = new NSString(array.objectAtIndex(i)); + fileNames[i] = string.getString(); } return fileNames; } protected int[] getTypeIds(){ - return new int[] {FURLID, HFSID}; + return new int[] {ID}; } protected String[] getTypeNames(){ - return new String[] {FURL, HFS}; + return new String[] {ID_NAME}; } bool checkFile(Object object) { if (object is null || !(object instanceof String[]) || ((String[])object).length is 0) return false; - String[] Strings = (String[])object; - for (int i = 0; i < Strings.length; i++) { - if (Strings[i] is null || Strings[i].length() is 0) return false; + String[] strings = (String[])object; + for (int i = 0; i < strings.length; i++) { + if (strings[i] is null || strings[i].length() is 0) return false; } return true; }