Как занести в Clipboard бинарные данные
Как можно используя javascript/XPCOM занести в clipboard бинарные данные, так чтобы их можно было использовать в других (не XUL) приложениях?
В частности мне нужно при нажатии на картинку скопировать в Clipboard массив из 4 байтов, представляющий идентификатор картинки.
При вызове nsITransferable.setTransferData пытался передавать nsISupportsPRInt64, nsISupportsArray, nsIArray, и даже простой javascript Array, но вне пределов XUL приложения Clipboard как будто не трогали.
Вот один из примеров (последний), в котором я пытался заполнить Clipboard
var workNum = imageID; var myArr = new Array(); for(var i=0;i<4; ++i) { var b4 = workNum % 256; workNum = workNum >> 8; myArr[3-i] = b4; } var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); if (!trans) return false; trans.addDataFlavor("IMAGEID"); trans.setTransferData("IMAGEID",myArr, myArr.length); var clipid=Components.interfaces.nsIClipboard; var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(clipid); if (!clip) return false; clip.setData(trans,null,clipid.kGlobalClipboard);
В Javascript console ошибок нет
Такой вариант проходит, если учесть, что в результате строка к unicode преобразуется где-то и добавляются лишние 0 байты.
Также возможен и вариант через eval()
var b4 = (workNum % 256).toString(16); workNum = workNum >> 8; var b3 = (workNum % 256).toString(16); workNum = workNum >> 8; var b2 = (workNum % 256).toString(16); workNum = workNum >> 8; var b1 = (workNum % 256).toString(16); if(b4.length < 2) b4 = "0"+b4; if(b3.length < 2) b3 = "0"+b3; if(b2.length < 2) b2 = "0"+b2; if(b1.length < 2) b1 = "0"+b1; var e1='"' + "\\u" + b1 + b2 +'"'; var e2='"' + "\\u" + b3 + b4 +'"'; var copytext=eval(e1)+eval(e2); var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); if (!str) return false; str.data=copytext; trans.addDataFlavor("IMAGEID"); trans.setTransferData("IMAGEID",str,4);
Но при использовании строк в конец в Clipboard неизменно добавляется завершающий \u0000. А его наличие недопустимо для совместимости моего приложения :(
Придется искать другие варианты. Если у кого-нибудь есть идеи - буду рад услышать.
Спасибо!
Да, JavaScript работает исключительно со строками в Unicode. Но вообще ваш код можно написать гораздо проще и без eval:
var copytext = String.fromCharCode((workNum >> 16) & 0xFFFF, workNum & 0xFFFF);
Нуль в конце строки, конечно, всегда есть, вот только записываться он не должен. Может длина в функции setTransferData() - длина в символах, а не байтах? Тогда trans.setTransferData("IMAGEID",str,2);
должен помочь. Надо покопаться в исходниках, иначе долго гадать можно...