xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #2018: html5-send-binary.patch

File html5-send-binary.patch, 1.8 KB (added by Antoine Martin, 2 months ago)

patch to allow the bencoder to handle binary buffers directly

  • html5/js/lib/bencode.js

     
    2626        throw "invalid: cannot encode null";
    2727    }
    2828    switch(btypeof(obj)) {
     29        case "binary":     return bbinary(obj);
    2930        case "string":     return bstring(obj);
    3031        case "number":     return bint(obj);
    3132        case "list":       return blist(obj);
     
    145146
    146147// returns the bencoding type of the given object
    147148function btypeof(obj) {
     149        try {
     150                if (obj instanceof Uint8Array) {
     151                        return "binary";
     152                }
     153        }
     154        catch {}
    148155    var type = typeof obj;
    149156    if(type === 'object') {
    150157        if(typeof obj.length === 'undefined') {
     
    160167    return (str.length + ":" + str);
    161168}
    162169
     170function bbinary(u8a) {
     171        const CHUNK_SZ = 0x8000;
     172        const c = [
     173                ""+u8a.length,
     174                ":"
     175                ];
     176        for (let i=0; i < u8a.length; i+=CHUNK_SZ) {
     177                c.push(String.fromCharCode.apply(null, u8a.subarray(i, i+CHUNK_SZ)));
     178        }
     179        return c.join("");
     180}
     181
    163182// bencode an integer
    164183function bint(num) {
    165184    return "i" + num + "e";
  • html5/index.html

     
    946946                                        const fileReader = new FileReader();
    947947                                        fileReader.onloadend = function (evt) {
    948948                                                const u8a = new Uint8Array(evt.target.result);
    949                                                 const buf = Utilities.Uint8ToString(u8a);
    950                                                 client.send_file(f.name, f.type, f.size, buf);
     949                                                //const buf = Utilities.Uint8ToString(u8a);
     950                                                //clog("buf("+evt.target.result+")="+buf.length);
     951                                                client.send_file(f.name, f.type, f.size, u8a);
    951952                                        };
    952953                                        fileReader.readAsArrayBuffer(f);
    953954                                }