src/java.desktop/macosx/classes/sun/lwawt/macosx/CDataTransferer.java
Print this page
@@ -24,19 +24,18 @@
*/
package sun.lwawt.macosx;
import java.awt.*;
-import java.awt.image.*;
-import sun.awt.image.ImageRepresentation;
import java.io.*;
import java.net.URL;
import java.nio.charset.Charset;
import java.text.Normalizer;
import java.text.Normalizer.Form;
import java.util.*;
+import java.util.regex.*;
import java.awt.datatransfer.*;
import sun.awt.datatransfer.*;
public class CDataTransferer extends DataTransferer {
@@ -123,30 +122,56 @@
@Override
public Object translateBytes(byte[] bytes, DataFlavor flavor,
long format, Transferable transferable) throws IOException {
- if (format == CF_URL && URL.class.equals(flavor.getRepresentationClass()))
- {
+ if (format == CF_URL && URL.class.equals(flavor.getRepresentationClass())) {
String charset = Charset.defaultCharset().name();
if (transferable != null && transferable.isDataFlavorSupported(javaTextEncodingFlavor)) {
try {
- charset = new String((byte[])transferable.getTransferData(javaTextEncodingFlavor), "UTF-8");
+ charset = new String((byte[]) transferable.getTransferData(javaTextEncodingFlavor), "UTF-8");
} catch (UnsupportedFlavorException cannotHappen) {
}
}
-
- return new URL(new String(bytes, charset));
+ String xml = new String(bytes, charset);
+ // macosx pasteboard returns a property list that consists of one URL
+ // let's extract it.
+ return new URL(extractURL(xml));
}
if (format == CF_STRING) {
bytes = Normalizer.normalize(new String(bytes, "UTF8"), Form.NFC).getBytes("UTF8");
}
return super.translateBytes(bytes, flavor, format, transferable);
}
+ /**
+ * Macosx pasteboard returns xml document that contains one URL, for exmple:
+ * <pre>
+ * {@code
+ * <?xml version=\"1.0\" encoding=\"UTF-8\"?>
+ * <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
+ * <plist version=\"1.0\">
+ * <array>
+ * <string>file:///path_to_file</string>
+ * <string></string>
+ * </array>
+ * </plist>
+ * }
+ * </pre>
+ */
+ private String extractURL(String xml) {
+ Pattern urlExtractorPattern = Pattern.compile("<string>(.*)</string>");
+ Matcher matcher = urlExtractorPattern.matcher(xml);
+ if (matcher.find()) {
+ return matcher.group(1);
+ } else {
+ return null;
+ }
+ }
+
@Override
synchronized protected Long getFormatForNativeAsLong(String str) {
Long format = predefinedClipboardNameMap.get(str);
if (format == null) {