package com.sun.glass.ui.ios;
import com.sun.glass.ui.Clipboard;
import com.sun.glass.ui.Pixels;
import com.sun.glass.ui.SystemClipboard;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.HashMap;
class IosSystemClipboard extends SystemClipboard {
static final String FILE_SCHEME = "file";
static final private String BAD_URI_MSG = "bad URI in com.sun.glass.ui.ios.IosSystemClipboard for file: ";
static final private String BAD_URL_MSG = "bad URL in com.sun.glass.ui.ios.IosSystemClipboard for file: ";
long seed = 0;
final IosPasteboard pasteboard;
public IosSystemClipboard(String name) {
super(name);
if (name.equals(Clipboard.SYSTEM) == true) {
this.pasteboard = new IosPasteboard(IosPasteboard.General);
} else {
this.pasteboard = new IosPasteboard(name);
}
}
@Override
protected boolean isOwner() {
return (this.seed == this.pasteboard.getSeed());
}
@Override
protected void pushToSystem(HashMap<String, Object> data, int supportedActions) {
HashMap<String,Object> itemFirst = null;
HashMap<String,Object> itemList[] = null;
java.util.Set keys = data.keySet();
java.util.Iterator iterator = keys.iterator();
while (iterator.hasNext() == true) {
String mime = (String)iterator.next();
Object object = data.get(mime);
if (object != null) {
if (mime.equals(URI_TYPE) == true) {
String list = (String)object;
String split[] = list.split("\n");
int count = 0;
for (int i=0; i<split.length; i++) {
String string = split[i];
if (string.startsWith("#") == false) {
count++;
}
}
if (count > 0) {
itemList = new HashMap[count];
count = 0;
for (int i=0; i<split.length; i++) {
String file = split[i];
if (file.startsWith("#") == false) {
URI uri = createUri(file, IosSystemClipboard.BAD_URI_MSG);
String utf = IosPasteboard.UtfUrl;
if (uri.getScheme() == null)
{
utf = IosPasteboard.UtfFileUrl;
uri = createUri(IosSystemClipboard.FILE_SCHEME, uri.getPath(), IosSystemClipboard.BAD_URI_MSG);
}
itemList[count] = new HashMap();
itemList[count].put(utf, uri.toASCIIString());
count++;
}
}
}
} else if (mime.equals(RAW_IMAGE_TYPE) == true) {
Pixels pixels = (Pixels)object;
if (itemFirst == null) {
itemFirst = new HashMap();
}
itemFirst.put(mimeToUtf(mime), pixels);
} else if ((mime.equals(TEXT_TYPE) == true) ||
(mime.equals(HTML_TYPE) == true) ||
(mime.equals(RTF_TYPE) == true)) {
if (object instanceof String) {
String string = (String)object;
if (itemFirst == null) {
itemFirst = new HashMap();
}
itemFirst.put(mimeToUtf(mime), string);
} else {
System.err.println("DelayedCallback not implemented yet: RT-14593");
Thread.dumpStack();
}
} else if (mime.equals(FILE_LIST_TYPE)) {
String files[] = (String[])object;
if (data.get(URI_TYPE) == null) {
itemList = new HashMap[files.length];
for (int i=0; i<files.length; i++) {
String file = files[i];
URI uri = createUri(file, IosSystemClipboard.BAD_URI_MSG);
String utf = IosPasteboard.UtfUrl;
if (uri.getScheme() == null)
{
utf = IosPasteboard.UtfFileUrl;
uri = createUri(IosSystemClipboard.FILE_SCHEME, uri.getPath(), IosSystemClipboard.BAD_URI_MSG);
}
itemList[i] = new HashMap();
itemList[i].put(utf, uri.toASCIIString());
}
}
} else {
if (itemFirst == null) {
itemFirst = new HashMap();
}
itemFirst.put(mimeToUtf(mime), serialize(object));
}
}
}
if (itemFirst != null) {
if (itemList == null) {
itemList = new HashMap[1];
itemList[0] = itemFirst;
} else {
HashMap temp = itemList[0];
itemList[0] = itemFirst;
iterator = temp.keySet().iterator();
while (iterator.hasNext() == true) {
String utf = (String)iterator.next();
Object object = temp.get(utf);
itemList[0].put(utf, object);
}
}
}
if (itemList != null) {
this.seed = this.pasteboard.putItems(itemList, supportedActions);
}
}
@Override
protected void pushTargetActionToSystem(int actionDone) {
}
@Override
protected Object popFromSystem(String mimeType) {
Object object = null;
String[][] utfs = this.pasteboard.getUTFs();
if (mimeType.equals(URI_TYPE) == true) {
if (utfs != null) {
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
for (int i=0; i<utfs.length; i++) {
String url = this.pasteboard.getItemStringForUTF(i, mimeToUtf(URI_TYPE));
if (url != null) {
list.add(url);
break;
}
}
if (list.size() > 0) {
object = list.get(0);
}
}
} else if (mimeType.equals(RAW_IMAGE_TYPE) == true) {
if (utfs != null) {
java.util.ArrayList<Pixels> list = new java.util.ArrayList<Pixels>();
for (int i=0; i<utfs.length; i++) {
Object data = this.pasteboard.getItemAsRawImage(i);
if (data != null) {
Pixels pixels = getPixelsForRawImage((byte[])data);
list.add(pixels);
break;
}
}
if (list.size() > 0) {
object = list.get(0);
}
}
} else if ((mimeType.equals(TEXT_TYPE) == true) ||
(mimeType.equals(HTML_TYPE) == true) ||
(mimeType.equals(RTF_TYPE) == true)) {
if (utfs != null) {
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
for (int i=0; i<utfs.length; i++) {
String item = this.pasteboard.getItemStringForUTF(i, mimeToUtf(mimeType));
if (item != null) {
list.add(item);
break;
}
}
if (list.size() > 0) {
object = list.get(0);
}
}
} else if (mimeType.equals(FILE_LIST_TYPE) == true) {
if (utfs != null) {
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
for (int i=0; i<utfs.length; i++) {
String file = this.pasteboard.getItemStringForUTF(i, IosPasteboard.UtfFileUrl);
if (file != null) {
URL url = createUrl(file, IosSystemClipboard.BAD_URL_MSG);
list.add(url.getPath());
}
}
if (list.size() > 0) {
object = new String[list.size()];
list.toArray((String[])object);
}
}
} else {
if (utfs != null) {
java.util.ArrayList<ByteBuffer> list = new java.util.ArrayList<ByteBuffer>();
for (int i=0; i<utfs.length; i++) {
byte data[] = this.pasteboard.getItemBytesForUTF(i, mimeToUtf(mimeType));
if (data != null) {
ByteBuffer bb = ByteBuffer.wrap(data);
list.add(bb);
break;
}
}
if (list.size() > 0) {
object = list.get(0);
}
}
}
return object;
}
@Override
protected int supportedSourceActionsFromSystem() {
return this.pasteboard.getAllowedOperation();
}
@Override
protected String[] mimesFromSystem() {
String[][] all = this.pasteboard.getUTFs();
java.util.ArrayList<String> mimes = new java.util.ArrayList<String>();
if (all != null) {
for (int i=0; i<all.length; i++) {
String[] utfs = all[i];
if (utfs != null) {
for (int j=0; j<utfs.length; j++) {
String utf = utfs[j];
String mime = utfToMime(utf);
if ((mime != null) && (mimes.contains(mime) == false)) {
mimes.add(mime);
}
}
}
}
}
String[] strings = new String[mimes.size()];
mimes.toArray(strings);
return strings;
}
static private HashMap utm = null;
private synchronized String utfToMime(String utf) {
if (IosSystemClipboard.utm == null) {
IosSystemClipboard.utm = new HashMap(6);
IosSystemClipboard.utm.put(IosPasteboard.UtfString, TEXT_TYPE);
IosSystemClipboard.utm.put(IosPasteboard.UtfHtml, HTML_TYPE);
IosSystemClipboard.utm.put(IosPasteboard.UtfRtf, RTF_TYPE);
IosSystemClipboard.utm.put(IosPasteboard.UtfUrl, URI_TYPE);
IosSystemClipboard.utm.put(IosPasteboard.UtfFileUrl, FILE_LIST_TYPE);
IosSystemClipboard.utm.put(IosPasteboard.UtfTiff, RAW_IMAGE_TYPE);
IosSystemClipboard.utm.put(IosPasteboard.UtfPng, RAW_IMAGE_TYPE);
}
if (IosSystemClipboard.utm.containsKey(utf) == true) {
return (String)IosSystemClipboard.utm.get(utf);
} else {
return utf;
}
}
static private HashMap mtu = null;
private synchronized String mimeToUtf(String mime) {
if (IosSystemClipboard.mtu == null) {
IosSystemClipboard.mtu = new HashMap(4);
IosSystemClipboard.mtu.put(TEXT_TYPE, IosPasteboard.UtfString);
IosSystemClipboard.mtu.put(HTML_TYPE, IosPasteboard.UtfHtml);
IosSystemClipboard.mtu.put(RTF_TYPE, IosPasteboard.UtfRtf);
IosSystemClipboard.mtu.put(URI_TYPE, IosPasteboard.UtfUrl);
IosSystemClipboard.mtu.put(FILE_LIST_TYPE, IosPasteboard.UtfFileUrl);
}
if (IosSystemClipboard.mtu.containsKey(mime) == true) {
return (String)IosSystemClipboard.mtu.get(mime);
} else {
return mime;
}
}
private URI createUri(String path, String message) {
URI uri = null;
try {
uri = new URI(path);
} catch (URISyntaxException ex) {
System.err.println(message+path);
}
return uri;
}
private URI createUri(String scheme, String path, String message) {
URI uri = null;
try {
uri = new URI(scheme, null, path, null);
} catch (URISyntaxException ex) {
System.err.println(message+path);
}
return uri;
}
private URL createUrl(String path, String message) {
URL url = null;
try {
url = new URL(path);
} catch (MalformedURLException ex) {
System.err.println(message+path);
}
return url;
}
private byte[] serialize(Object object) {
if (object instanceof String) {
String string = (String)object;
return string.getBytes();
} else if (object instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer)object;
return buffer.array();
} else {
throw new RuntimeException("can not handle " + object);
}
}
}