spice-client 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/COPYING +674 -0
  2. package/COPYING.LESSER +165 -0
  3. package/LICENSE +14 -0
  4. package/README.cn.md +143 -0
  5. package/README.md +143 -0
  6. package/dist/cjs/index.js +14 -0
  7. package/dist/cjs/index.js.map +1 -0
  8. package/dist/esm/atKeynames.d.ts +92 -0
  9. package/dist/esm/atKeynames.d.ts.map +1 -0
  10. package/dist/esm/bitmap.d.ts +11 -0
  11. package/dist/esm/bitmap.d.ts.map +1 -0
  12. package/dist/esm/code_to_scancode.d.ts +148 -0
  13. package/dist/esm/code_to_scancode.d.ts.map +1 -0
  14. package/dist/esm/cursor.d.ts +6 -0
  15. package/dist/esm/cursor.d.ts.map +1 -0
  16. package/dist/esm/display.d.ts +26 -0
  17. package/dist/esm/display.d.ts.map +1 -0
  18. package/dist/esm/enums.d.ts +312 -0
  19. package/dist/esm/enums.d.ts.map +1 -0
  20. package/dist/esm/filexfer.d.ts +14 -0
  21. package/dist/esm/filexfer.d.ts.map +1 -0
  22. package/dist/esm/index.d.ts +9 -0
  23. package/dist/esm/index.d.ts.map +1 -0
  24. package/dist/esm/index.js +5328 -0
  25. package/dist/esm/index.js.map +1 -0
  26. package/dist/esm/inputs.d.ts +31 -0
  27. package/dist/esm/inputs.d.ts.map +1 -0
  28. package/dist/esm/lz.d.ts +2 -0
  29. package/dist/esm/lz.d.ts.map +1 -0
  30. package/dist/esm/main.d.ts +49 -0
  31. package/dist/esm/main.d.ts.map +1 -0
  32. package/dist/esm/playback.d.ts +18 -0
  33. package/dist/esm/playback.d.ts.map +1 -0
  34. package/dist/esm/png.d.ts +2 -0
  35. package/dist/esm/png.d.ts.map +1 -0
  36. package/dist/esm/port.d.ts +9 -0
  37. package/dist/esm/port.d.ts.map +1 -0
  38. package/dist/esm/quic.d.ts +19 -0
  39. package/dist/esm/quic.d.ts.map +1 -0
  40. package/dist/esm/resize.d.ts +4 -0
  41. package/dist/esm/resize.d.ts.map +1 -0
  42. package/dist/esm/simulatecursor.d.ts +26 -0
  43. package/dist/esm/simulatecursor.d.ts.map +1 -0
  44. package/dist/esm/spicearraybuffer.d.ts +2 -0
  45. package/dist/esm/spicearraybuffer.d.ts.map +1 -0
  46. package/dist/esm/spiceconn.d.ts +46 -0
  47. package/dist/esm/spiceconn.d.ts.map +1 -0
  48. package/dist/esm/spicedataview.d.ts +13 -0
  49. package/dist/esm/spicedataview.d.ts.map +1 -0
  50. package/dist/esm/spicemsg.d.ts +469 -0
  51. package/dist/esm/spicemsg.d.ts.map +1 -0
  52. package/dist/esm/spicetype.d.ts +125 -0
  53. package/dist/esm/spicetype.d.ts.map +1 -0
  54. package/dist/esm/thirdparty/jsbn.d.ts +52 -0
  55. package/dist/esm/thirdparty/jsbn.d.ts.map +1 -0
  56. package/dist/esm/thirdparty/prng4.d.ts +12 -0
  57. package/dist/esm/thirdparty/prng4.d.ts.map +1 -0
  58. package/dist/esm/thirdparty/rng.d.ts +4 -0
  59. package/dist/esm/thirdparty/rng.d.ts.map +1 -0
  60. package/dist/esm/thirdparty/rsa.d.ts +15 -0
  61. package/dist/esm/thirdparty/rsa.d.ts.map +1 -0
  62. package/dist/esm/thirdparty/sha1.d.ts +10 -0
  63. package/dist/esm/thirdparty/sha1.d.ts.map +1 -0
  64. package/dist/esm/ticket.d.ts +4 -0
  65. package/dist/esm/ticket.d.ts.map +1 -0
  66. package/dist/esm/utils.d.ts +16 -0
  67. package/dist/esm/utils.d.ts.map +1 -0
  68. package/dist/esm/webm.d.ts +142 -0
  69. package/dist/esm/webm.d.ts.map +1 -0
  70. package/dist/esm/wire.d.ts +14 -0
  71. package/dist/esm/wire.d.ts.map +1 -0
  72. package/dist/global/spice-client.min.js +14 -0
  73. package/dist/global/spice-client.min.js.map +1 -0
  74. package/package.json +436 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/spice/enums.ts","../../src/spice/spicedataview.ts","../../src/spice/thirdparty/jsbn.ts","../../src/spice/thirdparty/prng4.ts","../../src/spice/thirdparty/rng.ts","../../src/spice/thirdparty/rsa.ts","../../src/spice/thirdparty/sha1.ts","../../src/spice/ticket.ts","../../src/spice/quic.ts","../../src/spice/spicetype.ts","../../src/spice/atKeynames.ts","../../src/spice/code_to_scancode.ts","../../src/spice/utils.ts","../../src/spice/spicemsg.ts","../../src/spice/png.ts","../../src/spice/simulatecursor.ts","../../src/spice/wire.ts","../../src/spice/webm.ts","../../src/spice/spiceconn.ts","../../src/spice/cursor.ts","../../src/spice/filexfer.ts","../../src/spice/inputs.ts","../../src/spice/lz.ts","../../src/spice/bitmap.ts","../../src/spice/display.ts","../../src/spice/playback.ts","../../src/spice/port.ts","../../src/spice/resize.ts","../../src/spice/main.ts"],"sourcesContent":["/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nexport const Constants = {\n SPICE_MAGIC: 'REDQ',\n SPICE_VERSION_MAJOR: 2,\n SPICE_VERSION_MINOR: 2,\n\n SPICE_CONNECT_TIMEOUT: (30 * 1000),\n\n SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION: 0,\n SPICE_COMMON_CAP_AUTH_SPICE: 1,\n SPICE_COMMON_CAP_AUTH_SASL: 2,\n SPICE_COMMON_CAP_MINI_HEADER: 3,\n\n SPICE_TICKET_KEY_PAIR_LENGTH: 1024,\n SPICE_TICKET_PUBKEY_BYTES: (1024 / 8 + 34), // (SPICE_TICKET_KEY_PAIR_LENGTH / 8 + 34)\n\n SPICE_LINK_ERR_OK: 0,\n SPICE_LINK_ERR_ERROR: 1,\n SPICE_LINK_ERR_INVALID_MAGIC: 2,\n SPICE_LINK_ERR_INVALID_DATA: 3,\n SPICE_LINK_ERR_VERSION_MISMATCH: 4,\n SPICE_LINK_ERR_NEED_SECURED: 5,\n SPICE_LINK_ERR_NEED_UNSECURED: 6,\n SPICE_LINK_ERR_PERMISSION_DENIED: 7,\n SPICE_LINK_ERR_BAD_CONNECTION_ID: 8,\n SPICE_LINK_ERR_CHANNEL_NOT_AVAILABLE: 9,\n\n SPICE_MSG_MIGRATE: 1,\n SPICE_MSG_MIGRATE_DATA: 2,\n SPICE_MSG_SET_ACK: 3,\n SPICE_MSG_PING: 4,\n SPICE_MSG_WAIT_FOR_CHANNELS: 5,\n SPICE_MSG_DISCONNECTING: 6,\n SPICE_MSG_NOTIFY: 7,\n SPICE_MSG_LIST: 8,\n\n SPICE_MSG_MAIN_MIGRATE_BEGIN: 101,\n SPICE_MSG_MAIN_MIGRATE_CANCEL: 102,\n SPICE_MSG_MAIN_INIT: 103,\n SPICE_MSG_MAIN_CHANNELS_LIST: 104,\n SPICE_MSG_MAIN_MOUSE_MODE: 105,\n SPICE_MSG_MAIN_MULTI_MEDIA_TIME: 106,\n SPICE_MSG_MAIN_AGENT_CONNECTED: 107,\n SPICE_MSG_MAIN_AGENT_DISCONNECTED: 108,\n SPICE_MSG_MAIN_AGENT_DATA: 109,\n SPICE_MSG_MAIN_AGENT_TOKEN: 110,\n SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST: 111,\n SPICE_MSG_MAIN_MIGRATE_END: 112,\n SPICE_MSG_MAIN_NAME: 113,\n SPICE_MSG_MAIN_UUID: 114,\n SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS: 115,\n SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS: 116,\n SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK: 117,\n SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK: 118,\n SPICE_MSG_END_MAIN: 119,\n\n SPICE_MSGC_ACK_SYNC: 1,\n SPICE_MSGC_ACK: 2,\n SPICE_MSGC_PONG: 3,\n SPICE_MSGC_MIGRATE_FLUSH_MARK: 4,\n SPICE_MSGC_MIGRATE_DATA: 5,\n SPICE_MSGC_DISCONNECTING: 6,\n\n SPICE_MSGC_MAIN_CLIENT_INFO: 101,\n SPICE_MSGC_MAIN_MIGRATE_CONNECTED: 102,\n SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR: 103,\n SPICE_MSGC_MAIN_ATTACH_CHANNELS: 104,\n SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST: 105,\n SPICE_MSGC_MAIN_AGENT_START: 106,\n SPICE_MSGC_MAIN_AGENT_DATA: 107,\n SPICE_MSGC_MAIN_AGENT_TOKEN: 108,\n SPICE_MSGC_MAIN_MIGRATE_END: 109,\n SPICE_MSGC_END_MAIN: 110,\n\n SPICE_MSG_DISPLAY_MODE: 101,\n SPICE_MSG_DISPLAY_MARK: 102,\n SPICE_MSG_DISPLAY_RESET: 103,\n SPICE_MSG_DISPLAY_COPY_BITS: 104,\n SPICE_MSG_DISPLAY_INVAL_LIST: 105,\n SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS: 106,\n SPICE_MSG_DISPLAY_INVAL_PALETTE: 107,\n SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES: 108,\n\n SPICE_MSG_DISPLAY_STREAM_CREATE: 122,\n SPICE_MSG_DISPLAY_STREAM_DATA: 123,\n SPICE_MSG_DISPLAY_STREAM_CLIP: 124,\n SPICE_MSG_DISPLAY_STREAM_DESTROY: 125,\n SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL: 126,\n\n SPICE_MSG_DISPLAY_DRAW_FILL: 302,\n SPICE_MSG_DISPLAY_DRAW_OPAQUE: 303,\n SPICE_MSG_DISPLAY_DRAW_COPY: 304,\n SPICE_MSG_DISPLAY_DRAW_BLEND: 305,\n SPICE_MSG_DISPLAY_DRAW_BLACKNESS: 306,\n SPICE_MSG_DISPLAY_DRAW_WHITENESS: 307,\n SPICE_MSG_DISPLAY_DRAW_INVERS: 308,\n SPICE_MSG_DISPLAY_DRAW_ROP3: 309,\n SPICE_MSG_DISPLAY_DRAW_STROKE: 310,\n SPICE_MSG_DISPLAY_DRAW_TEXT: 311,\n SPICE_MSG_DISPLAY_DRAW_TRANSPARENT: 312,\n SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND: 313,\n SPICE_MSG_DISPLAY_SURFACE_CREATE: 314,\n SPICE_MSG_DISPLAY_SURFACE_DESTROY: 315,\n SPICE_MSG_DISPLAY_STREAM_DATA_SIZED: 316,\n SPICE_MSG_DISPLAY_MONITORS_CONFIG: 317,\n SPICE_MSG_DISPLAY_DRAW_COMPOSITE: 318,\n SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT: 319,\n\n SPICE_MSGC_DISPLAY_INIT: 101,\n SPICE_MSGC_DISPLAY_STREAM_REPORT: 102,\n\n SPICE_MSG_INPUTS_INIT: 101,\n SPICE_MSG_INPUTS_KEY_MODIFIERS: 102,\n\n SPICE_MSG_INPUTS_MOUSE_MOTION_ACK: 111,\n\n SPICE_MSGC_INPUTS_KEY_DOWN: 101,\n SPICE_MSGC_INPUTS_KEY_UP: 102,\n SPICE_MSGC_INPUTS_KEY_MODIFIERS: 103,\n\n SPICE_MSGC_INPUTS_MOUSE_MOTION: 111,\n SPICE_MSGC_INPUTS_MOUSE_POSITION: 112,\n SPICE_MSGC_INPUTS_MOUSE_PRESS: 113,\n SPICE_MSGC_INPUTS_MOUSE_RELEASE: 114,\n\n SPICE_MSG_CURSOR_INIT: 101,\n SPICE_MSG_CURSOR_RESET: 102,\n SPICE_MSG_CURSOR_SET: 103,\n SPICE_MSG_CURSOR_MOVE: 104,\n SPICE_MSG_CURSOR_HIDE: 105,\n SPICE_MSG_CURSOR_TRAIL: 106,\n SPICE_MSG_CURSOR_INVAL_ONE: 107,\n SPICE_MSG_CURSOR_INVAL_ALL: 108,\n\n SPICE_MSG_PLAYBACK_DATA: 101,\n SPICE_MSG_PLAYBACK_MODE: 102,\n SPICE_MSG_PLAYBACK_START: 103,\n SPICE_MSG_PLAYBACK_STOP: 104,\n SPICE_MSG_PLAYBACK_VOLUME: 105,\n SPICE_MSG_PLAYBACK_MUTE: 106,\n SPICE_MSG_PLAYBACK_LATENCY: 107,\n\n SPICE_MSG_SPICEVMC_DATA: 101,\n SPICE_MSG_PORT_INIT: 201,\n SPICE_MSG_PORT_EVENT: 202,\n SPICE_MSG_END_PORT: 203,\n\n SPICE_MSGC_SPICEVMC_DATA: 101,\n SPICE_MSGC_PORT_EVENT: 201,\n SPICE_MSGC_END_PORT: 202,\n\n SPICE_PLAYBACK_CAP_CELT_0_5_1: 0,\n SPICE_PLAYBACK_CAP_VOLUME: 1,\n SPICE_PLAYBACK_CAP_LATENCY: 2,\n SPICE_PLAYBACK_CAP_OPUS: 3,\n\n SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE: 0,\n SPICE_MAIN_CAP_NAME_AND_UUID: 1,\n SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS: 2,\n SPICE_MAIN_CAP_SEAMLESS_MIGRATE: 3,\n\n SPICE_DISPLAY_CAP_SIZED_STREAM: 0,\n SPICE_DISPLAY_CAP_MONITORS_CONFIG: 1,\n SPICE_DISPLAY_CAP_COMPOSITE: 2,\n SPICE_DISPLAY_CAP_A8_SURFACE: 3,\n SPICE_DISPLAY_CAP_STREAM_REPORT: 4,\n SPICE_DISPLAY_CAP_LZ4_COMPRESSION: 5,\n SPICE_DISPLAY_CAP_PREF_COMPRESSION: 6,\n SPICE_DISPLAY_CAP_GL_SCANOUT: 7,\n SPICE_DISPLAY_CAP_MULTI_CODEC: 8,\n SPICE_DISPLAY_CAP_CODEC_MJPEG: 9,\n SPICE_DISPLAY_CAP_CODEC_VP8: 10,\n\n SPICE_AUDIO_DATA_MODE_INVALID: 0,\n SPICE_AUDIO_DATA_MODE_RAW: 1,\n SPICE_AUDIO_DATA_MODE_CELT_0_5_1: 2,\n SPICE_AUDIO_DATA_MODE_OPUS: 3,\n\n SPICE_AUDIO_FMT_INVALID: 0,\n SPICE_AUDIO_FMT_S16: 1,\n\n SPICE_CHANNEL_MAIN: 1,\n SPICE_CHANNEL_DISPLAY: 2,\n SPICE_CHANNEL_INPUTS: 3,\n SPICE_CHANNEL_CURSOR: 4,\n SPICE_CHANNEL_PLAYBACK: 5,\n SPICE_CHANNEL_RECORD: 6,\n SPICE_CHANNEL_TUNNEL: 7,\n SPICE_CHANNEL_SMARTCARD: 8,\n SPICE_CHANNEL_USBREDIR: 9,\n SPICE_CHANNEL_PORT: 10,\n SPICE_CHANNEL_WEBDAV: 11,\n\n SPICE_SURFACE_FLAGS_PRIMARY: (1 << 0),\n\n SPICE_NOTIFY_SEVERITY_INFO: 0,\n SPICE_NOTIFY_SEVERITY_WARN: 1,\n SPICE_NOTIFY_SEVERITY_ERROR: 2,\n\n SPICE_MOUSE_MODE_SERVER: (1 << 0),\n SPICE_MOUSE_MODE_CLIENT: (1 << 1),\n SPICE_MOUSE_MODE_MASK: 0x3,\n\n SPICE_CLIP_TYPE_NONE: 0,\n SPICE_CLIP_TYPE_RECTS: 1,\n\n SPICE_IMAGE_TYPE_BITMAP: 0,\n SPICE_IMAGE_TYPE_QUIC: 1,\n SPICE_IMAGE_TYPE_RESERVED: 2,\n SPICE_IMAGE_TYPE_LZ_PLT: 100,\n SPICE_IMAGE_TYPE_LZ_RGB: 101,\n SPICE_IMAGE_TYPE_GLZ_RGB: 102,\n SPICE_IMAGE_TYPE_LZ4_RGB: 103,\n SPICE_IMAGE_TYPE_FROM_CACHE: 104,\n SPICE_IMAGE_TYPE_SURFACE: 105,\n SPICE_IMAGE_TYPE_JPEG: 106,\n SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS: 107,\n SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB: 108,\n SPICE_IMAGE_TYPE_JPEG_ALPHA: 109,\n SPICE_IMAGE_TYPE_LZ4: 110,\n\n SPICE_IMAGE_FLAGS_CACHE_ME: (1 << 0),\n SPICE_IMAGE_FLAGS_HIGH_BITS_SET: (1 << 1),\n SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME: (1 << 2),\n\n SPICE_BITMAP_FLAGS_PAL_CACHE_ME: (1 << 0),\n SPICE_BITMAP_FLAGS_PAL_FROM_CACHE: (1 << 1),\n SPICE_BITMAP_FLAGS_TOP_DOWN: (1 << 2),\n SPICE_BITMAP_FLAGS_MASK: 0x7,\n\n SPICE_BITMAP_FMT_INVALID: 0,\n SPICE_BITMAP_FMT_1BIT_LE: 1,\n SPICE_BITMAP_FMT_1BIT_BE: 2,\n SPICE_BITMAP_FMT_4BIT_LE: 3,\n SPICE_BITMAP_FMT_4BIT_BE: 4,\n SPICE_BITMAP_FMT_8BIT: 5,\n SPICE_BITMAP_FMT_16BIT: 6,\n SPICE_BITMAP_FMT_24BIT: 7,\n SPICE_BITMAP_FMT_32BIT: 8,\n SPICE_BITMAP_FMT_RGBA: 9,\n\n SPICE_CURSOR_FLAGS_NONE: (1 << 0),\n SPICE_CURSOR_FLAGS_CACHE_ME: (1 << 1),\n SPICE_CURSOR_FLAGS_FROM_CACHE: (1 << 2),\n SPICE_CURSOR_FLAGS_MASK: 0x7,\n\n SPICE_MOUSE_BUTTON_MASK_LEFT: (1 << 0),\n SPICE_MOUSE_BUTTON_MASK_MIDDLE: (1 << 1),\n SPICE_MOUSE_BUTTON_MASK_RIGHT: (1 << 2),\n SPICE_MOUSE_BUTTON_MASK_MASK: 0x7,\n\n SPICE_MOUSE_BUTTON_INVALID: 0,\n SPICE_MOUSE_BUTTON_LEFT: 1,\n SPICE_MOUSE_BUTTON_MIDDLE: 2,\n SPICE_MOUSE_BUTTON_RIGHT: 3,\n SPICE_MOUSE_BUTTON_UP: 4,\n SPICE_MOUSE_BUTTON_DOWN: 5,\n\n SPICE_BRUSH_TYPE_NONE: 0,\n SPICE_BRUSH_TYPE_SOLID: 1,\n SPICE_BRUSH_TYPE_PATTERN: 2,\n\n SPICE_SURFACE_FMT_INVALID: 0,\n SPICE_SURFACE_FMT_1_A: 1,\n SPICE_SURFACE_FMT_8_A: 8,\n SPICE_SURFACE_FMT_16_555: 16,\n SPICE_SURFACE_FMT_32_xRGB: 32,\n SPICE_SURFACE_FMT_16_565: 80,\n SPICE_SURFACE_FMT_32_ARGB: 96,\n\n SPICE_ROPD_INVERS_SRC: (1 << 0),\n SPICE_ROPD_INVERS_BRUSH: (1 << 1),\n SPICE_ROPD_INVERS_DEST: (1 << 2),\n SPICE_ROPD_OP_PUT: (1 << 3),\n SPICE_ROPD_OP_OR: (1 << 4),\n SPICE_ROPD_OP_AND: (1 << 5),\n SPICE_ROPD_OP_XOR: (1 << 6),\n SPICE_ROPD_OP_BLACKNESS: (1 << 7),\n SPICE_ROPD_OP_WHITENESS: (1 << 8),\n SPICE_ROPD_OP_INVERS: (1 << 9),\n SPICE_ROPD_INVERS_RES: (1 << 10),\n SPICE_ROPD_MASK: 0x7ff,\n\n LZ_IMAGE_TYPE_INVALID: 0,\n LZ_IMAGE_TYPE_PLT1_LE: 1,\n LZ_IMAGE_TYPE_PLT1_BE: 2,\n LZ_IMAGE_TYPE_PLT4_LE: 3,\n LZ_IMAGE_TYPE_PLT4_BE: 4,\n LZ_IMAGE_TYPE_PLT8: 5,\n LZ_IMAGE_TYPE_RGB16: 6,\n LZ_IMAGE_TYPE_RGB24: 7,\n LZ_IMAGE_TYPE_RGB32: 8,\n LZ_IMAGE_TYPE_RGBA: 9,\n LZ_IMAGE_TYPE_XXXA: 10,\n\n LZ_IMAGE_TYPE_LZ4_PLT1_LE: 21,\n LZ_IMAGE_TYPE_LZ4_PLT1_BE: 22,\n LZ_IMAGE_TYPE_LZ4_PLT4_LE: 23,\n LZ_IMAGE_TYPE_LZ4_PLT4_BE: 24,\n LZ_IMAGE_TYPE_LZ4_PLT8: 25,\n LZ_IMAGE_TYPE_LZ4_RGB16: 26,\n LZ_IMAGE_TYPE_LZ4_RGB24: 27,\n LZ_IMAGE_TYPE_LZ4_RGB32: 28,\n LZ_IMAGE_TYPE_LZ4_RGBA: 29,\n LZ_IMAGE_TYPE_LZ4_XXXA: 30,\n\n SPICE_INPUT_MOTION_ACK_BUNCH: 4,\n\n SPICE_CURSOR_TYPE_ALPHA: 0,\n SPICE_CURSOR_TYPE_MONO: 1,\n SPICE_CURSOR_TYPE_COLOR4: 2,\n SPICE_CURSOR_TYPE_COLOR8: 3,\n SPICE_CURSOR_TYPE_COLOR16: 4,\n SPICE_CURSOR_TYPE_COLOR24: 5,\n SPICE_CURSOR_TYPE_COLOR32: 6,\n\n SPICE_VIDEO_CODEC_TYPE_MJPEG: 1,\n SPICE_VIDEO_CODEC_TYPE_VP8: 2,\n\n VD_AGENT_PROTOCOL: 1,\n VD_AGENT_MAX_DATA_SIZE: 2048,\n\n VD_AGENT_MOUSE_STATE: 1,\n VD_AGENT_MONITORS_CONFIG: 2,\n VD_AGENT_REPLY: 3,\n VD_AGENT_CLIPBOARD: 4,\n VD_AGENT_DISPLAY_CONFIG: 5,\n VD_AGENT_ANNOUNCE_CAPABILITIES: 6,\n VD_AGENT_CLIPBOARD_GRAB: 7,\n VD_AGENT_CLIPBOARD_REQUEST: 8,\n VD_AGENT_CLIPBOARD_RELEASE: 9,\n VD_AGENT_FILE_XFER_START: 10,\n VD_AGENT_FILE_XFER_STATUS: 11,\n VD_AGENT_FILE_XFER_DATA: 12,\n VD_AGENT_CLIENT_DISCONNECTED: 13,\n VD_AGENT_MAX_CLIPBOARD: 14,\n\n VD_AGENT_CAP_MOUSE_STATE: 0,\n VD_AGENT_CAP_MONITORS_CONFIG: 1,\n VD_AGENT_CAP_REPLY: 2,\n VD_AGENT_CAP_CLIPBOARD: 3,\n VD_AGENT_CAP_DISPLAY_CONFIG: 4,\n VD_AGENT_CAP_CLIPBOARD_BY_DEMAND: 5,\n VD_AGENT_CAP_CLIPBOARD_SELECTION: 6,\n VD_AGENT_CAP_SPARSE_MONITORS_CONFIG: 7,\n VD_AGENT_CAP_GUEST_LINEEND_LF: 8,\n VD_AGENT_CAP_GUEST_LINEEND_CRLF: 9,\n VD_AGENT_CAP_MAX_CLIPBOARD: 10,\n VD_AGENT_END_CAP: 11,\n\n VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA: 0,\n VD_AGENT_FILE_XFER_STATUS_CANCELLED: 1,\n VD_AGENT_FILE_XFER_STATUS_ERROR: 2,\n VD_AGENT_FILE_XFER_STATUS_SUCCESS: 3,\n\n VD_AGENT_CLIPBOARD_NONE: 0,\n VD_AGENT_CLIPBOARD_UTF8_TEXT: 1,\n VD_AGENT_CLIPBOARD_IMAGE_PNG: 2,\n VD_AGENT_CLIPBOARD_IMAGE_BMP: 3,\n VD_AGENT_CLIPBOARD_IMAGE_TIFF: 4,\n VD_AGENT_CLIPBOARD_IMAGE_JPG: 5\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** SpiceDataView\n** FIXME FIXME\n** This is used because Firefox does not have DataView yet.\n** We should use DataView if we have it, because it *has* to\n** be faster than this code\n**-------------------------------------------------------------------------- */\nexport class SpiceDataView {\n u8: Uint8Array\n\n constructor (buffer: ArrayBuffer, byteOffset?: number, byteLength?: number) {\n if (byteOffset !== undefined) {\n if (byteLength !== undefined) {\n this.u8 = new Uint8Array(buffer, byteOffset, byteLength)\n } else {\n this.u8 = new Uint8Array(buffer, byteOffset)\n }\n } else {\n this.u8 = new Uint8Array(buffer)\n }\n }\n\n getUint8 (byteOffset: number, _littleEndian?: boolean): number {\n return this.u8[byteOffset]\n }\n\n getUint16 (byteOffset: number, littleEndian?: boolean): number {\n let low = 1; let high = 0\n if (littleEndian) {\n low = 0\n high = 1\n }\n\n return (this.u8[byteOffset + high] << 8) | this.u8[byteOffset + low]\n }\n\n getUint32 (byteOffset: number, littleEndian?: boolean): number {\n let low = 2; let high = 0\n if (littleEndian) {\n low = 0\n high = 2\n }\n\n return (this.getUint16(byteOffset + high, littleEndian) << 16) |\n this.getUint16(byteOffset + low, littleEndian)\n }\n\n getUint64 (byteOffset: number, littleEndian?: boolean): number {\n let low = 4; let high = 0\n if (littleEndian) {\n low = 0\n high = 4\n }\n\n return (this.getUint32(byteOffset + high, littleEndian) << 32) |\n this.getUint32(byteOffset + low, littleEndian)\n }\n\n setUint8 (byteOffset: number, b: number, _littleEndian?: boolean): void {\n this.u8[byteOffset] = (b & 0xff)\n }\n\n setUint16 (byteOffset: number, i: number, littleEndian?: boolean): void {\n let low = 1; let high = 0\n if (littleEndian) {\n low = 0\n high = 1\n }\n this.u8[byteOffset + high] = (i & 0xffff) >> 8\n this.u8[byteOffset + low] = (i & 0x00ff)\n }\n\n setUint32 (byteOffset: number, w: number, littleEndian?: boolean): void {\n let low = 2; let high = 0\n if (littleEndian) {\n low = 0\n high = 2\n }\n\n this.setUint16(byteOffset + high, (w & 0xffffffff) >> 16, littleEndian)\n this.setUint16(byteOffset + low, (w & 0x0000ffff), littleEndian)\n }\n\n setUint64 (byteOffset: number, w: number, littleEndian?: boolean): void {\n let low = 4; let high = 0\n if (littleEndian) {\n low = 0\n high = 4\n }\n\n this.setUint32(byteOffset + high, (w & 0xffffffffffffffff) >> 32, littleEndian)\n this.setUint32(byteOffset + low, (w & 0x00000000ffffffff), littleEndian)\n }\n}\n","// Downloaded from http://www-cs-students.stanford.edu/~tjw/jsbn/ by Jeremy White on 6/1/2012\n\n/*\n * Copyright (c) 2003-2005 Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n\n// Basic JavaScript BN library - subset useful for RSA encryption.\n\n// Bits per digit\nlet dbits: number\n\n// JavaScript engine analysis\nconst canary = 0xdeadbeefcafe\nconst j_lm = ((canary & 0xffffff) == 0xefcafe)\n\n// (public) Constructor\nexport class BigInteger {\n t: number\n s: number;\n [index: number]: number;\n\n static ZERO: BigInteger\n static ONE: BigInteger\n static RM: string\n static RC: number[]\n\n DB: number\n DM: number\n DV: number\n FV: number\n F1: number\n F2: number\n\n // (protected) am: Compute w_j += (x*this_i), propagate carries,\n // c is initial carry, returns final carry.\n am: (i: number, x: number, w: BigInteger, j: number, c: number, n: number) => number\n\n constructor (a?: any, b?: number, c?: any) {\n if (a != null) {\n if (typeof a === 'number') {\n this.fromNumber(a, b, c)\n } else if (b == null && typeof a !== 'string') {\n this.fromString(a, 256)\n } else {\n this.fromString(a, b)\n }\n }\n }\n\n // (protected) copy this to r\n copyTo (r: BigInteger) {\n for (let i = this.t - 1; i >= 0; --i) r[i] = this[i]\n r.t = this.t\n r.s = this.s\n }\n\n // (protected) set from integer value x, -DV <= x < DV\n fromInt (x: number) {\n this.t = 1\n this.s = (x < 0) ? -1 : 0\n if (x > 0) this[0] = x\n else if (x < -1) this[0] = x + this.DV\n else this.t = 0\n }\n\n // (protected) set from string and radix\n fromString (s: string | number[], b: number) {\n let k: number\n if (b == 16) k = 4\n else if (b == 8) k = 3\n else if (b == 256) k = 8 // byte array\n else if (b == 2) k = 1\n else if (b == 32) k = 5\n else if (b == 4) k = 2\n else {\n this.fromRadix(s as string, b)\n return\n }\n this.t = 0\n this.s = 0\n let i = s.length; let mi = false; let sh = 0\n while (--i >= 0) {\n const x = (k == 8) ? ((s as number[])[i] & 0xff) : this.intAt(s as string, i)\n if (x < 0) {\n if ((s as string).charAt(i) == '-') mi = true\n continue\n }\n mi = false\n if (sh == 0) {\n this[this.t++] = x\n } else if (sh + k > this.DB) {\n this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh\n this[this.t++] = (x >> (this.DB - sh))\n } else {\n this[this.t - 1] |= x << sh\n }\n sh += k\n if (sh >= this.DB) sh -= this.DB\n }\n if (k == 8 && ((s as number[])[0] & 0x80) != 0) {\n this.s = -1\n if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh\n }\n this.clamp()\n if (mi) BigInteger.ZERO.subTo(this, this)\n }\n\n // (protected) clamp off excess high words\n clamp () {\n const c = this.s & this.DM\n while (this.t > 0 && this[this.t - 1] == c) --this.t\n }\n\n // (public) return string representation in given radix\n toString (b: number): string {\n if (this.s < 0) return '-' + this.negate().toString(b)\n let k: number\n if (b == 16) k = 4\n else if (b == 8) k = 3\n else if (b == 2) k = 1\n else if (b == 32) k = 5\n else if (b == 4) k = 2\n else return this.toRadix(b)\n const km = (1 << k) - 1\n let d: number | undefined\n let i = this.t\n let p = this.DB - (i * this.DB) % k\n let result = ''\n if (i-- > 0) {\n if (p < this.DB && (d = this[i] >> p) > 0) {\n result += this.int2char(d)\n }\n while (i >= 0) {\n if (p < k) {\n d = (this[i] & ((1 << p) - 1)) << (k - p)\n d |= this[--i] >> (p += this.DB - k)\n } else {\n d = (this[i] >> (p -= k)) & km\n if (p <= 0) { p += this.DB; --i }\n }\n if (d > 0 || result.length > 0) {\n result += this.int2char(d)\n }\n }\n }\n return result.length > 0 ? result : '0'\n }\n\n // (public) -this\n negate (): BigInteger {\n const r = this.nbi()\n BigInteger.ZERO.subTo(this, r)\n return r\n }\n\n // (public) |this|\n abs (): BigInteger {\n return (this.s < 0) ? this.negate() : this\n }\n\n // (public) return + if this > a, - if this < a, 0 if equal\n compareTo (a: BigInteger): number {\n const r = this.s - a.s\n if (r != 0) return r\n const i = this.t\n const r2 = i - a.t\n if (r2 != 0) return r2\n for (let j = i - 1; j >= 0; j--) {\n const r3 = this[j] - a[j]\n if (r3 != 0) return r3\n }\n return 0\n }\n\n // (public) return the number of bits in \"this\"\n bitLength (): number {\n if (this.t <= 0) return 0\n return this.DB * (this.t - 1) + this.nbits(this[this.t - 1] ^ (this.s & this.DM))\n }\n\n // (protected) r = this << n*DB\n dlShiftTo (n: number, r: BigInteger) {\n for (let i = this.t - 1; i >= 0; --i) r[i + n] = this[i]\n for (let i = n - 1; i >= 0; --i) r[i] = 0\n r.t = this.t + n\n r.s = this.s\n }\n\n // (protected) r = this >> n*DB\n drShiftTo (n: number, r: BigInteger) {\n for (let i = n; i < this.t; ++i) r[i - n] = this[i]\n r.t = Math.max(this.t - n, 0)\n r.s = this.s\n }\n\n // (protected) r = this << n\n lShiftTo (n: number, r: BigInteger) {\n const bs = n % this.DB\n const cbs = this.DB - bs\n const bm = (1 << cbs) - 1\n const ds = Math.floor(n / this.DB)\n let c = (this.s << bs) & this.DM\n for (let i = this.t - 1; i >= 0; --i) {\n r[i + ds + 1] = (this[i] >> cbs) | c\n c = (this[i] & bm) << bs\n }\n for (let i = ds - 1; i >= 0; --i) r[i] = 0\n r[ds] = c\n r.t = this.t + ds + 1\n r.s = this.s\n r.clamp()\n }\n\n // (protected) r = this >> n\n rShiftTo (n: number, r: BigInteger) {\n r.s = this.s\n const ds = Math.floor(n / this.DB)\n if (ds >= this.t) { r.t = 0; return }\n const bs = n % this.DB\n const cbs = this.DB - bs\n const bm = (1 << bs) - 1\n r[0] = this[ds] >> bs\n for (let i = ds + 1; i < this.t; ++i) {\n r[i - ds - 1] |= (this[i] & bm) << cbs\n r[i - ds] = this[i] >> bs\n }\n if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs\n r.t = this.t - ds\n r.clamp()\n }\n\n // (protected) r = this - a\n subTo (a: BigInteger, r: BigInteger) {\n let i = 0; let c = 0; const m = Math.min(a.t, this.t)\n while (i < m) {\n c += this[i] - a[i]\n r[i++] = c & this.DM\n c >>= this.DB\n }\n if (a.t < this.t) {\n c -= a.s\n while (i < this.t) {\n c += this[i]\n r[i++] = c & this.DM\n c >>= this.DB\n }\n c += this.s\n } else {\n c += this.s\n while (i < a.t) {\n c -= a[i]\n r[i++] = c & this.DM\n c >>= this.DB\n }\n c -= a.s\n }\n r.s = (c < 0) ? -1 : 0\n if (c < -1) r[i++] = this.DV + c\n else if (c > 0) r[i++] = c\n r.t = i\n r.clamp()\n }\n\n // (protected) r = this * a, r != this,a (HAC 14.12)\n // \"this\" should be the larger one if appropriate.\n multiplyTo (a: BigInteger, r: BigInteger) {\n const x = this.abs()\n const y = a.abs()\n const i = x.t\n r.t = i + y.t\n for (let j = r.t - 1; j >= 0; --j) r[j] = 0\n for (let j = 0; j < y.t; ++j) r[j + x.t] = x.am(0, y[j], r, j, 0, x.t)\n r.s = 0\n r.clamp()\n if (this.s != a.s) BigInteger.ZERO.subTo(r, r)\n }\n\n // (protected) r = this^2, r != this (HAC 14.16)\n squareTo (r: BigInteger) {\n const x = this.abs()\n let i = r.t = 2 * x.t\n for (let j = i - 1; j >= 0; --j) r[j] = 0\n for (i = 0; i < x.t - 1; ++i) {\n const c = x.am(i, x[i], r, 2 * i, 0, 1)\n if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {\n r[i + x.t] -= x.DV\n r[i + x.t + 1] = 1\n }\n }\n if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1)\n r.s = 0\n r.clamp()\n }\n\n // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n // r != q, this != m. q or r may be null.\n divRemTo (m: BigInteger, q: BigInteger | null, r: BigInteger | null) {\n const pm = m.abs()\n if (pm.t <= 0) return\n const pt = this.abs()\n if (pt.t < pm.t) {\n if (q != null) q.fromInt(0)\n if (r != null) this.copyTo(r)\n return\n }\n if (r == null) r = this.nbi()\n const y = this.nbi(); const ts = this.s; const ms = m.s\n const nsh = this.DB - this.nbits(pm[pm.t - 1])\n if (nsh > 0) { pm.lShiftTo(nsh, y); pt.lShiftTo(nsh, r) } else { pm.copyTo(y); pt.copyTo(r) }\n const ys = y.t\n const y0 = y[ys - 1]\n if (y0 == 0) return\n const yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0)\n const d1 = this.FV / yt; const d2 = (1 << this.F1) / yt; const e = 1 << this.F2\n let i = r.t; let j = i - ys; const t = (q == null) ? this.nbi() : q\n y.dlShiftTo(j, t)\n if (r.compareTo(t) >= 0) {\n r[r.t++] = 1\n r.subTo(t, r)\n }\n BigInteger.ONE.dlShiftTo(ys, t)\n t.subTo(y, y)\n while (y.t < ys) y[y.t++] = 0\n while (--j >= 0) {\n let qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2)\n if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) {\n y.dlShiftTo(j, t)\n r.subTo(t, r)\n while (r[i] < --qd) r.subTo(t, r)\n }\n }\n if (q != null) {\n r.drShiftTo(ys, q)\n if (ts != ms) BigInteger.ZERO.subTo(q, q)\n }\n r.t = ys\n r.clamp()\n if (nsh > 0) r.rShiftTo(nsh, r)\n if (ts < 0) BigInteger.ZERO.subTo(r, r)\n }\n\n // (public) this mod a\n mod (a: BigInteger): BigInteger {\n const r = this.nbi()\n this.abs().divRemTo(a, null, r)\n if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r)\n return r\n }\n\n // Modular reduction using \"classic\" algorithm\n // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n invDigit (): number {\n if (this.t < 1) return 0\n const x = this[0]\n if ((x & 1) == 0) return 0\n let y = x & 3\n y = (y * (2 - (x & 0xf) * y)) & 0xf\n y = (y * (2 - (x & 0xff) * y)) & 0xff\n y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff\n y = (y * (2 - x * y % this.DV)) % this.DV\n return (y > 0) ? this.DV - y : -y\n }\n\n // (protected) true iff this is even\n isEven (): boolean {\n return ((this.t > 0) ? (this[0] & 1) : this.s) == 0\n }\n\n // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n exp (e: number, z: any): BigInteger {\n if (e > 0xffffffff || e < 1) return BigInteger.ONE\n let r = this.nbi(); let r2 = this.nbi(); const g = z.convert(this); let i = this.nbits(e) - 1\n g.copyTo(r)\n while (--i >= 0) {\n z.sqrTo(r, r2)\n if ((e & (1 << i)) > 0) z.mulTo(r2, g, r)\n else { const t = r; r = r2; r2 = t }\n }\n return z.revert(r)\n }\n\n // (public) this^e % m, 0 <= e < 2^32\n modPowInt (e: number, m: BigInteger): BigInteger {\n let z\n if (e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m)\n return this.exp(e, z)\n }\n\n // (public) this * a\n multiply (a: BigInteger): BigInteger {\n const r = this.nbi()\n this.multiplyTo(a, r)\n return r\n }\n\n // (public) this + a\n add (a: BigInteger): BigInteger {\n const r = this.nbi()\n this.addTo(a, r)\n return r\n }\n\n // (protected) return new, unset BigInteger\n nbi (): BigInteger {\n return new BigInteger()\n }\n\n // returns bit length of the integer x\n nbits (x: number): number {\n let r = 1; let t: number\n if ((t = x >>> 16) != 0) { x = t; r += 16 }\n if ((t = x >> 8) != 0) { x = t; r += 8 }\n if ((t = x >> 4) != 0) { x = t; r += 4 }\n if ((t = x >> 2) != 0) { x = t; r += 2 }\n if ((t = x >> 1) != 0) { x = t; r += 1 }\n return r\n }\n\n // (protected) from Radix\n fromRadix (s: string, b: number) {\n this.t = 0\n this.s = 0\n let i = 0\n let isNegative = false\n\n // Check for negative sign\n if (s.length > 0 && s.charAt(0) === '-') {\n isNegative = true\n i = 1\n }\n\n // Create a temporary BigInteger to hold the base\n const base = new BigInteger(b)\n\n // Process each character\n for (; i < s.length; i++) {\n const c = this.intAt(s, i)\n if (c < 0 || c >= b) continue\n\n // Multiply current value by base\n if (this.t > 0) {\n const temp = this.nbi()\n this.multiplyTo(base, temp)\n temp.copyTo(this)\n }\n\n // Add the current digit\n if (this.t === 0) {\n this.fromInt(c)\n } else {\n const digit = new BigInteger(c)\n const temp = this.nbi()\n this.addTo(digit, temp)\n temp.copyTo(this)\n }\n }\n\n if (isNegative) {\n BigInteger.ZERO.subTo(this, this)\n }\n }\n\n // (protected) r = this + a\n addTo (a: BigInteger, r: BigInteger) {\n let i = 0; let c = 0; const m = Math.min(a.t, this.t)\n while (i < m) {\n c += this[i] + a[i]\n r[i++] = c & this.DM\n c >>= this.DB\n }\n\n if (a.t < this.t) {\n c += a.s\n while (i < this.t) {\n c += this[i]\n r[i++] = c & this.DM\n c >>= this.DB\n }\n c += this.s\n } else {\n c += this.s\n while (i < a.t) {\n c += a[i]\n r[i++] = c & this.DM\n c >>= this.DB\n }\n c += a.s\n }\n\n r.s = (c < 0) ? -1 : 0\n if (c > 0) {\n r[i++] = c\n } else if (c < -1) {\n r[i++] = this.DV + c\n }\n\n r.t = i\n r.clamp()\n }\n\n // (protected) to Radix\n toRadix (b: number): string {\n if (this.signum() == 0) return '0'\n const isNeg = this.signum() < 0\n const num = this.nbi()\n this.copyTo(num)\n if (isNeg) BigInteger.ZERO.subTo(num, num)\n const charBuf = []\n const q = this.nbi()\n const r = this.nbi()\n const d = new BigInteger(b)\n while (num.compareTo(d) >= 0) {\n num.divRemTo(d, q, r)\n charBuf.push(this.int2char(r[0]))\n q.copyTo(num)\n }\n charBuf.push(this.int2char(num[0]))\n if (isNeg) charBuf.push('-')\n charBuf.reverse()\n return charBuf.join('')\n }\n\n // (protected) signum\n signum (): number {\n if (this.s < 0) return -1\n if (this.t <= 0) return 0\n return 1\n }\n\n // (protected) dMultiply\n dMultiply (x: number) {\n if (this.t === 0) {\n if (x > 0) {\n this[0] = x\n this.t = 1\n }\n return\n }\n let c = 0\n for (let i = 0; i < this.t; i++) {\n const v = this[i] * x + c\n this[i] = v & this.DM\n c = v / this.DV\n }\n if (c > 0) this[this.t++] = c\n this.clamp()\n }\n\n // (protected) int2char\n int2char (n: number): string {\n return BigInteger.RM.charAt(n)\n }\n\n // (protected) intAt\n intAt (s: string, i: number): number {\n const c = BigInteger.RC[s.charCodeAt(i)]\n return (c == null) ? -1 : c\n }\n\n // (protected) from Number\n fromNumber (a: number, b: any, c: any) {\n this.t = 1\n this.s = (a < 0) ? -1 : 0\n if (a > 0) {\n this[0] = a\n } else if (a < -1) {\n this[0] = a + this.DV\n } else {\n this.t = 0\n }\n }\n}\n\n// Bits per digit\nif (typeof navigator !== 'undefined') {\n if (j_lm && (navigator.appName == 'Microsoft Internet Explorer')) {\n dbits = 30\n } else if (j_lm && (navigator.appName != 'Netscape')) {\n dbits = 26\n } else {\n dbits = 28\n }\n} else {\n // Default for non-browser environments (e.g., Node.js)\n dbits = 28\n}\n\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1 (i: number, x: number, w: BigInteger, j: number, c: number, n: number): number {\n while (--n >= 0) {\n const v = x * this[i++] + w[j] + c\n c = Math.floor(v / 0x4000000)\n w[j++] = v & 0x3ffffff\n }\n return c\n}\n\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2 (i: number, x: number, w: BigInteger, j: number, c: number, n: number): number {\n const xl = x & 0x7fff; const xh = x >> 15\n while (--n >= 0) {\n let l = this[i] & 0x7fff\n const h = this[i++] >> 15\n const m = xh * l + h * xl\n l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff)\n c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30)\n w[j++] = l & 0x3fffffff\n }\n return c\n}\n\n// am3: Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3 (i: number, x: number, w: BigInteger, j: number, c: number, n: number): number {\n const xl = x & 0x3fff; const xh = x >> 14\n while (--n >= 0) {\n let l = this[i] & 0x3fff\n const h = this[i++] >> 14\n const m = xh * l + h * xl\n l = xl * l + ((m & 0x3fff) << 14) + w[j] + c\n c = (l >> 28) + (m >> 14) + xh * h\n w[j++] = l & 0xfffffff\n }\n return c\n}\n\n// Set the correct am function based on dbits\nif (dbits == 26) {\n BigInteger.prototype.am = am1\n} else if (dbits == 30) {\n BigInteger.prototype.am = am2\n} else {\n BigInteger.prototype.am = am3\n}\n\n// Set properties on the prototype\nBigInteger.prototype.DB = dbits\nBigInteger.prototype.DM = ((1 << dbits) - 1)\nBigInteger.prototype.DV = (1 << dbits)\n\nconst BI_FP = 52\nBigInteger.prototype.FV = Math.pow(2, BI_FP)\nBigInteger.prototype.F1 = BI_FP - dbits\nBigInteger.prototype.F2 = 2 * dbits - BI_FP\n\n// Digit conversions\nBigInteger.RM = '0123456789abcdefghijklmnopqrstuvwxyz'\nBigInteger.RC = []\nlet rr = '0'.charCodeAt(0)\nfor (let vv = 0; vv <= 9; ++vv) BigInteger.RC[rr++] = vv\nrr = 'a'.charCodeAt(0)\nfor (let vv = 10; vv < 36; ++vv) BigInteger.RC[rr++] = vv\nrr = 'A'.charCodeAt(0)\nfor (let vv = 10; vv < 36; ++vv) BigInteger.RC[rr++] = vv\n\n// return new, unset BigInteger\nfunction nbi () { return new BigInteger() }\n\n// return bigint initialized to value\nfunction nbv (i: number): BigInteger { const r = nbi(); r.fromInt(i); return r }\n\n// Classic reduction\nclass Classic {\n m: BigInteger\n\n constructor (m: BigInteger) {\n this.m = m\n }\n\n convert (x: BigInteger): BigInteger {\n if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m)\n else return x\n }\n\n revert (x: BigInteger): BigInteger {\n return x\n }\n\n reduce (x: BigInteger) {\n x.divRemTo(this.m, null, x)\n }\n\n mulTo (x: BigInteger, y: BigInteger, r: BigInteger) {\n x.multiplyTo(y, r)\n this.reduce(r)\n }\n\n sqrTo (x: BigInteger, r: BigInteger) {\n x.squareTo(r)\n this.reduce(r)\n }\n}\n\n// Montgomery reduction\nclass Montgomery {\n m: BigInteger\n mp: number\n mpl: number\n mph: number\n um: number\n mt2: number\n\n constructor (m: BigInteger) {\n this.m = m\n this.mp = m.invDigit()\n this.mpl = this.mp & 0x7fff\n this.mph = this.mp >> 15\n this.um = (1 << (m.DB - 15)) - 1\n this.mt2 = 2 * m.t\n }\n\n convert (x: BigInteger): BigInteger {\n const r = nbi()\n x.abs().dlShiftTo(this.m.t, r)\n r.divRemTo(this.m, null, r)\n if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r)\n return r\n }\n\n revert (x: BigInteger): BigInteger {\n const r = nbi()\n x.copyTo(r)\n this.reduce(r)\n return r\n }\n\n reduce (x: BigInteger) {\n while (x.t <= this.mt2) x[x.t++] = 0\n for (let i = 0; i < this.m.t; ++i) {\n const j = x[i] & 0x7fff\n const u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & this.m.DM\n let j2 = i + this.m.t\n x[j2] += this.m.am(0, u0, x, i, 0, this.m.t)\n while (x[j2] >= this.m.DV) { x[j2] -= this.m.DV; x[++j2]++ }\n }\n x.clamp()\n x.drShiftTo(this.m.t, x)\n if (x.compareTo(this.m) >= 0) x.subTo(this.m, x)\n }\n\n sqrTo (x: BigInteger, r: BigInteger) {\n x.squareTo(r)\n this.reduce(r)\n }\n\n mulTo (x: BigInteger, y: BigInteger, r: BigInteger) {\n x.multiplyTo(y, r)\n this.reduce(r)\n }\n}\n\n// \"constants\"\nBigInteger.ZERO = nbv(0)\nBigInteger.ONE = nbv(1)\n","// Downloaded from http://www-cs-students.stanford.edu/~tjw/jsbn/ by Jeremy White on 6/1/2012\n\n/*\n * Copyright (c) 2003-2005 Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n\n// prng4.js - uses Arcfour as a PRNG\n\nclass Arcfour {\n i: number\n j: number\n S: number[]\n\n constructor () {\n this.i = 0\n this.j = 0\n this.S = []\n }\n\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n init (key: number[]) {\n let i, j, t\n for (i = 0; i < 256; ++i) { this.S[i] = i }\n j = 0\n for (i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255\n t = this.S[i]\n this.S[i] = this.S[j]\n this.S[j] = t\n }\n this.i = 0\n this.j = 0\n }\n\n next (): number {\n let t\n this.i = (this.i + 1) & 255\n this.j = (this.j + this.S[this.i]) & 255\n t = this.S[this.i]\n this.S[this.i] = this.S[this.j]\n this.S[this.j] = t\n return this.S[(t + this.S[this.i]) & 255]\n }\n}\n\n// Plug in your RNG constructor here\nexport function prng_newstate () {\n return new Arcfour()\n}\n\n// Pool size must be a multiple of 4 and greater than 32.\n// An array of bytes the size of the pool will be passed to init()\nexport const rng_psize = 256\n","// Downloaded from http://www-cs-students.stanford.edu/~tjw/jsbn/ by Jeremy White on 6/1/2012\n\n/*\n * Copyright (c) 2003-2005 Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n\n// Random number generator - requires a PRNG backend, e.g. prng4.js\nimport { prng_newstate, rng_psize } from './prng4.js'\n\n// For best results, put code like\n// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n// in your main HTML document.\n\nlet rng_state: any\nlet rng_pool: number[]\nlet rng_pptr: number\n\n// Mix in a 32-bit integer into the pool\nfunction rng_seed_int (x: number) {\n rng_pool[rng_pptr++] ^= x & 255\n rng_pool[rng_pptr++] ^= (x >> 8) & 255\n rng_pool[rng_pptr++] ^= (x >> 16) & 255\n rng_pool[rng_pptr++] ^= (x >> 24) & 255\n if (rng_pptr >= rng_psize) rng_pptr -= rng_psize\n}\n\n// Mix in the current time (w/milliseconds) into the pool\nfunction rng_seed_time () {\n rng_seed_int(new Date().getTime())\n}\n\n// Initialize the pool with junk if needed.\nif (rng_pool == null) {\n rng_pool = []\n rng_pptr = 0\n let t: number\n if (navigator.appName == 'Netscape' && navigator.appVersion < '5' && (window as any).crypto) {\n // Extract entropy (256 bits) from NS4 RNG if available\n const z = (window as any).crypto.random(32)\n for (t = 0; t < z.length; ++t) { rng_pool[rng_pptr++] = z.charCodeAt(t) & 255 }\n }\n while (rng_pptr < rng_psize) { // extract some randomness from Math.random()\n t = Math.floor(65536 * Math.random())\n rng_pool[rng_pptr++] = t >>> 8\n rng_pool[rng_pptr++] = t & 255\n }\n rng_pptr = 0\n rng_seed_time()\n // rng_seed_int(window.screenX);\n // rng_seed_int(window.screenY);\n}\n\nfunction rng_get_byte (): number {\n if (rng_state == null) {\n rng_seed_time()\n rng_state = prng_newstate()\n rng_state.init(rng_pool)\n for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) { rng_pool[rng_pptr] = 0 }\n rng_pptr = 0\n // rng_pool = null;\n }\n // TODO: allow reseeding after first request\n return rng_state.next()\n}\n\nfunction rng_get_bytes (ba: number[]) {\n let i: number\n for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte()\n}\n\nexport class SecureRandom {\n nextBytes (ba: number[]) {\n rng_get_bytes(ba)\n }\n}\n","// Downloaded from http://www-cs-students.stanford.edu/~tjw/jsbn/ by Jeremy White on 6/1/2012\n// Converted into an ES6 module\n\n/*\n * Copyright (c) 2003-2005 Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n\n// Depends on jsbn.js and rng.js\nimport { BigInteger } from './jsbn'\nimport { SecureRandom } from './rng'\n\n// Version 1.1: support utf-8 encoding in pkcs1pad2\n\n// convert a (hex) string to a bignum object\nfunction parseBigInt (str: string, r: number): BigInteger {\n return new BigInteger(str, r)\n}\n\nfunction linebrk (s: string, n: number): string {\n let ret = ''\n let i = 0\n while (i + n < s.length) {\n ret += s.substring(i, i + n) + '\\n'\n i += n\n }\n return ret + s.substring(i, s.length)\n}\n\nfunction byte2Hex (b: number): string {\n if (b < 0x10) { return '0' + b.toString(16) } else { return b.toString(16) }\n}\n\n// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint\nfunction pkcs1pad2 (s: string, n: number): BigInteger | null {\n if (n < s.length + 11) { // TODO: fix for utf-8\n alert('Message too long for RSA')\n return null\n }\n const ba: number[] = []\n let i = s.length - 1\n while (i >= 0 && n > 0) {\n const c = s.charCodeAt(i--)\n if (c < 128) { // encode using utf-8\n ba[--n] = c\n } else if ((c > 127) && (c < 2048)) {\n ba[--n] = (c & 63) | 128\n ba[--n] = (c >> 6) | 192\n } else {\n ba[--n] = (c & 63) | 128\n ba[--n] = ((c >> 6) & 63) | 128\n ba[--n] = (c >> 12) | 224\n }\n }\n ba[--n] = 0\n const rng = new SecureRandom()\n const x: number[] = []\n while (n > 2) { // random non-zero pad\n x[0] = 0\n while (x[0] == 0) rng.nextBytes(x)\n ba[--n] = x[0]\n }\n ba[--n] = 2\n ba[--n] = 0\n return new BigInteger(ba)\n}\n\nexport class RSAKey {\n n: BigInteger | null = null\n e: number = 0\n d: BigInteger | null = null\n p: BigInteger | null = null\n q: BigInteger | null = null\n dmp1: BigInteger | null = null\n dmq1: BigInteger | null = null\n coeff: BigInteger | null = null\n\n // Set the public key fields N and e from hex strings\n setPublic (N: string, E: string): void {\n if (N != null && E != null && N.length > 0 && E.length > 0) {\n this.n = parseBigInt(N, 16)\n this.e = parseInt(E, 16)\n } else {\n alert('Invalid RSA public key')\n }\n }\n\n // Perform raw public operation on \"x\": return x^e (mod n)\n doPublic (x: BigInteger): BigInteger {\n return x.modPowInt(this.e, this.n)\n }\n\n // Return the PKCS#1 RSA encryption of \"text\" as an even-length hex string\n encrypt (text: string): string | null {\n if (!this.n) {\n return null\n }\n const m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3)\n if (m == null) return null\n const c = this.doPublic(m)\n if (c == null) return null\n const h = c.toString(16)\n if ((h.length & 1) == 0) return h; else return '0' + h\n }\n}\n","/*\n * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined\n * in FIPS 180-1\n * Version 2.2 Copyright Paul Johnston 2000 - 2009.\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for details.\n */\n\n/* Downloaded 6/1/2012 from the above address by Jeremy White.\n License reproduce here for completeness:\n\nCopyright (c) 1998 - 2009, Paul Johnston & Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nNeither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n */\n\n/*\n * Configurable variables. You may need to tweak these to be compatible with\n * the server-side, but the defaults work in most cases.\n */\nlet hexcase = 0 /* hex output format. 0 - lowercase; 1 - uppercase */\nlet b64pad = '' /* base-64 pad character. \"=\" for strict RFC compliance */\n\n/*\n * These are the functions you'll usually want to call\n * They take string arguments and return either hex or base-64 encoded strings\n */\nexport function hex_sha1 (s: string): string { return rstr2hex(rstr_sha1(str2rstr_utf8(s))) }\nexport function b64_sha1 (s: string): string { return rstr2b64(rstr_sha1(str2rstr_utf8(s))) }\nexport function any_sha1 (s: string, e: string): string { return rstr2any(rstr_sha1(str2rstr_utf8(s)), e) }\nexport function hex_hmac_sha1 (k: string, d: string): string { return rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))) }\nexport function b64_hmac_sha1 (k: string, d: string): string { return rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))) }\nexport function any_hmac_sha1 (k: string, d: string, e: string): string { return rstr2any(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)), e) }\n\n/*\n * Perform a simple self-test to see if the VM is working\n */\nexport function sha1_vm_test (): boolean {\n return hex_sha1('abc').toLowerCase() == 'a9993e364706816aba3e25717850c26c9cd0d89d'\n}\n\n/*\n * Calculate the SHA1 of a raw string\n */\nexport function rstr_sha1 (s: string): string {\n return binb2rstr(binb_sha1(rstr2binb(s), s.length * 8))\n}\n\n/*\n * Calculate the HMAC-SHA1 of a key and some data (raw strings)\n */\nexport function rstr_hmac_sha1 (key: string, data: string): string {\n let bkey = rstr2binb(key)\n if (bkey.length > 16) bkey = binb_sha1(bkey, key.length * 8)\n\n const ipad = Array<number>(16); const opad = Array<number>(16)\n for (let i = 0; i < 16; i++) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5C5C5C5C\n }\n\n const hash = binb_sha1(ipad.concat(rstr2binb(data)), 512 + data.length * 8)\n return binb2rstr(binb_sha1(opad.concat(hash), 512 + 160))\n}\n\n/*\n * Convert a raw string to a hex string\n */\nfunction rstr2hex (input: string): string {\n try { hexcase } catch (e) { hexcase = 0 }\n const hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'\n let output = ''\n let x: number\n for (let i = 0; i < input.length; i++) {\n x = input.charCodeAt(i)\n output += hex_tab.charAt((x >>> 4) & 0x0F) +\n hex_tab.charAt(x & 0x0F)\n }\n return output\n}\n\n/*\n * Convert a raw string to a base-64 string\n */\nfunction rstr2b64 (input: string): string {\n try { b64pad } catch (e) { b64pad = '' }\n const tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n let output = ''\n const len = input.length\n for (let i = 0; i < len; i += 3) {\n const triplet = (input.charCodeAt(i) << 16) |\n (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) |\n (i + 2 < len ? input.charCodeAt(i + 2) : 0)\n for (let j = 0; j < 4; j++) {\n if (i * 8 + j * 6 > input.length * 8) output += b64pad\n else output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F)\n }\n }\n return output\n}\n\n/*\n * Convert a raw string to an arbitrary string encoding\n */\nfunction rstr2any (input: string, encoding: string): string {\n const divisor = encoding.length\n const remainders = Array<number>()\n let i, q, x, quotient\n\n /* Convert to an array of 16-bit big-endian values, forming the dividend */\n let dividend = Array<number>(Math.ceil(input.length / 2))\n for (i = 0; i < dividend.length; i++) {\n dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1)\n }\n\n /*\n * Repeatedly perform a long division. The binary array forms the dividend,\n * the length of the encoding is the divisor. Once computed, the quotient\n * forms the dividend for the next step. We stop when the dividend is zero.\n * All remainders are stored for later use.\n */\n while (dividend.length > 0) {\n quotient = Array<number>()\n x = 0\n for (i = 0; i < dividend.length; i++) {\n x = (x << 16) + dividend[i]\n q = Math.floor(x / divisor)\n x -= q * divisor\n if (quotient.length > 0 || q > 0) { quotient[quotient.length] = q }\n }\n remainders[remainders.length] = x\n dividend = quotient\n }\n\n /* Convert the remainders to the output string */\n let output = ''\n for (i = remainders.length - 1; i >= 0; i--) { output += encoding.charAt(remainders[i]) }\n\n /* Append leading zero equivalents */\n const full_length = Math.ceil(input.length * 8 /\n (Math.log(encoding.length) / Math.log(2)))\n for (i = output.length; i < full_length; i++) { output = encoding[0] + output }\n\n return output\n}\n\n/*\n * Encode a string as utf-8.\n * For efficiency, this assumes the input is valid utf-16.\n */\nfunction str2rstr_utf8 (input: string): string {\n let output = ''\n let i = -1\n let x, y\n\n while (++i < input.length) {\n /* Decode utf-16 surrogate pairs */\n x = input.charCodeAt(i)\n y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0\n if (x >= 0xD800 && x <= 0xDBFF && y >= 0xDC00 && y <= 0xDFFF) {\n x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF)\n i++\n }\n\n /* Encode output as utf-8 */\n if (x <= 0x7F) { output += String.fromCharCode(x) } else if (x <= 0x7FF) {\n output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),\n 0x80 | (x & 0x3F))\n } else if (x <= 0xFFFF) {\n output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),\n 0x80 | ((x >>> 6) & 0x3F),\n 0x80 | (x & 0x3F))\n } else if (x <= 0x1FFFFF) {\n output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),\n 0x80 | ((x >>> 12) & 0x3F),\n 0x80 | ((x >>> 6) & 0x3F),\n 0x80 | (x & 0x3F))\n }\n }\n return output\n}\n\n/*\n * Encode a string as utf-16\n */\nfunction str2rstr_utf16le (input: string): string {\n let output = ''\n for (let i = 0; i < input.length; i++) {\n output += String.fromCharCode(input.charCodeAt(i) & 0xFF,\n (input.charCodeAt(i) >>> 8) & 0xFF)\n }\n return output\n}\n\nfunction str2rstr_utf16be (input: string): string {\n let output = ''\n for (let i = 0; i < input.length; i++) {\n output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,\n input.charCodeAt(i) & 0xFF)\n }\n return output\n}\n\n/*\n * Convert a raw string to an array of big-endian words\n * Characters >255 have their high-byte silently ignored.\n */\nfunction rstr2binb (input: string): number[] {\n const output = Array<number>(input.length >> 2)\n for (var i = 0; i < output.length; i++) { output[i] = 0 }\n for (var i = 0; i < input.length * 8; i += 8) { output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32) }\n return output\n}\n\n/*\n * Convert an array of big-endian words to a string\n */\nfunction binb2rstr (input: number[]): string {\n let output = ''\n for (let i = 0; i < input.length * 32; i += 8) { output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF) }\n return output\n}\n\n/*\n * Calculate the SHA-1 of an array of big-endian words, and a bit length\n */\nfunction binb_sha1 (x: number[], len: number): number[] {\n /* append padding */\n x[len >> 5] |= 0x80 << (24 - len % 32)\n x[((len + 64 >> 9) << 4) + 15] = len\n\n const w = Array<number>(80)\n let a = 1732584193\n let b = -271733879\n let c = -1732584194\n let d = 271733878\n let e = -1009589776\n\n for (let i = 0; i < x.length; i += 16) {\n const olda = a\n const oldb = b\n const oldc = c\n const oldd = d\n const olde = e\n\n for (let j = 0; j < 80; j++) {\n if (j < 16) w[j] = x[i + j]\n else w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1)\n const t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),\n safe_add(safe_add(e, w[j]), sha1_kt(j)))\n e = d\n d = c\n c = bit_rol(b, 30)\n b = a\n a = t\n }\n\n a = safe_add(a, olda)\n b = safe_add(b, oldb)\n c = safe_add(c, oldc)\n d = safe_add(d, oldd)\n e = safe_add(e, olde)\n }\n return Array<number>(a, b, c, d, e)\n}\n\n/*\n * Perform the appropriate triplet combination function for the current\n * iteration\n */\nfunction sha1_ft (t: number, b: number, c: number, d: number): number {\n if (t < 20) return (b & c) | ((~b) & d)\n if (t < 40) return b ^ c ^ d\n if (t < 60) return (b & c) | (b & d) | (c & d)\n return b ^ c ^ d\n}\n\n/*\n * Determine the appropriate additive constant for the current iteration\n */\nfunction sha1_kt (t: number): number {\n return (t < 20)\n ? 1518500249\n : (t < 40)\n ? 1859775393\n : (t < 60) ? -1894007588 : -899497514\n}\n\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\nfunction safe_add (x: number, y: number): number {\n const lsw = (x & 0xFFFF) + (y & 0xFFFF)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xFFFF)\n}\n\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\nfunction bit_rol (num: number, cnt: number): number {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport { RSAKey } from './thirdparty/rsa'\nimport { BigInteger } from './thirdparty/jsbn'\nimport { SecureRandom } from './thirdparty/rng'\nimport { rstr_sha1 } from './thirdparty/sha1'\n\nconst SHA_DIGEST_LENGTH = 20\n\n/* ----------------------------------------------------------------------------\n** General ticket RSA encryption functions - just good enough to\n** support what we need to send back an encrypted ticket.\n**-------------------------------------------------------------------------- */\n\n/* ----------------------------------------------------------------------------\n** OAEP padding functions. Inspired by the OpenSSL implementation.\n**-------------------------------------------------------------------------- */\nfunction MGF1 (mask: number[], seed: number[]): number {\n let i = 0; let j = 0; let outlen = 0\n for (i = 0, outlen = 0; outlen < mask.length; i++) {\n let combo_buf = new String()\n\n for (j = 0; j < seed.length; j++) {\n combo_buf += String.fromCharCode(seed[j])\n }\n combo_buf += String.fromCharCode((i >> 24) & 255)\n combo_buf += String.fromCharCode((i >> 16) & 255)\n combo_buf += String.fromCharCode((i >> 8) & 255)\n combo_buf += String.fromCharCode((i) & 255)\n\n const combo_hash = rstr_sha1(combo_buf)\n for (j = 0; j < combo_hash.length && outlen < mask.length; j++, outlen++) {\n mask[outlen] = combo_hash.charCodeAt(j)\n }\n }\n return 0\n}\n\nfunction RSA_padding_add_PKCS1_OAEP (tolen: number, from: string, param: string): string | null {\n const seed = new Array(SHA_DIGEST_LENGTH)\n const rand = new SecureRandom()\n rand.nextBytes(seed)\n\n const dblen = tolen - 1 - seed.length\n const db = new Array(dblen)\n const padlen = dblen - from.length - 1\n let i: number\n\n if (param === undefined) {\n param = ''\n }\n\n if (padlen < SHA_DIGEST_LENGTH) {\n console.log('Error - data too large for key size.')\n return null\n }\n\n for (i = 0; i < padlen; i++) {\n db[i] = 0\n }\n\n const param_hash = rstr_sha1(param)\n for (i = 0; i < param_hash.length; i++) {\n db[i] = param_hash.charCodeAt(i)\n }\n\n db[padlen] = 1\n for (i = 0; i < from.length; i++) {\n db[i + padlen + 1] = from.charCodeAt(i)\n }\n\n const dbmask = new Array(dblen)\n if (MGF1(dbmask, seed) < 0) {\n return null\n }\n\n for (i = 0; i < dbmask.length; i++) {\n db[i] ^= dbmask[i]\n }\n\n const seedmask = Array(SHA_DIGEST_LENGTH)\n if (MGF1(seedmask, db) < 0) {\n return null\n }\n\n for (i = 0; i < seedmask.length; i++) {\n seed[i] ^= seedmask[i]\n }\n\n let ret = new String()\n ret += String.fromCharCode(0)\n for (i = 0; i < seed.length; i++) {\n ret += String.fromCharCode(seed[i])\n }\n for (i = 0; i < db.length; i++) {\n ret += String.fromCharCode(db[i])\n }\n return ret\n}\n\nfunction asn_get_length (u8: Uint8Array, at: number): [number, number] | null {\n let len = u8[at++]\n if (len > 0x80) {\n if (len != 0x81) {\n console.log(\"Error: we lazily don't support keys bigger than 255 bytes. It'd be easy to fix.\")\n return null\n }\n len = u8[at++]\n }\n\n return [at, len]\n}\n\nfunction find_sequence (u8: Uint8Array, at?: number): [number, number] | null {\n let lenblock\n at = at || 0\n if (u8[at++] != 0x30) {\n console.log('Error: public key should start with a sequence flag.')\n return null\n }\n\n lenblock = asn_get_length(u8, at)\n if (!lenblock) {\n return null\n }\n return lenblock\n}\n\n/* ----------------------------------------------------------------------------\n** Extract an RSA key from a memory buffer\n**-------------------------------------------------------------------------- */\nexport function create_rsa_from_mb (mb: ArrayBuffer, at?: number): RSAKey | null {\n const u8 = new Uint8Array(mb)\n let lenblock: [number, number] | null\n let seq: [number, number] | null\n let ba: number[]\n let i: number\n let ret: RSAKey\n\n /* We have a sequence which contains a sequence followed by a bit string */\n seq = find_sequence(u8, at)\n if (!seq) {\n return null\n }\n\n at = seq[0]\n seq = find_sequence(u8, at)\n if (!seq) {\n return null\n }\n\n /* Skip over the contained sequence */\n at = seq[0] + seq[1]\n if (u8[at++] != 0x3) {\n console.log('Error: expecting bit string next.')\n return null\n }\n\n /* Get the bit string, which is *itself* a sequence. Having fun yet? */\n lenblock = asn_get_length(u8, at)\n if (!lenblock) {\n return null\n }\n\n at = lenblock[0]\n if (u8[at] != 0 && u8[at + 1] != 0x30) {\n console.log('Error: unexpected values in bit string.')\n return null\n }\n\n /* Okay, now we have a sequence of two binary values, we hope. */\n seq = find_sequence(u8, at + 1)\n if (!seq) {\n return null\n }\n\n at = seq[0]\n if (u8[at++] != 0x02) {\n console.log('Error: expecting integer n next.')\n return null\n }\n lenblock = asn_get_length(u8, at)\n if (!lenblock) {\n return null\n }\n at = lenblock[0]\n\n ba = new Array(lenblock[1])\n for (i = 0; i < lenblock[1]; i++) {\n ba[i] = u8[at + i]\n }\n\n ret = new RSAKey()\n ret.n = new BigInteger(ba)\n\n at += lenblock[1]\n\n if (u8[at++] != 0x02) {\n console.log('Error: expecting integer e next.')\n return null\n }\n lenblock = asn_get_length(u8, at)\n if (!lenblock) {\n return null\n }\n at = lenblock[0]\n\n ret.e = u8[at++]\n for (i = 1; i < lenblock[1]; i++) {\n ret.e <<= 8\n ret.e |= u8[at++]\n }\n\n return ret\n}\n\nexport function rsa_encrypt (rsa: RSAKey, str: string): number[] | null {\n let i: number\n const ret: number[] = []\n if (!rsa.n) {\n return null\n }\n const oaep = RSA_padding_add_PKCS1_OAEP((rsa.n.bitLength() + 7) >> 3, str)\n if (!oaep) {\n return null\n }\n\n const ba = new Array(oaep.length)\n\n for (i = 0; i < oaep.length; i++) {\n ba[i] = oaep.charCodeAt(i)\n }\n const bigint = new BigInteger(ba)\n const enc = rsa.doPublic(bigint)\n let h = enc.toString(16)\n if ((h.length & 1) != 0) {\n h = '0' + h\n }\n for (i = 0; i < h.length; i += 2) {\n ret[i / 2] = parseInt(h.substring(i, i + 2), 16)\n }\n return ret\n}\n","/*\n * Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n * Copyright (C) 2012 by Aric Stewart <aric@codeweavers.com>\n *\n * This file is part of spice-html5.\n *\n * spice-html5 is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * spice-html5 is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n */\n\nlet encoder: QuicEncoder | undefined\n\nconst Constants = {\n QUIC_IMAGE_TYPE_INVALID: 0,\n QUIC_IMAGE_TYPE_GRAY: 1,\n QUIC_IMAGE_TYPE_RGB16: 2,\n QUIC_IMAGE_TYPE_RGB24: 3,\n QUIC_IMAGE_TYPE_RGB32: 4,\n QUIC_IMAGE_TYPE_RGBA: 5\n}\n\nconst DEFevol = 3\nconst DEFwmimax = 6\nconst DEFwminext = 2048\nlet need_init = true\nconst DEFmaxclen = 26\nconst evol = DEFevol\nconst wmimax = DEFwmimax\nconst wminext = DEFwminext\n\ninterface QuicFamily {\n nGRcodewords: number[]\n notGRcwlen: number[]\n notGRprefixmask: number[]\n notGRsuffixlen: number[]\n xlatU2L: number[]\n xlatL2U: number[]\n}\n\nconst family_5bpc: QuicFamily = {\n nGRcodewords: [0, 0, 0, 0, 0, 0, 0, 0],\n notGRcwlen: [0, 0, 0, 0, 0, 0, 0, 0],\n notGRprefixmask: [0, 0, 0, 0, 0, 0, 0, 0],\n notGRsuffixlen: [0, 0, 0, 0, 0, 0, 0, 0],\n xlatU2L: [0, 0, 0, 0, 0, 0, 0, 0],\n xlatL2U: [0, 0, 0, 0, 0, 0, 0, 0]\n}\n\nconst family_8bpc: QuicFamily = {\n nGRcodewords: [0, 0, 0, 0, 0, 0, 0, 0],\n notGRcwlen: [0, 0, 0, 0, 0, 0, 0, 0],\n notGRprefixmask: [0, 0, 0, 0, 0, 0, 0, 0],\n notGRsuffixlen: [0, 0, 0, 0, 0, 0, 0, 0],\n xlatU2L: [0, 0, 0, 0, 0, 0, 0, 0],\n xlatL2U: [0, 0, 0, 0, 0, 0, 0, 0]\n}\n\nconst bppmask = [0x00000000,\n 0x00000001, 0x00000003, 0x00000007, 0x0000000f,\n 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,\n 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,\n 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,\n 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,\n 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,\n 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,\n 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff]\n\nconst zeroLUT: number[] = []\n\nconst besttrigtab = [\n [550, 900, 800, 700, 500, 350, 300, 200, 180, 180, 160],\n [110, 550, 900, 800, 550, 400, 350, 250, 140, 160, 140],\n [100, 120, 550, 900, 700, 500, 400, 300, 220, 250, 160]]\n\nconst J = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6,\n 7, 7, 8, 9, 10, 11, 12, 13, 14, 15]\n\nconst lzeroes = [\n 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0]\n\nconst tabrand_chaos = [\n 0x02c57542, 0x35427717, 0x2f5a2153, 0x9244f155, 0x7bd26d07, 0x354c6052,\n 0x57329b28, 0x2993868e, 0x6cd8808c, 0x147b46e0, 0x99db66af, 0xe32b4cac,\n 0x1b671264, 0x9d433486, 0x62a4c192, 0x06089a4b, 0x9e3dce44, 0xdaabee13,\n 0x222425ea, 0xa46f331d, 0xcd589250, 0x8bb81d7f, 0xc8b736b9, 0x35948d33,\n 0xd7ac7fd0, 0x5fbe2803, 0x2cfbc105, 0x013dbc4e, 0x7a37820f, 0x39f88e9e,\n 0xedd58794, 0xc5076689, 0xfcada5a4, 0x64c2f46d, 0xb3ba3243, 0x8974b4f9,\n 0x5a05aebd, 0x20afcd00, 0x39e2b008, 0x88a18a45, 0x600bde29, 0xf3971ace,\n 0xf37b0a6b, 0x7041495b, 0x70b707ab, 0x06beffbb, 0x4206051f, 0xe13c4ee3,\n 0xc1a78327, 0x91aa067c, 0x8295f72a, 0x732917a6, 0x1d871b4d, 0x4048f136,\n 0xf1840e7e, 0x6a6048c1, 0x696cb71a, 0x7ff501c3, 0x0fc6310b, 0x57e0f83d,\n 0x8cc26e74, 0x11a525a2, 0x946934c7, 0x7cd888f0, 0x8f9d8604, 0x4f86e73b,\n 0x04520316, 0xdeeea20c, 0xf1def496, 0x67687288, 0xf540c5b2, 0x22401484,\n 0x3478658a, 0xc2385746, 0x01979c2c, 0x5dad73c8, 0x0321f58b, 0xf0fedbee,\n 0x92826ddf, 0x284bec73, 0x5b1a1975, 0x03df1e11, 0x20963e01, 0xa17cf12b,\n 0x740d776e, 0xa7a6bf3c, 0x01b5cce4, 0x1118aa76, 0xfc6fac0a, 0xce927e9b,\n 0x00bf2567, 0x806f216c, 0xbca69056, 0x795bd3e9, 0xc9dc4557, 0x8929b6c2,\n 0x789d52ec, 0x3f3fbf40, 0xb9197368, 0xa38c15b5, 0xc3b44fa8, 0xca8333b0,\n 0xb7e8d590, 0xbe807feb, 0xbf5f8360, 0xd99e2f5c, 0x372928e1, 0x7c757c4c,\n 0x0db5b154, 0xc01ede02, 0x1fc86e78, 0x1f3985be, 0xb4805c77, 0x00c880fa,\n 0x974c1b12, 0x35ab0214, 0xb2dc840d, 0x5b00ae37, 0xd313b026, 0xb260969d,\n 0x7f4c8879, 0x1734c4d3, 0x49068631, 0xb9f6a021, 0x6b863e6f, 0xcee5debf,\n 0x29f8c9fb, 0x53dd6880, 0x72b61223, 0x1f67a9fd, 0x0a0f6993, 0x13e59119,\n 0x11cca12e, 0xfe6b6766, 0x16b6effc, 0x97918fc4, 0xc2b8a563, 0x94f2f741,\n 0x0bfa8c9a, 0xd1537ae8, 0xc1da349c, 0x873c60ca, 0x95005b85, 0x9b5c080e,\n 0xbc8abbd9, 0xe1eab1d2, 0x6dac9070, 0x4ea9ebf1, 0xe0cf30d4, 0x1ef5bd7b,\n 0xd161043e, 0x5d2fa2e2, 0xff5d3cae, 0x86ed9f87, 0x2aa1daa1, 0xbd731a34,\n 0x9e8f4b22, 0xb1c2c67a, 0xc21758c9, 0xa182215d, 0xccb01948, 0x8d168df7,\n 0x04238cfe, 0x368c3dbc, 0x0aeadca5, 0xbad21c24, 0x0a71fee5, 0x9fc5d872,\n 0x54c152c6, 0xfc329483, 0x6783384a, 0xeddb3e1c, 0x65f90e30, 0x884ad098,\n 0xce81675a, 0x4b372f7d, 0x68bf9a39, 0x43445f1e, 0x40f8d8cb, 0x90d5acb6,\n 0x4cd07282, 0x349eeb06, 0x0c9d5332, 0x520b24ef, 0x80020447, 0x67976491,\n 0x2f931ca3, 0xfe9b0535, 0xfcd30220, 0x61a9e6cc, 0xa487d8d7, 0x3f7c5dd1,\n 0x7d0127c5, 0x48f51d15, 0x60dea871, 0xc9a91cb7, 0x58b53bb3, 0x9d5e0b2d,\n 0x624a78b4, 0x30dbee1b, 0x9bdf22e7, 0x1df5c299, 0x2d5643a7, 0xf4dd35ff,\n 0x03ca8fd6, 0x53b47ed8, 0x6f2c19aa, 0xfeb0c1f4, 0x49e54438, 0x2f2577e6,\n 0xbf876969, 0x72440ea9, 0xfa0bafb8, 0x74f5b3a0, 0x7dd357cd, 0x89ce1358,\n 0x6ef2cdda, 0x1e7767f3, 0xa6be9fdb, 0x4f5f88f8, 0xba994a3a, 0x08ca6b65,\n 0xe0893818, 0x9e00a16a, 0xf42bfc8f, 0x9972eedc, 0x749c8b51, 0x32c05f5e,\n 0xd706805f, 0x6bfbb7cf, 0xd9210a10, 0x31a1db97, 0x923a9559, 0x37a7a1f6,\n 0x059f8861, 0xca493e62, 0x65157e81, 0x8f6467dd, 0xab85ff9f, 0x9331aff2,\n 0x8616b9f5, 0xedbd5695, 0xee7e29b1, 0x313ac44f, 0xb903112f, 0x432ef649,\n 0xdc0a36c0, 0x61cf2bba, 0x81474925, 0xa8b6c7ad, 0xee5931de, 0xb2f8158d,\n 0x59fb7409, 0x2e3dfaed, 0x9af25a3f, 0xe1fed4d5]\n\nconst rgb32_pixel_pad = 3\nconst rgb32_pixel_r = 2\nconst rgb32_pixel_g = 1\nconst rgb32_pixel_b = 0\nconst rgb32_pixel_size = 4\n\n/* Helper Functions */\n\nfunction ceil_log_2 (val: number): number {\n if (val === 1) { return 0 }\n\n let result = 1\n val -= 1\n while (val = val >>> 1) { result++ }\n\n return result\n}\n\nfunction family_init (family: QuicFamily, bpc: number, limit: number): void {\n let l: number\n for (l = 0; l < bpc; l++) {\n let altprefixlen, altcodewords\n altprefixlen = limit - bpc\n if (altprefixlen > bppmask[bpc - l]) { altprefixlen = bppmask[bpc - l] }\n\n altcodewords = bppmask[bpc] + 1 - (altprefixlen << l)\n family.nGRcodewords[l] = (altprefixlen << l)\n family.notGRcwlen[l] = altprefixlen + ceil_log_2(altcodewords)\n family.notGRprefixmask[l] = bppmask[32 - altprefixlen] >>> 0\n family.notGRsuffixlen[l] = ceil_log_2(altcodewords)\n }\n\n /* decorelate_init */\n const pixelbitmask = bppmask[bpc]\n const pixelbitmaskshr = pixelbitmask >>> 1\n let s: number\n for (s = 0; s <= pixelbitmask; s++) {\n if (s <= pixelbitmaskshr) {\n family.xlatU2L[s] = s << 1\n } else {\n family.xlatU2L[s] = ((pixelbitmask - s) << 1) + 1\n }\n }\n\n /* corelate_init */\n for (s = 0; s <= pixelbitmask; s++) {\n if (s & 0x01) {\n family.xlatL2U[s] = pixelbitmask - (s >>> 1)\n } else {\n family.xlatL2U[s] = (s >>> 1)\n }\n }\n}\n\nfunction quic_image_bpc (type: number): number {\n switch (type) {\n case Constants.QUIC_IMAGE_TYPE_GRAY:\n return 8\n case Constants.QUIC_IMAGE_TYPE_RGB16:\n return 5\n case Constants.QUIC_IMAGE_TYPE_RGB24:\n return 8\n case Constants.QUIC_IMAGE_TYPE_RGB32:\n return 8\n case Constants.QUIC_IMAGE_TYPE_RGBA:\n return 8\n case Constants.QUIC_IMAGE_TYPE_INVALID:\n default:\n console.log('quic: bad image type\\n')\n return 0\n }\n}\n\nfunction cnt_l_zeroes (bits: number): number {\n if (bits & 0xff800000) {\n return lzeroes[bits >>> 24]\n } else if (bits & 0xffff8000) {\n return 8 + lzeroes[(bits >>> 16) & 0x000000ff]\n } else if (bits & 0xffffff80) {\n return 16 + lzeroes[(bits >>> 8) & 0x000000ff]\n } else {\n return 24 + lzeroes[bits & 0x000000ff]\n }\n}\n\nfunction golomb_decoding_8bpc (l: number, bits: number): { codewordlen: number, rc: number } {\n let rc: number\n let cwlen: number\n\n if (bits < 0 || bits > family_8bpc.notGRprefixmask[l]) {\n const zeroprefix = cnt_l_zeroes(bits)\n cwlen = zeroprefix + 1 + l\n rc = (zeroprefix << l) | (bits >> (32 - cwlen)) & bppmask[l]\n } else {\n cwlen = family_8bpc.notGRcwlen[l]\n rc = family_8bpc.nGRcodewords[l] + ((bits >> (32 - cwlen)) & bppmask[family_8bpc.notGRsuffixlen[l]])\n }\n return { codewordlen: cwlen, rc }\n}\n\nfunction golomb_code_len_8bpc (n: number, l: number): number {\n if (n < family_8bpc.nGRcodewords[l]) {\n return (n >>> l) + 1 + l\n } else {\n return family_8bpc.notGRcwlen[l]\n }\n}\n\nclass QuicModel {\n levels: number\n n_buckets_ptrs: number\n repfirst: number\n firstsize: number\n repnext: number\n mulsize: number\n n_buckets: number\n\n constructor (bpc: number) {\n let bstart: number\n let bend = 0\n\n this.levels = 0x1 << bpc\n this.n_buckets_ptrs = 0\n\n switch (evol) {\n case 1:\n this.repfirst = 3\n this.firstsize = 1\n this.repnext = 2\n this.mulsize = 2\n break\n case 3:\n this.repfirst = 1\n this.firstsize = 1\n this.repnext = 1\n this.mulsize = 2\n break\n case 5:\n this.repfirst = 1\n this.firstsize = 1\n this.repnext = 1\n this.mulsize = 4\n break\n case 0:\n case 2:\n case 4:\n console.log('quic: findmodelparams(): evol value obsolete!!!\\n')\n break\n default:\n console.log('quic: findmodelparams(): evol out of range!!!\\n')\n }\n\n this.n_buckets = 0\n let repcntr = this.repfirst + 1\n let bsize = this.firstsize\n\n do {\n if (this.n_buckets) {\n bstart = bend + 1\n } else {\n bstart = 0\n }\n\n if (!--repcntr) {\n repcntr = this.repnext\n bsize *= this.mulsize\n }\n\n bend = bstart + bsize - 1\n if (bend + bsize >= this.levels) {\n bend = this.levels - 1\n }\n\n if (!this.n_buckets_ptrs) {\n this.n_buckets_ptrs = this.levels\n }\n\n this.n_buckets++\n } while (bend < this.levels - 1)\n }\n}\n\nclass QuicBucket {\n counters: number[]\n bestcode: number\n\n constructor () {\n this.counters = [0, 0, 0, 0, 0, 0, 0, 0]\n this.bestcode = 0\n }\n\n reste (bpp: number): void {\n this.bestcode = bpp\n this.counters = [0, 0, 0, 0, 0, 0, 0, 0]\n }\n\n update_model_8bpc (state: CommonState, curval: number, bpp: number): void {\n let i: number\n\n let bestcode = bpp - 1\n let bestcodelen = (this.counters[bestcode] += golomb_code_len_8bpc(curval, bestcode))\n\n for (i = bpp - 2; i >= 0; i--) {\n const ithcodelen = (this.counters[i] += golomb_code_len_8bpc(curval, i))\n\n if (ithcodelen < bestcodelen) {\n bestcode = i\n bestcodelen = ithcodelen\n }\n }\n\n this.bestcode = bestcode\n\n if (bestcodelen > state.wm_trigger) {\n for (i = 0; i < bpp; i++) {\n this.counters[i] = this.counters[i] >>> 1\n }\n }\n }\n}\n\nclass QuicFamilyStat {\n buckets_ptrs: QuicBucket[]\n buckets_buf: QuicBucket[]\n\n constructor () {\n this.buckets_ptrs = []\n this.buckets_buf = []\n }\n\n fill_model_structures (model: QuicModel): boolean {\n let bstart: number\n let bend = 0\n let bnumber = 0\n\n let repcntr = model.repfirst + 1\n let bsize = model.firstsize\n\n do {\n if (bnumber) {\n bstart = bend + 1\n } else {\n bstart = 0\n }\n\n if (!--repcntr) {\n repcntr = model.repnext\n bsize *= model.mulsize\n }\n\n bend = bstart + bsize - 1\n if (bend + bsize >= model.levels) {\n bend = model.levels - 1\n }\n\n this.buckets_buf[bnumber] = new QuicBucket()\n\n let i: number\n for (i = bstart; i <= bend; i++) {\n this.buckets_ptrs[i] = this.buckets_buf[bnumber]\n }\n\n bnumber++\n } while (bend < model.levels - 1)\n return true\n }\n}\n\nclass CommonState {\n waitcnt: number\n tabrand_seed: number\n wm_trigger: number\n wmidx: number\n wmileft: number\n melcstate: number\n melclen: number\n melcorder: number\n\n constructor () {\n this.waitcnt = 0\n this.tabrand_seed = 0xff\n this.wm_trigger = 0\n this.wmidx = 0\n this.wmileft = wminext\n this.melcstate = 0\n this.melclen = J[0]\n this.melcorder = 1 << this.melclen\n }\n\n set_wm_trigger (): void {\n let wm = this.wmidx\n if (wm > 10) {\n wm = 10\n }\n\n this.wm_trigger = besttrigtab[Math.floor(evol / 2)][wm]\n }\n\n reste (): void {\n this.waitcnt = 0\n this.tabrand_seed = 0x0ff\n this.wmidx = 0\n this.wmileft = wminext\n\n this.set_wm_trigger()\n\n this.melcstate = 0\n this.melclen = J[0]\n this.melcorder = 1 << this.melclen\n }\n\n tabrand (): number {\n this.tabrand_seed++\n return tabrand_chaos[this.tabrand_seed & 0x0ff]\n }\n}\n\nclass QuicChannel {\n state: CommonState\n family_stat_8bpc: QuicFamilyStat\n family_stat_5bpc: QuicFamilyStat\n correlate_row: { zero: number, row: number[] }\n model_8bpc: QuicModel\n model_5bpc: QuicModel\n buckets_ptrs: QuicBucket[]\n\n constructor (model_8bpc: QuicModel, model_5bpc: QuicModel) {\n this.state = new CommonState()\n this.family_stat_8bpc = new QuicFamilyStat()\n this.family_stat_5bpc = new QuicFamilyStat()\n this.correlate_row = { zero: 0, row: [] }\n this.model_8bpc = model_8bpc\n this.model_5bpc = model_5bpc\n this.buckets_ptrs = []\n\n if (!this.family_stat_8bpc.fill_model_structures(this.model_8bpc)) {\n throw new Error('Failed to create 8bpc model structures')\n }\n\n if (!this.family_stat_5bpc.fill_model_structures(this.model_5bpc)) {\n throw new Error('Failed to create 5bpc model structures')\n }\n }\n\n reste (bpc: number): boolean {\n let j: number\n this.correlate_row = { zero: 0, row: [] }\n\n if (bpc == 8) {\n for (j = 0; j < this.model_8bpc.n_buckets; j++) { this.family_stat_8bpc.buckets_buf[j].reste(7) }\n this.buckets_ptrs = this.family_stat_8bpc.buckets_ptrs\n } else if (bpc == 5) {\n for (j = 0; j < this.model_5bpc.n_buckets; j++) { this.family_stat_8bpc.buckets_buf[j].reste(4) }\n this.buckets_ptrs = this.family_stat_5bpc.buckets_ptrs\n } else {\n console.log('quic: bad bpc %d\\n', bpc)\n return false\n }\n\n this.state.reste()\n return true\n }\n}\n\nclass QuicEncoder {\n type: number\n width: number\n height: number\n io_idx: number\n io_available_bits: number\n io_word: number\n io_next_word: number\n io_now: Uint8Array\n io_end: number\n rows_completed: number\n rgb_state: CommonState\n model_8bpc: QuicModel\n model_5bpc: QuicModel\n channels: QuicChannel[]\n\n constructor () {\n this.type = 0\n this.width = 0\n this.height = 0\n this.io_idx = 0\n this.io_available_bits = 0\n this.io_word = 0\n this.io_next_word = 0\n this.io_now = new Uint8Array(0)\n this.io_end = 0\n this.rows_completed = 0\n this.rgb_state = new CommonState()\n this.model_8bpc = new QuicModel(8)\n this.model_5bpc = new QuicModel(5)\n this.channels = []\n\n for (let i = 0; i < 4; i++) {\n this.channels[i] = new QuicChannel(this.model_8bpc, this.model_5bpc)\n }\n }\n\n reste (io_ptr: Uint8Array): boolean {\n this.rgb_state.reste()\n\n this.io_now = io_ptr\n this.io_end = this.io_now.length\n this.io_idx = 0\n this.rows_completed = 0\n return true\n }\n\n read_io_word (): void {\n if (this.io_idx >= this.io_end) {\n throw new Error('quic: out of data')\n }\n this.io_next_word = this.io_now[this.io_idx++] | this.io_now[this.io_idx++] << 8 | this.io_now[this.io_idx++] << 16 | this.io_now[this.io_idx++] << 24\n }\n\n decode_eatbits (len: number): void {\n this.io_word = this.io_word << len\n\n const delta = (this.io_available_bits - len)\n if (delta >= 0) {\n this.io_available_bits = delta\n this.io_word |= this.io_next_word >>> this.io_available_bits\n } else {\n const positiveDelta = -1 * delta\n this.io_word |= this.io_next_word << positiveDelta\n this.read_io_word()\n this.io_available_bits = 32 - positiveDelta\n this.io_word |= this.io_next_word >>> this.io_available_bits\n }\n }\n\n decode_eat32bits (): void {\n this.decode_eatbits(16)\n this.decode_eatbits(16)\n }\n\n reste_channels (bpc: number): boolean {\n for (let i = 0; i < 4; i++) {\n if (!this.channels[i].reste(bpc)) { return false }\n }\n return true\n }\n\n quic_decode_begin (io_ptr: Uint8Array): boolean {\n if (!this.reste(io_ptr)) {\n return false\n }\n\n this.io_idx = 0\n this.io_next_word = this.io_now[this.io_idx++] | this.io_now[this.io_idx++] << 8 | this.io_now[this.io_idx++] << 16 | this.io_now[this.io_idx++] << 24\n this.io_word = this.io_next_word\n this.io_available_bits = 0\n\n const magic = this.io_word\n this.decode_eat32bits()\n if (magic != 0x43495551) { /* QUIC */\n console.log('quic: bad magic ' + magic.toString(16))\n return false\n }\n\n const version = this.io_word\n this.decode_eat32bits()\n if (version != ((0 << 16) | (0 & 0xffff))) {\n console.log('quic: bad version ' + version.toString(16))\n return false\n }\n\n this.type = this.io_word\n this.decode_eat32bits()\n\n this.width = this.io_word\n this.decode_eat32bits()\n\n this.height = this.io_word\n this.decode_eat32bits()\n\n const bpc = quic_image_bpc(this.type)\n\n if (!this.reste_channels(bpc)) { return false }\n\n return true\n }\n\n quic_rgb32_uncompress_row0_seg (i: number, cur_row: Uint8Array, end: number, waitmask: number, bpc: number, bpc_mask: number): void {\n let stopidx: number\n const n_channels = 3\n let c: number\n let a: { codewordlen: number, rc: number }\n\n if (!i) {\n cur_row[rgb32_pixel_pad] = 0\n c = 0\n do {\n a = golomb_decoding_8bpc(this.channels[c].buckets_ptrs[this.channels[c].correlate_row.zero].bestcode, this.io_word)\n this.channels[c].correlate_row.row[0] = a.rc\n cur_row[2 - c] = (family_8bpc.xlatL2U[a.rc] & 0xFF)\n this.decode_eatbits(a.codewordlen)\n } while (++c < n_channels)\n\n if (this.rgb_state.waitcnt) {\n --this.rgb_state.waitcnt\n } else {\n this.rgb_state.waitcnt = (this.rgb_state.tabrand() & waitmask)\n c = 0\n do {\n this.channels[c].buckets_ptrs[this.channels[c].correlate_row.zero].update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[0], bpc)\n } while (++c < n_channels)\n }\n stopidx = ++i + this.rgb_state.waitcnt\n } else {\n stopidx = i + this.rgb_state.waitcnt\n }\n\n while (stopidx < end) {\n for (; i <= stopidx; i++) {\n cur_row[(i * rgb32_pixel_size) + rgb32_pixel_pad] = 0\n c = 0\n do {\n a = golomb_decoding_8bpc(this.channels[c].buckets_ptrs[this.channels[c].correlate_row.row[i - 1]].bestcode, this.io_word)\n this.channels[c].correlate_row.row[i] = a.rc\n cur_row[(i * rgb32_pixel_size) + (2 - c)] = (family_8bpc.xlatL2U[a.rc] + cur_row[((i - 1) * rgb32_pixel_size) + (2 - c)]) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n } while (++c < n_channels)\n }\n c = 0\n do {\n this.channels[c].buckets_ptrs[this.channels[c].correlate_row.row[stopidx - 1]].update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[stopidx], bpc)\n } while (++c < n_channels)\n stopidx = i + (this.rgb_state.tabrand() & waitmask)\n }\n\n for (; i < end; i++) {\n cur_row[(i * rgb32_pixel_size) + rgb32_pixel_pad] = 0\n c = 0\n do {\n a = golomb_decoding_8bpc(this.channels[c].buckets_ptrs[this.channels[c].correlate_row.row[i - 1]].bestcode, this.io_word)\n this.channels[c].correlate_row.row[i] = a.rc\n cur_row[(i * rgb32_pixel_size) + (2 - c)] = (family_8bpc.xlatL2U[a.rc] + cur_row[((i - 1) * rgb32_pixel_size) + (2 - c)]) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n } while (++c < n_channels)\n }\n this.rgb_state.waitcnt = stopidx - end\n }\n\n quic_rgb32_uncompress_row0 (cur_row: Uint8Array): void {\n const bpc = 8\n const bpc_mask = 0xff\n let pos = 0\n let width = this.width\n\n while ((wmimax > this.rgb_state.wmidx) && (this.rgb_state.wmileft <= width)) {\n if (this.rgb_state.wmileft) {\n this.quic_rgb32_uncompress_row0_seg(pos, cur_row,\n pos + this.rgb_state.wmileft,\n bppmask[this.rgb_state.wmidx],\n bpc, bpc_mask)\n pos += this.rgb_state.wmileft\n width -= this.rgb_state.wmileft\n }\n\n this.rgb_state.wmidx++\n this.rgb_state.set_wm_trigger()\n this.rgb_state.wmileft = wminext\n }\n\n if (width) {\n this.quic_rgb32_uncompress_row0_seg(pos, cur_row, pos + width,\n bppmask[this.rgb_state.wmidx], bpc, bpc_mask)\n if (wmimax > this.rgb_state.wmidx) {\n this.rgb_state.wmileft -= width\n }\n }\n }\n\n quic_rgb32_uncompress_row_seg (prev_row: Uint8Array, cur_row: Uint8Array, i: number, end: number, bpc: number, bpc_mask: number): void {\n const n_channels = 3\n const waitmask = bppmask[this.rgb_state.wmidx]\n\n let a: { codewordlen: number, rc: number }\n let run_index = 0\n let stopidx = 0\n let run_end = 0\n let c: number\n\n if (!i) {\n cur_row[rgb32_pixel_pad] = 0\n\n c = 0\n do {\n a = golomb_decoding_8bpc(this.channels[c].buckets_ptrs[this.channels[c].correlate_row.zero].bestcode, this.io_word)\n this.channels[c].correlate_row.row[0] = a.rc\n cur_row[2 - c] = (family_8bpc.xlatL2U[this.channels[c].correlate_row.row[0]] + prev_row[2 - c]) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n } while (++c < n_channels)\n\n if (this.rgb_state.waitcnt) {\n --this.rgb_state.waitcnt\n } else {\n this.rgb_state.waitcnt = (this.rgb_state.tabrand() & waitmask)\n c = 0\n do {\n this.channels[c].buckets_ptrs[this.channels[c].correlate_row.zero].update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[0], bpc)\n } while (++c < n_channels)\n }\n stopidx = ++i + this.rgb_state.waitcnt\n } else {\n stopidx = i + this.rgb_state.waitcnt\n }\n for (;;) {\n let rc = 0\n while (stopidx < end && !rc) {\n for (; i <= stopidx && !rc; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n const pixelm2 = (i - 2) * rgb32_pixel_size\n\n if (prev_row[pixelm1 + rgb32_pixel_r] == prev_row[pixel + rgb32_pixel_r] && prev_row[pixelm1 + rgb32_pixel_g] == prev_row[pixel + rgb32_pixel_g] && prev_row[pixelm1 + rgb32_pixel_b] == prev_row[pixel + rgb32_pixel_b]) {\n if (run_index != i && i > 2 && (cur_row[pixelm1 + rgb32_pixel_r] == cur_row[pixelm2 + rgb32_pixel_r] && cur_row[pixelm1 + rgb32_pixel_g] == cur_row[pixelm2 + rgb32_pixel_g] && cur_row[pixelm1 + rgb32_pixel_b] == cur_row[pixelm2 + rgb32_pixel_b])) {\n /* do run */\n this.rgb_state.waitcnt = stopidx - i\n run_index = i\n run_end = i + this.decode_run(this.rgb_state)\n\n for (; i < run_end; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n cur_row[pixel + rgb32_pixel_pad] = 0\n cur_row[pixel + rgb32_pixel_r] = cur_row[pixelm1 + rgb32_pixel_r]\n cur_row[pixel + rgb32_pixel_g] = cur_row[pixelm1 + rgb32_pixel_g]\n cur_row[pixel + rgb32_pixel_b] = cur_row[pixelm1 + rgb32_pixel_b]\n }\n\n if (i == end) {\n return\n } else {\n stopidx = i + this.rgb_state.waitcnt\n rc = 1\n break\n }\n }\n }\n\n c = 0\n cur_row[pixel + rgb32_pixel_pad] = 0\n do {\n const cc = this.channels[c]\n const cr = cc.correlate_row\n\n a = golomb_decoding_8bpc(cc.buckets_ptrs[cr.row[i - 1]].bestcode, this.io_word)\n cr.row[i] = a.rc\n cur_row[pixel + (2 - c)] = (family_8bpc.xlatL2U[a.rc] + ((cur_row[pixelm1 + (2 - c)] + prev_row[pixel + (2 - c)]) >> 1)) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n } while (++c < n_channels)\n }\n if (rc) { break }\n\n c = 0\n do {\n this.channels[c].buckets_ptrs[this.channels[c].correlate_row.row[stopidx - 1]].update_model_8bpc(this.rgb_state, this.channels[c].correlate_row.row[stopidx], bpc)\n } while (++c < n_channels)\n\n stopidx = i + (this.rgb_state.tabrand() & waitmask)\n }\n\n for (; i < end && !rc; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n const pixelm2 = (i - 2) * rgb32_pixel_size\n\n if (prev_row[pixelm1 + rgb32_pixel_r] == prev_row[pixel + rgb32_pixel_r] && prev_row[pixelm1 + rgb32_pixel_g] == prev_row[pixel + rgb32_pixel_g] && prev_row[pixelm1 + rgb32_pixel_b] == prev_row[pixel + rgb32_pixel_b]) {\n if (run_index != i && i > 2 && (cur_row[pixelm1 + rgb32_pixel_r] == cur_row[pixelm2 + rgb32_pixel_r] && cur_row[pixelm1 + rgb32_pixel_g] == cur_row[pixelm2 + rgb32_pixel_g] && cur_row[pixelm1 + rgb32_pixel_b] == cur_row[pixelm2 + rgb32_pixel_b])) {\n /* do run */\n this.rgb_state.waitcnt = stopidx - i\n run_index = i\n run_end = i + this.decode_run(this.rgb_state)\n\n for (; i < run_end; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n cur_row[pixel + rgb32_pixel_pad] = 0\n cur_row[pixel + rgb32_pixel_r] = cur_row[pixelm1 + rgb32_pixel_r]\n cur_row[pixel + rgb32_pixel_g] = cur_row[pixelm1 + rgb32_pixel_g]\n cur_row[pixel + rgb32_pixel_b] = cur_row[pixelm1 + rgb32_pixel_b]\n }\n\n if (i == end) {\n return\n } else {\n stopidx = i + this.rgb_state.waitcnt\n rc = 1\n break\n }\n }\n }\n\n cur_row[pixel + rgb32_pixel_pad] = 0\n c = 0\n do {\n a = golomb_decoding_8bpc(this.channels[c].buckets_ptrs[this.channels[c].correlate_row.row[i - 1]].bestcode, this.io_word)\n this.channels[c].correlate_row.row[i] = a.rc\n cur_row[pixel + (2 - c)] = (family_8bpc.xlatL2U[a.rc] + ((cur_row[pixelm1 + (2 - c)] + prev_row[pixel + (2 - c)]) >> 1)) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n } while (++c < n_channels)\n }\n\n if (!rc) {\n this.rgb_state.waitcnt = stopidx - end\n return\n }\n }\n }\n\n decode_run (state: CommonState): number {\n let runlen = 0\n\n do {\n let hits: number\n const x = (~(this.io_word >>> 24) >>> 0) & 0xff\n const temp = zeroLUT[x]\n\n for (hits = 1; hits <= temp; hits++) {\n runlen += state.melcorder\n\n if (state.melcstate < 32) {\n state.melclen = J[++state.melcstate]\n state.melcorder = (1 << state.melclen)\n }\n }\n if (temp != 8) {\n this.decode_eatbits(temp + 1)\n break\n }\n this.decode_eatbits(8)\n } while (true)\n\n if (state.melclen) {\n runlen += this.io_word >>> (32 - state.melclen)\n this.decode_eatbits(state.melclen)\n }\n\n if (state.melcstate) {\n state.melclen = J[--state.melcstate]\n state.melcorder = (1 << state.melclen)\n }\n\n return runlen\n }\n\n quic_rgb32_uncompress_row (prev_row: Uint8Array, cur_row: Uint8Array): void {\n const bpc = 8\n const bpc_mask = 0xff\n let pos = 0\n let width = this.width\n\n while ((wmimax > this.rgb_state.wmidx) && (this.rgb_state.wmileft <= width)) {\n if (this.rgb_state.wmileft) {\n this.quic_rgb32_uncompress_row_seg(prev_row, cur_row, pos,\n pos + this.rgb_state.wmileft, bpc, bpc_mask)\n pos += this.rgb_state.wmileft\n width -= this.rgb_state.wmileft\n }\n\n this.rgb_state.wmidx++\n this.rgb_state.set_wm_trigger()\n this.rgb_state.wmileft = wminext\n }\n\n if (width) {\n this.quic_rgb32_uncompress_row_seg(prev_row, cur_row, pos,\n pos + width, bpc, bpc_mask)\n if (wmimax > this.rgb_state.wmidx) {\n this.rgb_state.wmileft -= width\n }\n }\n }\n\n quic_four_uncompress_row0_seg (channel: QuicChannel, i: number, correlate_row: { zero: number, row: number[] }, cur_row: Uint8Array, end: number, waitmask: number, bpc: number, bpc_mask: number): void {\n let stopidx: number\n let a: { codewordlen: number, rc: number }\n\n if (i == 0) {\n a = golomb_decoding_8bpc(channel.buckets_ptrs[correlate_row.zero].bestcode, this.io_word)\n correlate_row.row[0] = a.rc\n cur_row[rgb32_pixel_pad] = family_8bpc.xlatL2U[a.rc]\n this.decode_eatbits(a.codewordlen)\n\n if (channel.state.waitcnt) {\n --channel.state.waitcnt\n } else {\n channel.state.waitcnt = (channel.state.tabrand() & waitmask)\n channel.buckets_ptrs[correlate_row.zero].update_model_8bpc(channel.state, correlate_row.row[0], bpc)\n }\n stopidx = ++i + channel.state.waitcnt\n } else {\n stopidx = i + channel.state.waitcnt\n }\n\n while (stopidx < end) {\n let pbucket: QuicBucket\n\n for (; i <= stopidx; i++) {\n pbucket = channel.buckets_ptrs[correlate_row.row[i - 1]]\n\n a = golomb_decoding_8bpc(pbucket.bestcode, this.io_word)\n correlate_row.row[i] = a.rc\n cur_row[(i * rgb32_pixel_size) + rgb32_pixel_pad] = (family_8bpc.xlatL2U[a.rc] + cur_row[((i - 1) * rgb32_pixel_size) + rgb32_pixel_pad]) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n }\n\n pbucket.update_model_8bpc(channel.state, correlate_row.row[stopidx], bpc)\n\n stopidx = i + (channel.state.tabrand() & waitmask)\n }\n\n for (; i < end; i++) {\n a = golomb_decoding_8bpc(channel.buckets_ptrs[correlate_row.row[i - 1]].bestcode, this.io_word)\n\n correlate_row.row[i] = a.rc\n cur_row[(i * rgb32_pixel_size) + rgb32_pixel_pad] = (family_8bpc.xlatL2U[a.rc] + cur_row[((i - 1) * rgb32_pixel_size) + rgb32_pixel_pad]) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n }\n channel.state.waitcnt = stopidx - end\n }\n\n quic_four_uncompress_row0 (channel: QuicChannel, cur_row: Uint8Array): void {\n const bpc = 8\n const bpc_mask = 0xff\n const correlate_row = channel.correlate_row\n let pos = 0\n let width = this.width\n\n while ((wmimax > channel.state.wmidx) && (channel.state.wmileft <= width)) {\n if (channel.state.wmileft) {\n this.quic_four_uncompress_row0_seg(channel, pos, correlate_row, cur_row,\n pos + channel.state.wmileft, bppmask[channel.state.wmidx],\n bpc, bpc_mask)\n pos += channel.state.wmileft\n width -= channel.state.wmileft\n }\n\n channel.state.wmidx++\n channel.state.set_wm_trigger()\n channel.state.wmileft = wminext\n }\n\n if (width) {\n this.quic_four_uncompress_row0_seg(channel, pos, correlate_row, cur_row, pos + width,\n bppmask[channel.state.wmidx], bpc, bpc_mask)\n if (wmimax > channel.state.wmidx) {\n channel.state.wmileft -= width\n }\n }\n }\n\n quic_four_uncompress_row_seg (channel: QuicChannel, correlate_row: { zero: number, row: number[] }, prev_row: Uint8Array, cur_row: Uint8Array, i: number, end: number, bpc: number, bpc_mask: number): void {\n const waitmask = bppmask[channel.state.wmidx]\n let stopidx: number\n\n let run_index = 0\n let run_end: number\n\n let a: { codewordlen: number, rc: number }\n\n if (i == 0) {\n a = golomb_decoding_8bpc(channel.buckets_ptrs[correlate_row.zero].bestcode, this.io_word)\n\n correlate_row.row[0] = a.rc\n cur_row[rgb32_pixel_pad] = (family_8bpc.xlatL2U[a.rc] + prev_row[rgb32_pixel_pad]) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n\n if (channel.state.waitcnt) {\n --channel.state.waitcnt\n } else {\n channel.state.waitcnt = (channel.state.tabrand() & waitmask)\n channel.buckets_ptrs[correlate_row.zero].update_model_8bpc(channel.state, correlate_row.row[0], bpc)\n }\n stopidx = ++i + channel.state.waitcnt\n } else {\n stopidx = i + channel.state.waitcnt\n }\n for (;;) {\n let rc = 0\n while (stopidx < end && !rc) {\n let pbucket: QuicBucket\n for (; i <= stopidx && !rc; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n const pixelm2 = (i - 2) * rgb32_pixel_size\n\n if (prev_row[pixelm1 + rgb32_pixel_pad] == prev_row[pixel + rgb32_pixel_pad]) {\n if (run_index != i && i > 2 && cur_row[pixelm1 + rgb32_pixel_pad] == cur_row[pixelm2 + rgb32_pixel_pad]) {\n /* do run */\n channel.state.waitcnt = stopidx - i\n run_index = i\n\n run_end = i + this.decode_run(channel.state)\n\n for (; i < run_end; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n cur_row[pixel + rgb32_pixel_pad] = cur_row[pixelm1 + rgb32_pixel_pad]\n }\n\n if (i == end) {\n return\n } else {\n stopidx = i + channel.state.waitcnt\n rc = 1\n break\n }\n }\n }\n\n pbucket = channel.buckets_ptrs[correlate_row.row[i - 1]]\n a = golomb_decoding_8bpc(pbucket.bestcode, this.io_word)\n correlate_row.row[i] = a.rc\n cur_row[pixel + rgb32_pixel_pad] = (family_8bpc.xlatL2U[a.rc] + ((cur_row[pixelm1 + rgb32_pixel_pad] + prev_row[pixel + rgb32_pixel_pad]) >> 1)) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n }\n if (rc) { break }\n\n pbucket.update_model_8bpc(channel.state, correlate_row.row[stopidx], bpc)\n\n stopidx = i + (channel.state.tabrand() & waitmask)\n }\n\n for (; i < end && !rc; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n const pixelm2 = (i - 2) * rgb32_pixel_size\n if (prev_row[pixelm1 + rgb32_pixel_pad] == prev_row[pixel + rgb32_pixel_pad]) {\n if (run_index != i && i > 2 && cur_row[pixelm1 + rgb32_pixel_pad] == cur_row[pixelm2 + rgb32_pixel_pad]) {\n /* do run */\n channel.state.waitcnt = stopidx - i\n run_index = i\n\n run_end = i + this.decode_run(channel.state)\n\n for (; i < run_end; i++) {\n const pixel = i * rgb32_pixel_size\n const pixelm1 = (i - 1) * rgb32_pixel_size\n cur_row[pixel + rgb32_pixel_pad] = cur_row[pixelm1 + rgb32_pixel_pad]\n }\n\n if (i == end) {\n return\n } else {\n stopidx = i + channel.state.waitcnt\n rc = 1\n break\n }\n }\n }\n\n a = golomb_decoding_8bpc(channel.buckets_ptrs[correlate_row.row[i - 1]].bestcode, this.io_word)\n correlate_row.row[i] = a.rc\n cur_row[pixel + rgb32_pixel_pad] = (family_8bpc.xlatL2U[a.rc] + ((cur_row[pixelm1 + rgb32_pixel_pad] + prev_row[pixel + rgb32_pixel_pad]) >> 1)) & bpc_mask\n this.decode_eatbits(a.codewordlen)\n }\n\n if (!rc) {\n channel.state.waitcnt = stopidx - end\n return\n }\n }\n }\n\n quic_four_uncompress_row (channel: QuicChannel, prev_row: Uint8Array, cur_row: Uint8Array): void {\n const bpc = 8\n const bpc_mask = 0xff\n const correlate_row = channel.correlate_row\n let pos = 0\n let width = this.width\n\n while ((wmimax > channel.state.wmidx) && (channel.state.wmileft <= width)) {\n if (channel.state.wmileft) {\n this.quic_four_uncompress_row_seg(channel, correlate_row, prev_row, cur_row, pos,\n pos + channel.state.wmileft, bpc, bpc_mask)\n pos += channel.state.wmileft\n width -= channel.state.wmileft\n }\n\n channel.state.wmidx++\n channel.state.set_wm_trigger()\n channel.state.wmileft = wminext\n }\n\n if (width) {\n this.quic_four_uncompress_row_seg(channel, correlate_row, prev_row, cur_row, pos,\n pos + width, bpc, bpc_mask)\n if (wmimax > channel.state.wmidx) {\n channel.state.wmileft -= width\n }\n }\n }\n\n quic_decode (buf: Uint8Array, stride: number): boolean {\n let row: number\n\n switch (this.type) {\n case Constants.QUIC_IMAGE_TYPE_RGB32:\n case Constants.QUIC_IMAGE_TYPE_RGB24:\n this.channels[0].correlate_row.zero = 0\n this.channels[1].correlate_row.zero = 0\n this.channels[2].correlate_row.zero = 0\n this.quic_rgb32_uncompress_row0(buf)\n\n this.rows_completed++\n for (row = 1; row < this.height; row++) {\n const prev = buf\n buf = prev.subarray(stride)\n this.channels[0].correlate_row.zero = this.channels[0].correlate_row.row[0]\n this.channels[1].correlate_row.zero = this.channels[1].correlate_row.row[0]\n this.channels[2].correlate_row.zero = this.channels[2].correlate_row.row[0]\n this.quic_rgb32_uncompress_row(prev, buf)\n this.rows_completed++\n }\n break\n case Constants.QUIC_IMAGE_TYPE_RGB16:\n console.log('quic: unsupported output format\\n')\n return false\n case Constants.QUIC_IMAGE_TYPE_RGBA:\n this.channels[0].correlate_row.zero = 0\n this.channels[1].correlate_row.zero = 0\n this.channels[2].correlate_row.zero = 0\n this.quic_rgb32_uncompress_row0(buf)\n\n this.channels[3].correlate_row.zero = 0\n this.quic_four_uncompress_row0(this.channels[3], buf)\n\n this.rows_completed++\n for (row = 1; row < this.height; row++) {\n const prev = buf\n buf = prev.subarray(stride)\n\n this.channels[0].correlate_row.zero = this.channels[0].correlate_row.row[0]\n this.channels[1].correlate_row.zero = this.channels[1].correlate_row.row[0]\n this.channels[2].correlate_row.zero = this.channels[2].correlate_row.row[0]\n this.quic_rgb32_uncompress_row(prev, buf)\n\n this.channels[3].correlate_row.zero = this.channels[3].correlate_row.row[0]\n this.quic_four_uncompress_row(this.channels[3], prev, buf)\n this.rows_completed++\n }\n break\n\n case Constants.QUIC_IMAGE_TYPE_GRAY:\n console.log('quic: unsupported output format\\n')\n return false\n\n case Constants.QUIC_IMAGE_TYPE_INVALID:\n default:\n console.log('quic: bad image type\\n')\n return false\n }\n return true\n }\n\n simple_quic_decode (buf: Uint8Array): Uint8Array | undefined {\n const stride = 4 /* FIXME - proper stride calc please */\n if (!this.quic_decode_begin(buf)) { return undefined }\n if (this.type != Constants.QUIC_IMAGE_TYPE_RGB32 && this.type != Constants.QUIC_IMAGE_TYPE_RGB24 &&\n this.type != Constants.QUIC_IMAGE_TYPE_RGBA) { return undefined }\n const out = new Uint8Array(this.width * this.height * 4)\n out[0] = 69\n if (this.quic_decode(out, (this.width * stride))) { return out }\n return undefined\n }\n}\n\nclass SpiceQuic {\n data_size: number = 0\n outptr: Uint8Array | undefined\n type: number = 0\n width: number = 0\n height: number = 0\n\n from_dv (dv: DataView, at: number, mb: ArrayBuffer): number {\n if (!encoder) { throw ('quic: no quic encoder') }\n this.data_size = dv.getUint32(at, true)\n at += 4\n const buf = new Uint8Array(mb.slice(at))\n this.outptr = encoder.simple_quic_decode(buf)\n if (this.outptr) {\n this.type = encoder.type\n this.width = encoder.width\n this.height = encoder.height\n }\n at += buf.length\n return at\n }\n}\n\nfunction convert_spice_quic_to_web (context: CanvasRenderingContext2D, spice_quic: SpiceQuic): ImageData {\n const ret = context.createImageData(spice_quic.width, spice_quic.height)\n for (let i = 0; i < (ret.width * ret.height * 4); i += 4) {\n ret.data[i + 0] = spice_quic.outptr[i + 2]\n ret.data[i + 1] = spice_quic.outptr[i + 1]\n ret.data[i + 2] = spice_quic.outptr[i + 0]\n if (spice_quic.type !== Constants.QUIC_IMAGE_TYPE_RGBA) { ret.data[i + 3] = 255 } else { ret.data[i + 3] = 255 - spice_quic.outptr[i + 3] }\n }\n return ret\n}\n\n/* Module initialization */\nif (need_init) {\n need_init = false\n\n family_init(family_8bpc, 8, DEFmaxclen)\n family_init(family_5bpc, 5, DEFmaxclen)\n /* init_zeroLUT */\n let i, j, k, l\n\n j = k = 1\n l = 8\n for (i = 0; i < 256; ++i) {\n zeroLUT[i] = l\n --k\n if (k == 0) {\n k = j\n --l\n j *= 2\n }\n }\n\n encoder = new QuicEncoder()\n\n if (!encoder) { throw ('quic: failed to create encoder') }\n}\n\nexport {\n Constants,\n SpiceQuic,\n convert_spice_quic_to_web\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** Spice types\n** This file contains classes for common spice types.\n** Generally, they are used as helpers in reading and writing messages\n** to and from the server.\n**-------------------------------------------------------------------------- */\n\nimport { Constants } from './enums'\nimport { SpiceQuic } from './quic'\nimport { SpiceDataView } from './spicedataview'\n\nexport class SpiceChannelId {\n type: number = 0\n id: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.type = dv.getUint8(at, true); at++\n this.id = dv.getUint8(at, true); at++\n return at\n }\n}\n\nexport class SpiceRect {\n top: number = 0\n left: number = 0\n bottom: number = 0\n right: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.top = dv.getUint32(at, true); at += 4\n this.left = dv.getUint32(at, true); at += 4\n this.bottom = dv.getUint32(at, true); at += 4\n this.right = dv.getUint32(at, true); at += 4\n return at\n }\n\n is_same_size (r: SpiceRect): boolean {\n if ((this.bottom - this.top) == (r.bottom - r.top) &&\n (this.right - this.left) == (r.right - r.left)) {\n return true\n }\n return false\n }\n}\n\nexport class SpiceClipRects {\n num_rects: number = 0\n rects: SpiceRect[] = []\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n let i: number\n this.num_rects = dv.getUint32(at, true); at += 4\n if (this.num_rects > 0) {\n this.rects = []\n }\n for (i = 0; i < this.num_rects; i++) {\n this.rects[i] = new SpiceRect()\n at = this.rects[i].from_dv(dv, at, mb)\n }\n return at\n }\n}\n\nexport class SpiceClip {\n type: number = 0\n rects: SpiceClipRects | undefined\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.type = dv.getUint8(at, true); at++\n if (this.type == Constants.SPICE_CLIP_TYPE_RECTS) {\n this.rects = new SpiceClipRects()\n at = this.rects.from_dv(dv, at, mb)\n }\n return at\n }\n}\n\nexport class SpiceImageDescriptor {\n id: number = 0\n type: number = 0\n flags: number = 0\n width: number = 0\n height: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.id = dv.getUint64(at, true); at += 8\n this.type = dv.getUint8(at, true); at++\n this.flags = dv.getUint8(at, true); at++\n this.width = dv.getUint32(at, true); at += 4\n this.height = dv.getUint32(at, true); at += 4\n return at\n }\n}\n\nexport class SpicePalette {\n unique: number = 0\n num_ents: number = 0\n ents: number[] = []\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n let i: number\n this.unique = dv.getUint64(at, true); at += 8\n this.num_ents = dv.getUint16(at, true); at += 2\n this.ents = []\n for (i = 0; i < this.num_ents; i++) {\n this.ents[i] = dv.getUint32(at, true); at += 4\n }\n return at\n }\n}\n\nexport class SpiceBitmap {\n format: number = 0\n flags: number = 0\n x: number = 0\n y: number = 0\n stride: number = 0\n palette_id?: number\n palette: SpicePalette | null = null\n data: ArrayBuffer = new ArrayBuffer(0)\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.format = dv.getUint8(at, true); at++\n this.flags = dv.getUint8(at, true); at++\n this.x = dv.getUint32(at, true); at += 4\n this.y = dv.getUint32(at, true); at += 4\n this.stride = dv.getUint32(at, true); at += 4\n if (this.flags & Constants.SPICE_BITMAP_FLAGS_PAL_FROM_CACHE) {\n this.palette_id = dv.getUint64(at, true); at += 8\n } else {\n const offset = dv.getUint32(at, true); at += 4\n if (offset == 0) {\n this.palette = null\n } else {\n this.palette = new SpicePalette()\n this.palette.from_dv(dv, offset, mb)\n }\n }\n // FIXME - should probably constrain this to the offset\n // of palette, if non zero\n this.data = mb.slice(at)\n at += this.data.byteLength\n return at\n }\n}\n\nexport class SpiceImage {\n descriptor: SpiceImageDescriptor = new SpiceImageDescriptor()\n lz_rgb?: any\n bitmap?: SpiceBitmap\n surface_id?: number\n jpeg?: any\n jpeg_alpha?: any\n quic?: SpiceQuic\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.descriptor = new SpiceImageDescriptor()\n at = this.descriptor.from_dv(dv, at, mb)\n\n if (this.descriptor.type == Constants.SPICE_IMAGE_TYPE_LZ_RGB) {\n this.lz_rgb = new Object()\n this.lz_rgb.length = dv.getUint32(at, true); at += 4\n var initial_at = at\n this.lz_rgb.magic = ''\n for (var i = 3; i >= 0; i--) {\n this.lz_rgb.magic += String.fromCharCode(dv.getUint8(at + i))\n }\n at += 4\n\n // NOTE: The endian change is *correct*\n this.lz_rgb.version = dv.getUint32(at); at += 4\n this.lz_rgb.type = dv.getUint32(at); at += 4\n this.lz_rgb.width = dv.getUint32(at); at += 4\n this.lz_rgb.height = dv.getUint32(at); at += 4\n this.lz_rgb.stride = dv.getUint32(at); at += 4\n this.lz_rgb.top_down = dv.getUint32(at); at += 4\n\n var header_size = at - initial_at\n\n this.lz_rgb.data = mb.slice(at, this.lz_rgb.length + at - header_size)\n at += this.lz_rgb.data.byteLength\n }\n\n if (this.descriptor.type == Constants.SPICE_IMAGE_TYPE_BITMAP) {\n this.bitmap = new SpiceBitmap()\n at = this.bitmap.from_dv(dv, at, mb)\n }\n\n if (this.descriptor.type == Constants.SPICE_IMAGE_TYPE_SURFACE) {\n this.surface_id = dv.getUint32(at, true); at += 4\n }\n\n if (this.descriptor.type == Constants.SPICE_IMAGE_TYPE_JPEG) {\n this.jpeg = new Object()\n this.jpeg.data_size = dv.getUint32(at, true); at += 4\n this.jpeg.data = mb.slice(at)\n at += this.jpeg.data.byteLength\n }\n\n if (this.descriptor.type == Constants.SPICE_IMAGE_TYPE_JPEG_ALPHA) {\n this.jpeg_alpha = new Object()\n this.jpeg_alpha.flags = dv.getUint8(at, true); at += 1\n this.jpeg_alpha.jpeg_size = dv.getUint32(at, true); at += 4\n this.jpeg_alpha.data_size = dv.getUint32(at, true); at += 4\n this.jpeg_alpha.data = mb.slice(at, this.jpeg_alpha.jpeg_size + at)\n at += this.jpeg_alpha.data.byteLength\n // Alpha channel is an LZ image\n this.jpeg_alpha.alpha = new Object()\n this.jpeg_alpha.alpha.length = this.jpeg_alpha.data_size - this.jpeg_alpha.jpeg_size\n var initial_at = at\n this.jpeg_alpha.alpha.magic = ''\n for (var i = 3; i >= 0; i--) {\n this.jpeg_alpha.alpha.magic += String.fromCharCode(dv.getUint8(at + i))\n }\n at += 4\n\n // NOTE: The endian change is *correct*\n this.jpeg_alpha.alpha.version = dv.getUint32(at); at += 4\n this.jpeg_alpha.alpha.type = dv.getUint32(at); at += 4\n this.jpeg_alpha.alpha.width = dv.getUint32(at); at += 4\n this.jpeg_alpha.alpha.height = dv.getUint32(at); at += 4\n this.jpeg_alpha.alpha.stride = dv.getUint32(at); at += 4\n this.jpeg_alpha.alpha.top_down = dv.getUint32(at); at += 4\n\n var header_size = at - initial_at\n\n this.jpeg_alpha.alpha.data = mb.slice(at, this.jpeg_alpha.alpha.length + at - header_size)\n at += this.jpeg_alpha.alpha.data.byteLength\n }\n\n if (this.descriptor.type == Constants.SPICE_IMAGE_TYPE_QUIC) {\n this.quic = new SpiceQuic()\n at = this.quic.from_dv(dv, at, mb)\n }\n return at\n }\n}\n\nexport class SpiceQMask {\n flags: number = 0\n pos: SpicePoint = new SpicePoint()\n bitmap: SpiceImage | null = null\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.flags = dv.getUint8(at, true); at++\n this.pos = new SpicePoint()\n at = this.pos.from_dv(dv, at, mb)\n const offset = dv.getUint32(at, true); at += 4\n if (offset == 0) {\n this.bitmap = null\n return at\n }\n\n this.bitmap = new SpiceImage()\n return this.bitmap.from_dv(dv, offset, mb)\n }\n}\n\nexport class SpicePattern {\n pat: SpiceImage | null = null\n pos: SpicePoint = new SpicePoint()\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n const offset = dv.getUint32(at, true); at += 4\n if (offset == 0) {\n this.pat = null\n } else {\n this.pat = new SpiceImage()\n this.pat.from_dv(dv, offset, mb)\n }\n\n this.pos = new SpicePoint()\n return this.pos.from_dv(dv, at, mb)\n }\n}\n\nexport class SpiceBrush {\n type: number = 0\n color?: number\n pattern?: SpicePattern\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.type = dv.getUint8(at, true); at++\n if (this.type == Constants.SPICE_BRUSH_TYPE_SOLID) {\n this.color = dv.getUint32(at, true); at += 4\n } else if (this.type == Constants.SPICE_BRUSH_TYPE_PATTERN) {\n this.pattern = new SpicePattern()\n at = this.pattern.from_dv(dv, at, mb)\n }\n return at\n }\n}\n\nexport class SpiceFill {\n brush: SpiceBrush = new SpiceBrush()\n rop_descriptor: number = 0\n mask: SpiceQMask = new SpiceQMask()\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.brush = new SpiceBrush()\n at = this.brush.from_dv(dv, at, mb)\n this.rop_descriptor = dv.getUint16(at, true); at += 2\n this.mask = new SpiceQMask()\n return this.mask.from_dv(dv, at, mb)\n }\n}\n\nexport class SpiceCopy {\n src_bitmap: SpiceImage | null = null\n src_area: SpiceRect = new SpiceRect()\n rop_descriptor: number = 0\n scale_mode: number = 0\n mask: SpiceQMask = new SpiceQMask()\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n const offset = dv.getUint32(at, true); at += 4\n if (offset == 0) {\n this.src_bitmap = null\n } else {\n this.src_bitmap = new SpiceImage()\n this.src_bitmap.from_dv(dv, offset, mb)\n }\n this.src_area = new SpiceRect()\n at = this.src_area.from_dv(dv, at, mb)\n this.rop_descriptor = dv.getUint16(at, true); at += 2\n this.scale_mode = dv.getUint8(at, true); at++\n this.mask = new SpiceQMask()\n return this.mask.from_dv(dv, at, mb)\n }\n}\n\nexport class SpicePoint16 {\n x: number = 0\n y: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.x = dv.getUint16(at, true); at += 2\n this.y = dv.getUint16(at, true); at += 2\n return at\n }\n}\n\nexport class SpicePoint {\n x: number = 0\n y: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.x = dv.getUint32(at, true); at += 4\n this.y = dv.getUint32(at, true); at += 4\n return at\n }\n}\n\nexport class SpiceCursorHeader {\n unique: number = 0\n type: number = 0\n width: number = 0\n height: number = 0\n hot_spot_x: number = 0\n hot_spot_y: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.unique = dv.getUint64(at, true); at += 8\n this.type = dv.getUint8(at, true); at++\n this.width = dv.getUint16(at, true); at += 2\n this.height = dv.getUint16(at, true); at += 2\n this.hot_spot_x = dv.getUint16(at, true); at += 2\n this.hot_spot_y = dv.getUint16(at, true); at += 2\n return at\n }\n}\n\nexport class SpiceCursor {\n flags: number = 0\n header: SpiceCursorHeader | null = null\n data: ArrayBuffer = new ArrayBuffer(0)\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.flags = dv.getUint16(at, true); at += 2\n if (this.flags & Constants.SPICE_CURSOR_FLAGS_NONE) {\n this.header = null\n } else {\n this.header = new SpiceCursorHeader()\n at = this.header.from_dv(dv, at, mb)\n this.data = mb.slice(at)\n at += this.data.byteLength\n }\n return at\n }\n}\n\nexport class SpiceSurface {\n surface_id: number = 0\n width: number = 0\n height: number = 0\n format: number = 0\n flags: number = 0\n\n from_dv (dv: DataView | SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.surface_id = dv.getUint32(at, true); at += 4\n this.width = dv.getUint32(at, true); at += 4\n this.height = dv.getUint32(at, true); at += 4\n this.format = dv.getUint32(at, true); at += 4\n this.flags = dv.getUint32(at, true); at += 4\n return at\n }\n}\n\n/* FIXME - SpiceImage types lz_plt, jpeg, zlib_glz, and jpeg_alpha are\n completely unimplemented */\n","/*\n Copyright (C) 2012 by Aric Stewart <aric@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n/*\n * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.\n *\n * Permission to use, copy, modify, distribute, and sell this software and its\n * documentation for any purpose is hereby granted without fee, provided that\n * the above copyright notice appear in all copies and that both that\n * copyright notice and this permission notice appear in supporting\n * documentation, and that the name of Thomas Roell not be used in\n * advertising or publicity pertaining to distribution of the software without\n * specific, written prior permission. Thomas Roell makes no representations\n * about the suitability of this software for any purpose. It is provided\n * \"as is\" without express or implied warranty.\n *\n * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO\n * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,\n * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n */\n/*\n * Copyright (c) 1994-2003 by The XFree86 Project, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * Except as contained in this notice, the name of the copyright holder(s)\n * and author(s) shall not be used in advertising or otherwise to promote\n * the sale, use or other dealings in this Software without prior written\n * authorization from the copyright holder(s) and author(s).\n */\n\n/*\n * NOTE: The AT/MF keyboards can generate (via the 8042) two (MF: three)\n * sets of scancodes. Set3 can only be generated by a MF keyboard.\n * Set2 sends a makecode for keypress, and the same code prefixed by a\n * F0 for keyrelease. This is a little bit ugly to handle. Thus we use\n * here for X386 the PC/XT compatible Set1. This set uses 8bit scancodes.\n * Bit 7 ist set if the key is released. The code E0 switches to a\n * different meaning to add the new MF cursorkeys, while not breaking old\n * applications. E1 is another special prefix. Since I assume that there\n * will be further versions of PC/XT scancode compatible keyboards, we\n * may be in trouble one day.\n *\n * IDEA: 1) Use Set2 on AT84 keyboards and translate it to MF Set3.\n * 2) Use the keyboards native set and translate it to common keysyms.\n */\n\nexport const KeyNames = {\n/*\n * definition of the AT84/MF101/MF102 Keyboard:\n * ============================================================\n * Defined Key Cap Glyphs Pressed value\n * Key Name Main Also (hex) (dec)\n * ---------------- ---------- ------- ------ ------\n */\n KEY_Escape: /* Escape 0x01 */ 1,\n KEY_1: /* 1 ! 0x02 */ 2,\n KEY_2: /* 2 @ 0x03 */ 3,\n KEY_3: /* 3 # 0x04 */ 4,\n KEY_4: /* 4 $ 0x05 */ 5,\n KEY_5: /* 5 % 0x06 */ 6,\n KEY_6: /* 6 ^ 0x07 */ 7,\n KEY_7: /* 7 & 0x08 */ 8,\n KEY_8: /* 8 * 0x09 */ 9,\n KEY_9: /* 9 ( 0x0a */ 10,\n KEY_0: /* 0 ) 0x0b */ 11,\n KEY_Minus: /* - (Minus) _ (Under) 0x0c */ 12,\n KEY_Equal: /* = (Equal) + 0x0d */ 13,\n KEY_BackSpace: /* Back Space 0x0e */ 14,\n KEY_Tab: /* Tab 0x0f */ 15,\n KEY_Q: /* Q 0x10 */ 16,\n KEY_W: /* W 0x11 */ 17,\n KEY_E: /* E 0x12 */ 18,\n KEY_R: /* R 0x13 */ 19,\n KEY_T: /* T 0x14 */ 20,\n KEY_Y: /* Y 0x15 */ 21,\n KEY_U: /* U 0x16 */ 22,\n KEY_I: /* I 0x17 */ 23,\n KEY_O: /* O 0x18 */ 24,\n KEY_P: /* P 0x19 */ 25,\n KEY_LBrace: /* [ { 0x1a */ 26,\n KEY_RBrace: /* ] } 0x1b */ 27,\n KEY_Enter: /* Enter 0x1c */ 28,\n KEY_LCtrl: /* Ctrl(left) 0x1d */ 29,\n KEY_A: /* A 0x1e */ 30,\n KEY_S: /* S 0x1f */ 31,\n KEY_D: /* D 0x20 */ 32,\n KEY_F: /* F 0x21 */ 33,\n KEY_G: /* G 0x22 */ 34,\n KEY_H: /* H 0x23 */ 35,\n KEY_J: /* J 0x24 */ 36,\n KEY_K: /* K 0x25 */ 37,\n KEY_L: /* L 0x26 */ 38,\n KEY_SemiColon: /* ;(SemiColon) :(Colon) 0x27 */ 39,\n KEY_Quote: /* ' (Apostr) \" (Quote) 0x28 */ 40,\n KEY_Tilde: /* ` (Accent) ~ (Tilde) 0x29 */ 41,\n KEY_ShiftL: /* Shift(left) 0x2a */ 42,\n KEY_BSlash: /* \\(BckSlash) |(VertBar)0x2b */ 43,\n KEY_Z: /* Z 0x2c */ 44,\n KEY_X: /* X 0x2d */ 45,\n KEY_C: /* C 0x2e */ 46,\n KEY_V: /* V 0x2f */ 47,\n KEY_B: /* B 0x30 */ 48,\n KEY_N: /* N 0x31 */ 49,\n KEY_M: /* M 0x32 */ 50,\n KEY_Comma: /* , (Comma) < (Less) 0x33 */ 51,\n KEY_Period: /* . (Period) >(Greater)0x34 */ 52,\n KEY_Slash: /* / (Slash) ? 0x35 */ 53,\n KEY_ShiftR: /* Shift(right) 0x36 */ 54,\n KEY_KP_Multiply: /* * 0x37 */ 55,\n KEY_Alt: /* Alt(left) 0x38 */ 56,\n KEY_Space: /* (SpaceBar) 0x39 */ 57,\n KEY_CapsLock: /* CapsLock 0x3a */ 58,\n KEY_F1: /* F1 0x3b */ 59,\n KEY_F2: /* F2 0x3c */ 60,\n KEY_F3: /* F3 0x3d */ 61,\n KEY_F4: /* F4 0x3e */ 62,\n KEY_F5: /* F5 0x3f */ 63,\n KEY_F6: /* F6 0x40 */ 64,\n KEY_F7: /* F7 0x41 */ 65,\n KEY_F8: /* F8 0x42 */ 66,\n KEY_F9: /* F9 0x43 */ 67,\n KEY_F10: /* F10 0x44 */ 68,\n KEY_NumLock: /* NumLock 0x45 */ 69,\n KEY_ScrollLock: /* ScrollLock 0x46 */ 70,\n KEY_KP_7: /* 7 Home 0x47 */ 71,\n KEY_KP_8: /* 8 Up 0x48 */ 72,\n KEY_KP_9: /* 9 PgUp 0x49 */ 73,\n KEY_KP_Minus: /* - (Minus) 0x4a */ 74,\n KEY_KP_4: /* 4 Left 0x4b */ 75,\n KEY_KP_5: /* 5 0x4c */ 76,\n KEY_KP_6: /* 6 Right 0x4d */ 77,\n KEY_KP_Plus: /* + (Plus) 0x4e */ 78,\n KEY_KP_1: /* 1 End 0x4f */ 79,\n KEY_KP_2: /* 2 Down 0x50 */ 80,\n KEY_KP_3: /* 3 PgDown 0x51 */ 81,\n KEY_KP_0: /* 0 Insert 0x52 */ 82,\n KEY_KP_Decimal: /* . (Decimal) Delete 0x53 */ 83,\n KEY_SysRequest: /* SysRequest 0x54 */ 84,\n /* NOTUSED 0x55 */\n KEY_Less: /* < (Less) >(Greater) 0x56 */ 86,\n KEY_F11: /* F11 0x57 */ 87,\n KEY_F12: /* F12 0x58 */ 88,\n\n KEY_Prefix0: /* special 0x60 */ 96,\n KEY_Prefix1: /* specail 0x61 */ 97\n}\n","/*\n * @see https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values\n */\n\nexport interface CodeToScanCode {\n Escape: number\n Digit1: number\n Digit2: number\n Digit3: number\n Digit4: number\n Digit5: number\n Digit6: number\n Digit7: number\n Digit8: number\n Digit9: number\n Digit0: number\n Minus: number\n Equal: number\n Backspace: number\n Tab: number\n KeyQ: number\n KeyW: number\n KeyE: number\n KeyR: number\n KeyT: number\n KeyY: number\n KeyU: number\n KeyI: number\n KeyO: number\n KeyP: number\n BracketLeft: number\n BracketRight: number\n Enter: number\n ControlLeft: number\n KeyA: number\n KeyS: number\n KeyD: number\n KeyF: number\n KeyG: number\n KeyH: number\n KeyJ: number\n KeyK: number\n KeyL: number\n Semicolon: number\n Quote: number\n Backquote: number\n ShiftLeft: number\n Backslash: number\n KeyZ: number\n KeyX: number\n KeyC: number\n KeyV: number\n KeyB: number\n KeyN: number\n KeyM: number\n Comma: number\n Period: number\n Slash: number\n ShiftRight: number\n NumpadMultiply: number\n AltLeft: number\n Space: number\n CapsLock: number\n F1: number\n F2: number\n F3: number\n F4: number\n F5: number\n F6: number\n F7: number\n F8: number\n F9: number\n F10: number\n Pause: number\n ScrollLock: number\n Numpad7: number\n Numpad8: number\n Numpad9: number\n NumpadSubtract: number\n Numpad4: number\n Numpad5: number\n Numpad6: number\n NumpadAdd: number\n Numpad1: number\n Numpad2: number\n Numpad3: number\n Numpad0: number\n NumpadDecimal: number\n PrintScreen: number\n IntlBackslash: number\n F11: number\n F12: number\n NumpadEqual: number\n F13: number\n F14: number\n F15: number\n F16: number\n F17: number\n F18: number\n F19: number\n F20: number\n F21: number\n F22: number\n F23: number\n KanaMode: number\n IntlRo: number\n F24: number\n Convert: number\n NonConvert: number\n IntlYen: number\n NumpadComma: number\n MediaTrackPrevious: number\n MediaTrackNext: number\n NumpadEnter: number\n ControlRight: number\n AudioVolumeMute: number\n LaunchApp2: number\n MediaPlayPause: number\n MediaStop: number\n VolumeDown: number\n VolumeUp: number\n BrowserHome: number\n NumpadDivide: number\n AltRight: number\n NumLock: number\n Home: number\n ArrowUp: number\n PageUp: number\n ArrowLeft: number\n ArrowRight: number\n End: number\n ArrowDown: number\n PageDown: number\n Insert: number\n Delete: number\n MetaLeft: number\n MetaRight: number\n ContextMenu: number\n Power: number\n BrowserSearch: number\n BrowserFavorites: number\n BrowserRefresh: number\n BrowserStop: number\n BrowserForward: number\n BrowserBack: number\n LaunchApp1: number\n LaunchMail: number\n MediaSelect: number\n [key: string]: number\n}\n\nconst codeToScanCodeArr: any[] = []\n\ncodeToScanCodeArr.Escape = 0x01\ncodeToScanCodeArr.Digit1 = 0x02\ncodeToScanCodeArr.Digit2 = 0x03\ncodeToScanCodeArr.Digit3 = 0x04\ncodeToScanCodeArr.Digit4 = 0x05\ncodeToScanCodeArr.Digit5 = 0x06\ncodeToScanCodeArr.Digit6 = 0x07\ncodeToScanCodeArr.Digit7 = 0x08\ncodeToScanCodeArr.Digit8 = 0x09\ncodeToScanCodeArr.Digit9 = 0x0A\ncodeToScanCodeArr.Digit0 = 0x0B\ncodeToScanCodeArr.Minus = 0x0C\ncodeToScanCodeArr.Equal = 0x0D\ncodeToScanCodeArr.Backspace = 0x0E\ncodeToScanCodeArr.Tab = 0x0F\ncodeToScanCodeArr.KeyQ = 0x10\ncodeToScanCodeArr.KeyW = 0x11\ncodeToScanCodeArr.KeyE = 0x12\ncodeToScanCodeArr.KeyR = 0x13\ncodeToScanCodeArr.KeyT = 0x14\ncodeToScanCodeArr.KeyY = 0x15\ncodeToScanCodeArr.KeyU = 0x16\ncodeToScanCodeArr.KeyI = 0x17\ncodeToScanCodeArr.KeyO = 0x18\ncodeToScanCodeArr.KeyP = 0x19\ncodeToScanCodeArr.BracketLeft = 0x1A\ncodeToScanCodeArr.BracketRight = 0x1B\ncodeToScanCodeArr.Enter = 0x1C\ncodeToScanCodeArr.ControlLeft = 0x1D\ncodeToScanCodeArr.KeyA = 0x1E\ncodeToScanCodeArr.KeyS = 0x1F\ncodeToScanCodeArr.KeyD = 0x20\ncodeToScanCodeArr.KeyF = 0x21\ncodeToScanCodeArr.KeyG = 0x22\ncodeToScanCodeArr.KeyH = 0x23\ncodeToScanCodeArr.KeyJ = 0x24\ncodeToScanCodeArr.KeyK = 0x25\ncodeToScanCodeArr.KeyL = 0x26\ncodeToScanCodeArr.Semicolon = 0x27\ncodeToScanCodeArr.Quote = 0x28\ncodeToScanCodeArr.Backquote = 0x29\ncodeToScanCodeArr.ShiftLeft = 0x2A\ncodeToScanCodeArr.Backslash = 0x2B\ncodeToScanCodeArr.KeyZ = 0x2C\ncodeToScanCodeArr.KeyX = 0x2D\ncodeToScanCodeArr.KeyC = 0x2E\ncodeToScanCodeArr.KeyV = 0x2F\ncodeToScanCodeArr.KeyB = 0x30\ncodeToScanCodeArr.KeyN = 0x31\ncodeToScanCodeArr.KeyM = 0x32\ncodeToScanCodeArr.Comma = 0x33\ncodeToScanCodeArr.Period = 0x34\ncodeToScanCodeArr.Slash = 0x35\ncodeToScanCodeArr.ShiftRight = 0x36\ncodeToScanCodeArr.NumpadMultiply = 0x37\ncodeToScanCodeArr.AltLeft = 0x38\ncodeToScanCodeArr.Space = 0x39\ncodeToScanCodeArr.CapsLock = 0x3A\ncodeToScanCodeArr.F1 = 0x3B\ncodeToScanCodeArr.F2 = 0x3C\ncodeToScanCodeArr.F3 = 0x3D\ncodeToScanCodeArr.F4 = 0x3E\ncodeToScanCodeArr.F5 = 0x3F\ncodeToScanCodeArr.F6 = 0x40\ncodeToScanCodeArr.F7 = 0x41\ncodeToScanCodeArr.F8 = 0x42\ncodeToScanCodeArr.F9 = 0x43\ncodeToScanCodeArr.F10 = 0x44\ncodeToScanCodeArr.Pause = 0x45\ncodeToScanCodeArr.ScrollLock = 0x46\ncodeToScanCodeArr.Numpad7 = 0x47\ncodeToScanCodeArr.Numpad8 = 0x48\ncodeToScanCodeArr.Numpad9 = 0x49\ncodeToScanCodeArr.NumpadSubtract = 0x4A\ncodeToScanCodeArr.Numpad4 = 0x4B\ncodeToScanCodeArr.Numpad5 = 0x4C\ncodeToScanCodeArr.Numpad6 = 0x4D\ncodeToScanCodeArr.NumpadAdd = 0x4E\ncodeToScanCodeArr.Numpad1 = 0x4F\ncodeToScanCodeArr.Numpad2 = 0x50\ncodeToScanCodeArr.Numpad3 = 0x51\ncodeToScanCodeArr.Numpad0 = 0x52\ncodeToScanCodeArr.NumpadDecimal = 0x53\ncodeToScanCodeArr.PrintScreen = 0x54\ncodeToScanCodeArr.IntlBackslash = 0x56\ncodeToScanCodeArr.F11 = 0x57\ncodeToScanCodeArr.F12 = 0x58\ncodeToScanCodeArr.NumpadEqual = 0x59\ncodeToScanCodeArr.F13 = 0x64\ncodeToScanCodeArr.F14 = 0x65\ncodeToScanCodeArr.F15 = 0x66\ncodeToScanCodeArr.F16 = 0x67\ncodeToScanCodeArr.F17 = 0x68\ncodeToScanCodeArr.F18 = 0x69\ncodeToScanCodeArr.F19 = 0x6A\ncodeToScanCodeArr.F20 = 0x6B\ncodeToScanCodeArr.F21 = 0x6C\ncodeToScanCodeArr.F22 = 0x6D\ncodeToScanCodeArr.F23 = 0x6E\ncodeToScanCodeArr.KanaMode = 0x70\ncodeToScanCodeArr.IntlRo = 0x73\ncodeToScanCodeArr.F24 = 0x76\ncodeToScanCodeArr.Convert = 0x79\ncodeToScanCodeArr.NonConvert = 0x7B\ncodeToScanCodeArr.IntlYen = 0x7D\ncodeToScanCodeArr.NumpadComma = 0x7E\ncodeToScanCodeArr.MediaTrackPrevious = 0xE0 | (0x10 << 8)\ncodeToScanCodeArr.MediaTrackNext = 0xE0 | (0x19 << 8)\ncodeToScanCodeArr.NumpadEnter = 0xE0 | (0x1C << 8)\ncodeToScanCodeArr.ControlRight = 0xE0 | (0x1D << 8)\ncodeToScanCodeArr.AudioVolumeMute = 0xE0 | (0x20 << 8)\ncodeToScanCodeArr.LaunchApp2 = 0xE0 | (0x21 << 8)\ncodeToScanCodeArr.MediaPlayPause = 0xE0 | (0x22 << 8)\ncodeToScanCodeArr.MediaStop = 0xE0 | (0x24 << 8)\ncodeToScanCodeArr.VolumeDown = 0xE0 | (0x2E << 8)\ncodeToScanCodeArr.VolumeUp = 0xE0 | (0x30 << 8)\ncodeToScanCodeArr.BrowserHome = 0xE0 | (0x32 << 8)\ncodeToScanCodeArr.NumpadDivide = 0xE0 | (0x35 << 8)\ncodeToScanCodeArr.PrintScreen = 0xE0 | (0x37 << 8)\ncodeToScanCodeArr.AltRight = 0xE0 | (0x38 << 8)\ncodeToScanCodeArr.NumLock = 0xE0 | (0x45 << 8)\ncodeToScanCodeArr.Pause = 0xE0 | (0x46 << 8)\ncodeToScanCodeArr.Home = 0xE0 | (0x47 << 8)\ncodeToScanCodeArr.ArrowUp = 0xE0 | (0x48 << 8)\ncodeToScanCodeArr.PageUp = 0xE0 | (0x49 << 8)\ncodeToScanCodeArr.ArrowLeft = 0xE0 | (0x4B << 8)\ncodeToScanCodeArr.ArrowRight = 0xE0 | (0x4D << 8)\ncodeToScanCodeArr.End = 0xE0 | (0x4F << 8)\ncodeToScanCodeArr.ArrowDown = 0xE0 | (0x50 << 8)\ncodeToScanCodeArr.PageDown = 0xE0 | (0x51 << 8)\ncodeToScanCodeArr.Insert = 0xE0 | (0x52 << 8)\ncodeToScanCodeArr.Delete = 0xE0 | (0x53 << 8)\ncodeToScanCodeArr.MetaLeft = 0xE0 | (0x5B << 8)\ncodeToScanCodeArr.MetaRight = 0xE0 | (0x5C << 8)\ncodeToScanCodeArr.ContextMenu = 0xE0 | (0x5D << 8)\ncodeToScanCodeArr.Power = 0xE0 | (0x5E << 8)\ncodeToScanCodeArr.BrowserSearch = 0xE0 | (0x65 << 8)\ncodeToScanCodeArr.BrowserFavorites = 0xE0 | (0x66 << 8)\ncodeToScanCodeArr.BrowserRefresh = 0xE0 | (0x67 << 8)\ncodeToScanCodeArr.BrowserStop = 0xE0 | (0x68 << 8)\ncodeToScanCodeArr.BrowserForward = 0xE0 | (0x69 << 8)\ncodeToScanCodeArr.BrowserBack = 0xE0 | (0x6A << 8)\ncodeToScanCodeArr.LaunchApp1 = 0xE0 | (0x6B << 8)\ncodeToScanCodeArr.LaunchMail = 0xE0 | (0x6C << 8)\ncodeToScanCodeArr.MediaSelect = 0xE0 | (0x6D << 8)\n\nexport const code_to_scancode: CodeToScanCode = codeToScanCodeArr\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport { KeyNames } from './atKeynames'\nimport { code_to_scancode } from './code_to_scancode'\n\n/* ----------------------------------------------------------------------------\n** Utility settings and functions for Spice\n**-------------------------------------------------------------------------- */\nconst DEBUG = 0\nconst PLAYBACK_DEBUG = 0\nconst STREAM_DEBUG = 0\nconst DUMP_DRAWS = false\nconst DUMP_CANVASES = false\n\n/* ----------------------------------------------------------------------------\n** We use an Image temporarily, and the image/src does not get garbage\n** collected as quickly as we might like. This blank image helps with that.\n**-------------------------------------------------------------------------- */\nconst EMPTY_GIF_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\n\n/* ----------------------------------------------------------------------------\n** combine_array_buffers\n** Combine two array buffers.\n** FIXME - this can't be optimal. See wire.js about eliminating the need.\n**-------------------------------------------------------------------------- */\nfunction combine_array_buffers (a1: ArrayBuffer, a2: ArrayBuffer): ArrayBuffer {\n const in1 = new Uint8Array(a1)\n const in2 = new Uint8Array(a2)\n const ret = new ArrayBuffer(a1.byteLength + a2.byteLength)\n const out = new Uint8Array(ret)\n let o = 0\n let i: number\n for (i = 0; i < in1.length; i++) { out[o++] = in1[i] }\n for (i = 0; i < in2.length; i++) { out[o++] = in2[i] }\n\n return ret\n}\n\n/* ----------------------------------------------------------------------------\n** hexdump_buffer\n**-------------------------------------------------------------------------- */\nfunction hexdump_buffer (a: ArrayBuffer): void {\n const mg = new Uint8Array(a)\n let hex = ''\n let str = ''\n let last_zeros = 0\n for (let i = 0; i < mg.length; i++) {\n const h = Number(mg[i]).toString(16)\n if (h.length == 1) { hex += '0' }\n hex += h + ' '\n\n if (mg[i] == 10 || mg[i] == 13 || mg[i] == 8) { str += '.' } else { str += String.fromCharCode(mg[i]) }\n\n if ((i % 16 == 15) || (i == (mg.length - 1))) {\n while (i % 16 != 15) {\n hex += ' '\n i++\n }\n\n if (last_zeros == 0) { console.log(hex + ' | ' + str) }\n\n if (hex == '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ') {\n if (last_zeros == 1) {\n console.log('.')\n last_zeros++\n } else if (last_zeros == 0) { last_zeros++ }\n } else { last_zeros = 0 }\n\n hex = str = ''\n }\n }\n}\n\n/* ----------------------------------------------------------------------------\n** Convert arraybuffer to string\n**-------------------------------------------------------------------------- */\nfunction arraybuffer_to_str (buf: ArrayBuffer): string {\n return String.fromCharCode.apply(null, new Uint16Array(buf))\n}\n\n/* ----------------------------------------------------------------------------\n** Converting browser keycodes to AT scancodes is very hard.\n** Spice transmits keys using the original AT scan codes, often\n** described as 'Scan Code Set 1'.\n** There is a confusion of other scan codes; Xorg synthesizes it's\n** own in the same atKeynames.c file that has the XT codes.\n** Scan code set 2 and 3 are more common, and use different values.\n** Further, there is no formal specification for keycodes\n** returned by browsers, so we have done our mapping largely with\n** empirical testing.\n** There has been little rigorous testing with International keyboards,\n** and this would be an easy area for non English speakers to contribute.\n**-------------------------------------------------------------------------- */\nconst common_scanmap: { [key: number]: number } = []\n\n/* The following appear to be keycodes that work in most browsers */\ncommon_scanmap['1'.charCodeAt(0)] = KeyNames.KEY_1\ncommon_scanmap['2'.charCodeAt(0)] = KeyNames.KEY_2\ncommon_scanmap['3'.charCodeAt(0)] = KeyNames.KEY_3\ncommon_scanmap['4'.charCodeAt(0)] = KeyNames.KEY_4\ncommon_scanmap['5'.charCodeAt(0)] = KeyNames.KEY_5\ncommon_scanmap['6'.charCodeAt(0)] = KeyNames.KEY_6\ncommon_scanmap['7'.charCodeAt(0)] = KeyNames.KEY_7\ncommon_scanmap['8'.charCodeAt(0)] = KeyNames.KEY_8\ncommon_scanmap['9'.charCodeAt(0)] = KeyNames.KEY_9\ncommon_scanmap['0'.charCodeAt(0)] = KeyNames.KEY_0\ncommon_scanmap[145] = KeyNames.KEY_ScrollLock\ncommon_scanmap[103] = KeyNames.KEY_KP_7\ncommon_scanmap[104] = KeyNames.KEY_KP_8\ncommon_scanmap[105] = KeyNames.KEY_KP_9\ncommon_scanmap[100] = KeyNames.KEY_KP_4\ncommon_scanmap[101] = KeyNames.KEY_KP_5\ncommon_scanmap[102] = KeyNames.KEY_KP_6\ncommon_scanmap[107] = KeyNames.KEY_KP_Plus\ncommon_scanmap[97] = KeyNames.KEY_KP_1\ncommon_scanmap[98] = KeyNames.KEY_KP_2\ncommon_scanmap[99] = KeyNames.KEY_KP_3\ncommon_scanmap[96] = KeyNames.KEY_KP_0\ncommon_scanmap[109] = KeyNames.KEY_Minus\ncommon_scanmap[110] = KeyNames.KEY_KP_Decimal\ncommon_scanmap[191] = KeyNames.KEY_Slash\ncommon_scanmap[190] = KeyNames.KEY_Period\ncommon_scanmap[188] = KeyNames.KEY_Comma\ncommon_scanmap[220] = KeyNames.KEY_BSlash\ncommon_scanmap[192] = KeyNames.KEY_Tilde\ncommon_scanmap[222] = KeyNames.KEY_Quote\ncommon_scanmap[219] = KeyNames.KEY_LBrace\ncommon_scanmap[221] = KeyNames.KEY_RBrace\n\ncommon_scanmap['Q'.charCodeAt(0)] = KeyNames.KEY_Q\ncommon_scanmap['W'.charCodeAt(0)] = KeyNames.KEY_W\ncommon_scanmap['E'.charCodeAt(0)] = KeyNames.KEY_E\ncommon_scanmap['R'.charCodeAt(0)] = KeyNames.KEY_R\ncommon_scanmap['T'.charCodeAt(0)] = KeyNames.KEY_T\ncommon_scanmap['Y'.charCodeAt(0)] = KeyNames.KEY_Y\ncommon_scanmap['U'.charCodeAt(0)] = KeyNames.KEY_U\ncommon_scanmap['I'.charCodeAt(0)] = KeyNames.KEY_I\ncommon_scanmap['O'.charCodeAt(0)] = KeyNames.KEY_O\ncommon_scanmap['P'.charCodeAt(0)] = KeyNames.KEY_P\ncommon_scanmap['A'.charCodeAt(0)] = KeyNames.KEY_A\ncommon_scanmap['S'.charCodeAt(0)] = KeyNames.KEY_S\ncommon_scanmap['D'.charCodeAt(0)] = KeyNames.KEY_D\ncommon_scanmap['F'.charCodeAt(0)] = KeyNames.KEY_F\ncommon_scanmap['G'.charCodeAt(0)] = KeyNames.KEY_G\ncommon_scanmap['H'.charCodeAt(0)] = KeyNames.KEY_H\ncommon_scanmap['J'.charCodeAt(0)] = KeyNames.KEY_J\ncommon_scanmap['K'.charCodeAt(0)] = KeyNames.KEY_K\ncommon_scanmap['L'.charCodeAt(0)] = KeyNames.KEY_L\ncommon_scanmap['Z'.charCodeAt(0)] = KeyNames.KEY_Z\ncommon_scanmap['X'.charCodeAt(0)] = KeyNames.KEY_X\ncommon_scanmap['C'.charCodeAt(0)] = KeyNames.KEY_C\ncommon_scanmap['V'.charCodeAt(0)] = KeyNames.KEY_V\ncommon_scanmap['B'.charCodeAt(0)] = KeyNames.KEY_B\ncommon_scanmap['N'.charCodeAt(0)] = KeyNames.KEY_N\ncommon_scanmap['M'.charCodeAt(0)] = KeyNames.KEY_M\ncommon_scanmap[' '.charCodeAt(0)] = KeyNames.KEY_Space\ncommon_scanmap[13] = KeyNames.KEY_Enter\ncommon_scanmap[27] = KeyNames.KEY_Escape\ncommon_scanmap[8] = KeyNames.KEY_BackSpace\ncommon_scanmap[9] = KeyNames.KEY_Tab\ncommon_scanmap[16] = KeyNames.KEY_ShiftL\ncommon_scanmap[17] = KeyNames.KEY_LCtrl\ncommon_scanmap[18] = KeyNames.KEY_Alt\ncommon_scanmap[20] = KeyNames.KEY_CapsLock\ncommon_scanmap[44] = KeyNames.KEY_SysRequest\ncommon_scanmap[144] = KeyNames.KEY_NumLock\ncommon_scanmap[112] = KeyNames.KEY_F1\ncommon_scanmap[113] = KeyNames.KEY_F2\ncommon_scanmap[114] = KeyNames.KEY_F3\ncommon_scanmap[115] = KeyNames.KEY_F4\ncommon_scanmap[116] = KeyNames.KEY_F5\ncommon_scanmap[117] = KeyNames.KEY_F6\ncommon_scanmap[118] = KeyNames.KEY_F7\ncommon_scanmap[119] = KeyNames.KEY_F8\ncommon_scanmap[120] = KeyNames.KEY_F9\ncommon_scanmap[121] = KeyNames.KEY_F10\ncommon_scanmap[122] = KeyNames.KEY_F11\ncommon_scanmap[123] = KeyNames.KEY_F12\n\n/* TODO: Break and Print are complex scan codes. XSpice cheats and\n uses Xorg synthesized codes to simplify them. Fixing this will\n require XSpice to handle the scan codes correctly, and then\n fix spice-html5 to send the complex scan codes. */\ncommon_scanmap[42] = 99 // Print, XSpice only\ncommon_scanmap[19] = 101// Break, XSpice only\n\n/* Handle the so called 'GREY' keys, for the extended keys that\n were grey on the original AT keyboard. These are\n prefixed, as they were on the PS/2 controller, with an\n 0xE0 byte to indicate that they are extended */\ncommon_scanmap[111] = 0xE0 | (KeyNames.KEY_Slash << 8)// KP_Divide\ncommon_scanmap[106] = 0xE0 | (KeyNames.KEY_KP_Multiply << 8) // KP_Multiply\ncommon_scanmap[36] = 0xE0 | (KeyNames.KEY_KP_7 << 8) // Home\ncommon_scanmap[38] = 0xE0 | (KeyNames.KEY_KP_8 << 8) // Up\ncommon_scanmap[33] = 0xE0 | (KeyNames.KEY_KP_9 << 8) // PgUp\ncommon_scanmap[37] = 0xE0 | (KeyNames.KEY_KP_4 << 8) // Left\ncommon_scanmap[39] = 0xE0 | (KeyNames.KEY_KP_6 << 8) // Right\ncommon_scanmap[35] = 0xE0 | (KeyNames.KEY_KP_1 << 8) // End\ncommon_scanmap[40] = 0xE0 | (KeyNames.KEY_KP_2 << 8) // Down\ncommon_scanmap[34] = 0xE0 | (KeyNames.KEY_KP_3 << 8) // PgDown\ncommon_scanmap[45] = 0xE0 | (KeyNames.KEY_KP_0 << 8) // Insert\ncommon_scanmap[46] = 0xE0 | (KeyNames.KEY_KP_Decimal << 8) // Delete\ncommon_scanmap[91] = 0xE0 | (0x5B << 8) // KeyNames.KEY_LMeta\ncommon_scanmap[92] = 0xE0 | (0x5C << 8) // KeyNames.KEY_RMeta\ncommon_scanmap[93] = 0xE0 | (0x5D << 8) // KeyNames.KEY_Menu\n\n/* Firefox/Mozilla codes */\nconst firefox_scanmap: { [key: number]: number } = []\nfirefox_scanmap[173] = KeyNames.KEY_Minus\nfirefox_scanmap[61] = KeyNames.KEY_Equal\nfirefox_scanmap[59] = KeyNames.KEY_SemiColon\n\n/* DOM3 codes */\nconst DOM_scanmap: { [key: number]: number } = []\nDOM_scanmap[189] = KeyNames.KEY_Minus\nDOM_scanmap[187] = KeyNames.KEY_Equal\nDOM_scanmap[186] = KeyNames.KEY_SemiColon\n\nfunction get_scancode (keyCode: number, code: string): number | undefined {\n if (code_to_scancode[code] !== undefined) {\n return code_to_scancode[code]\n }\n\n if (common_scanmap[keyCode] === undefined) {\n if (typeof navigator !== 'undefined' && navigator.userAgent.includes('Firefox')) { return firefox_scanmap[keyCode] } else { return DOM_scanmap[keyCode] }\n } else { return common_scanmap[keyCode] }\n}\n\nfunction keycode_to_start_scan (keyCode: number, code: string): number {\n const scancode = get_scancode(keyCode, code)\n if (scancode === undefined) {\n if (typeof alert === 'function') {\n alert('no map for ' + keyCode)\n }\n return 0\n }\n\n return scancode\n}\n\nfunction keycode_to_end_scan (keyCode: number, code: string): number {\n const scancode = get_scancode(keyCode, code)\n if (scancode === undefined) { return 0 }\n\n if (scancode < 0x100) {\n return scancode | 0x80\n } else {\n return scancode | 0x8000\n }\n}\n\nfunction dump_media_element (m: HTMLMediaElement): string {\n const ret = '[networkState ' + m.networkState +\n '|readyState ' + m.readyState +\n '|error ' + m.error +\n '|seeking ' + m.seeking +\n '|duration ' + m.duration +\n '|paused ' + m.paused +\n '|ended ' + m.error +\n '|buffered ' + dump_timerange(m.buffered) +\n ']'\n return ret\n}\n\nfunction dump_media_source (ms: MediaSource): string {\n const ret = '[duration ' + ms.duration +\n '|readyState ' + ms.readyState + ']'\n return ret\n}\n\nfunction dump_source_buffer (sb: SourceBuffer): string {\n const ret = '[appendWindowStart ' + sb.appendWindowStart +\n '|appendWindowEnd ' + sb.appendWindowEnd +\n '|buffered ' + dump_timerange(sb.buffered) +\n '|timestampOffset ' + sb.timestampOffset +\n '|updating ' + sb.updating +\n ']'\n return ret\n}\n\nfunction dump_timerange (tr: TimeRanges | null): string {\n let ret: string\n\n if (tr) {\n const i = tr.length\n ret = '{len ' + i\n if (i > 0) { ret += '; start ' + tr.start(0) + '; end ' + tr.end(i - 1) }\n ret += '}'\n } else { ret = 'N/A' }\n\n return ret\n}\n\nexport {\n DEBUG,\n PLAYBACK_DEBUG,\n STREAM_DEBUG,\n DUMP_DRAWS,\n DUMP_CANVASES,\n EMPTY_GIF_IMAGE,\n combine_array_buffers,\n hexdump_buffer,\n arraybuffer_to_str,\n keycode_to_start_scan,\n keycode_to_end_scan,\n dump_media_element,\n dump_media_source,\n dump_source_buffer\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** Spice messages\n** This file contains classes for passing messages to and from\n** a spice server. This file should arguably be generated from\n** spice.proto, but it was instead put together by hand.\n**-------------------------------------------------------------------------- */\n\nimport { Constants } from './enums'\nimport { SpiceDataView } from './spicedataview'\nimport { create_rsa_from_mb } from './ticket'\nimport {\n SpiceChannelId,\n SpiceRect,\n SpiceClip,\n SpiceCopy,\n SpiceFill,\n SpicePoint,\n SpiceSurface,\n SpicePoint16,\n SpiceCursor\n} from './spicetype'\nimport {\n keycode_to_start_scan,\n keycode_to_end_scan\n} from './utils'\n\nclass SpiceLinkHeader {\n magic: string\n major_version: number\n minor_version: number\n size: number\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.magic = Constants.SPICE_MAGIC\n this.major_version = Constants.SPICE_VERSION_MAJOR\n this.minor_version = Constants.SPICE_VERSION_MINOR\n this.size = 0\n if (a !== undefined) { this.from_buffer(a, at) }\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.magic = ''\n for (let i = 0; i < 4; i++) { this.magic += String.fromCharCode(dv.getUint8(at + i)) }\n at += 4\n\n this.major_version = dv.getUint32(at, true); at += 4\n this.minor_version = dv.getUint32(at, true); at += 4\n this.size = dv.getUint32(at, true); at += 4\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n for (let i = 0; i < 4; i++) { dv.setUint8(at + i, this.magic.charCodeAt(i)) }\n at += 4\n\n dv.setUint32(at, this.major_version, true); at += 4\n dv.setUint32(at, this.minor_version, true); at += 4\n dv.setUint32(at, this.size, true); at += 4\n }\n\n buffer_size (): number {\n return 16\n }\n}\n\nclass SpiceLinkMess {\n connection_id: number\n channel_type: number\n channel_id: number\n common_caps: number[]\n channel_caps: number[]\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.connection_id = 0\n this.channel_type = 0\n this.channel_id = 0\n this.common_caps = []\n this.channel_caps = []\n\n if (a !== undefined) { this.from_buffer(a, at) }\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const orig_at = at\n const dv = new SpiceDataView(a)\n this.connection_id = dv.getUint32(at, true); at += 4\n this.channel_type = dv.getUint8(at, true); at++\n this.channel_id = dv.getUint8(at, true); at++\n const num_common_caps = dv.getUint32(at, true); at += 4\n const num_channel_caps = dv.getUint32(at, true); at += 4\n const caps_offset = dv.getUint32(at, true); at += 4\n\n at = orig_at + caps_offset\n this.common_caps = []\n for (i = 0; i < num_common_caps; i++) {\n this.common_caps.unshift(dv.getUint32(at, true)); at += 4\n }\n\n this.channel_caps = []\n for (i = 0; i < num_channel_caps; i++) {\n this.channel_caps.unshift(dv.getUint32(at, true)); at += 4\n }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const orig_at = at\n let i: number\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.connection_id, true); at += 4\n dv.setUint8(at, this.channel_type, true); at++\n dv.setUint8(at, this.channel_id, true); at++\n dv.setUint32(at, this.common_caps.length, true); at += 4\n dv.setUint32(at, this.channel_caps.length, true); at += 4\n dv.setUint32(at, (at - orig_at) + 4, true); at += 4\n\n for (i = 0; i < this.common_caps.length; i++) {\n dv.setUint32(at, this.common_caps[i], true); at += 4\n }\n\n for (i = 0; i < this.channel_caps.length; i++) {\n dv.setUint32(at, this.channel_caps[i], true); at += 4\n }\n }\n\n buffer_size (): number {\n return 18 + (4 * this.common_caps.length) + (4 * this.channel_caps.length)\n }\n}\n\nclass SpiceLinkReply {\n error: number\n pub_key: any\n common_caps: number[]\n channel_caps: number[]\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.error = 0\n this.pub_key = undefined\n this.common_caps = []\n this.channel_caps = []\n\n if (a !== undefined) { this.from_buffer(a, at) }\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const orig_at = at\n const dv = new SpiceDataView(a)\n this.error = dv.getUint32(at, true); at += 4\n\n this.pub_key = create_rsa_from_mb(a, at)\n at += Constants.SPICE_TICKET_PUBKEY_BYTES\n\n const num_common_caps = dv.getUint32(at, true); at += 4\n const num_channel_caps = dv.getUint32(at, true); at += 4\n const caps_offset = dv.getUint32(at, true); at += 4\n\n at = orig_at + caps_offset\n this.common_caps = []\n for (i = 0; i < num_common_caps; i++) {\n this.common_caps.unshift(dv.getUint32(at, true)); at += 4\n }\n\n this.channel_caps = []\n for (i = 0; i < num_channel_caps; i++) {\n this.channel_caps.unshift(dv.getUint32(at, true)); at += 4\n }\n }\n}\n\nclass SpiceLinkAuthTicket {\n auth_mechanism: number\n encrypted_data: number[] | Uint8Array | undefined\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.auth_mechanism = 0\n this.encrypted_data = undefined\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.auth_mechanism, true); at += 4\n for (i = 0; i < Constants.SPICE_TICKET_KEY_PAIR_LENGTH / 8; i++) {\n if (this.encrypted_data && i < this.encrypted_data.length) { dv.setUint8(at, this.encrypted_data[i], true) } else { dv.setUint8(at, 0, true) }\n at++\n }\n }\n\n buffer_size (): number {\n return 4 + (Constants.SPICE_TICKET_KEY_PAIR_LENGTH / 8)\n }\n}\n\nclass SpiceLinkAuthReply {\n auth_code: number\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.auth_code = 0\n if (a !== undefined) { this.from_buffer(a, at) }\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.auth_code = dv.getUint32(at, true); at += 4\n }\n\n buffer_size (): number {\n return 4\n }\n}\n\nclass SpiceMiniData {\n type: number\n size: number\n data: ArrayBuffer | undefined\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.type = 0\n this.size = 0\n this.data = undefined\n if (a !== undefined) { this.from_buffer(a, at) }\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const dv = new SpiceDataView(a)\n this.type = dv.getUint16(at, true); at += 2\n this.size = dv.getUint32(at, true); at += 4\n if (a.byteLength > at) {\n this.data = a.slice(at)\n at += this.data.byteLength\n }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const dv = new SpiceDataView(a)\n dv.setUint16(at, this.type, true); at += 2\n dv.setUint32(at, this.data ? this.data.byteLength : 0, true); at += 4\n if (this.data && this.data.byteLength > 0) {\n const u8arr = new Uint8Array(this.data)\n for (i = 0; i < u8arr.length; i++, at++) { dv.setUint8(at, u8arr[i], true) }\n }\n }\n\n build_msg (in_type: number, extra: { buffer_size: () => number, to_buffer: (a: ArrayBuffer, at?: number) => void }): void {\n this.type = in_type\n this.size = extra.buffer_size()\n this.data = new ArrayBuffer(this.size)\n extra.to_buffer(this.data)\n }\n\n buffer_size (): number {\n if (this.data) { return 6 + this.data.byteLength } else { return 6 }\n }\n}\n\nclass SpiceMsgChannels {\n num_of_channels: number\n channels: SpiceChannelId[]\n\n constructor (a?: ArrayBuffer, at?: number) {\n this.num_of_channels = 0\n this.channels = []\n if (a !== undefined) { this.from_buffer(a, at) }\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const dv = new SpiceDataView(a)\n this.num_of_channels = dv.getUint32(at, true); at += 4\n for (i = 0; i < this.num_of_channels; i++) {\n const chan = new SpiceChannelId()\n at = chan.from_dv(dv, at, a)\n this.channels.push(chan)\n }\n }\n}\n\nfunction hasClipboardSelection (caps: number[]): boolean {\n return ((caps[0] >> Constants.VD_AGENT_CAP_CLIPBOARD_SELECTION) & 1) != 0\n}\n\nclass SpiceMsgClipboardGrab {\n has_clipboard_selection: boolean\n type: number\n\n constructor (type: number, caps: number[]) {\n this.has_clipboard_selection = hasClipboardSelection(caps)\n this.type = type\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n if (this.has_clipboard_selection) {\n dv.setUint32(at, 0, true); at += 4\n }\n dv.setUint32(at, this.type, true); at += 4\n }\n\n buffer_size (): number {\n return (this.has_clipboard_selection ? 8 : 4)\n }\n}\n\nclass SpiceMsgClipboardReceive {\n has_clipboard_selection: boolean\n type: number\n payload: ArrayBuffer\n\n constructor (agent_data: { data: ArrayBuffer }, caps: number[]) {\n this.has_clipboard_selection = hasClipboardSelection(caps)\n const dv = new DataView(agent_data.data)\n let at = (this.has_clipboard_selection ? 4 : 0)\n this.type = dv.getUint32(at, true); at += 4\n this.payload = agent_data.data.slice(at)\n }\n\n get_text (): string {\n return new TextDecoder('utf-8').decode(this.payload)\n }\n}\n\nclass SpiceMsgClipboardRequest {\n has_clipboard_selection: boolean\n type: number\n\n constructor (type: number, caps: number[]) {\n this.has_clipboard_selection = hasClipboardSelection(caps)\n this.type = type\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n if (this.has_clipboard_selection) {\n dv.setUint32(at, 0, true); at += 4\n }\n dv.setUint32(at, this.type, true); at += 4\n }\n\n buffer_size (): number {\n return (this.has_clipboard_selection ? 8 : 4)\n }\n}\n\nclass SpiceMsgClipboardSend {\n has_clipboard_selection: boolean\n type: number\n text: string\n\n constructor (type: number, text: string, caps: number[]) {\n this.has_clipboard_selection = hasClipboardSelection(caps)\n this.type = type\n this.text = text\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n if (this.has_clipboard_selection) {\n dv.setUint32(at, 0, true); at += 4\n }\n dv.setUint32(at, this.type, true); at += 4\n const payload = new TextEncoder().encode(this.text)\n new Uint8Array(a, at, payload.byteLength).set(payload); at += payload.byteLength\n }\n\n buffer_size (): number {\n const payloadLength = new TextEncoder().encode(this.text).byteLength\n return (this.has_clipboard_selection ? 8 : 4) + payloadLength\n }\n}\n\nclass SpiceMsgMainInit {\n session_id: number\n display_channels_hint: number\n supported_mouse_modes: number\n current_mouse_mode: number\n agent_connected: number\n agent_tokens: number\n multi_media_time: number\n ram_hint: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.session_id = dv.getUint32(at, true); at += 4\n this.display_channels_hint = dv.getUint32(at, true); at += 4\n this.supported_mouse_modes = dv.getUint32(at, true); at += 4\n this.current_mouse_mode = dv.getUint32(at, true); at += 4\n this.agent_connected = dv.getUint32(at, true); at += 4\n this.agent_tokens = dv.getUint32(at, true); at += 4\n this.multi_media_time = dv.getUint32(at, true); at += 4\n this.ram_hint = dv.getUint32(at, true); at += 4\n }\n}\n\nclass SpiceMsgMainMouseMode {\n supported_modes: number\n current_mode: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.supported_modes = dv.getUint16(at, true); at += 2\n this.current_mode = dv.getUint16(at, true); at += 2\n }\n}\n\nclass SpiceMsgMainAgentData {\n protocol: number\n type: number\n opaque: number\n size: number\n data: ArrayBuffer | undefined\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.protocol = dv.getUint32(at, true); at += 4\n this.type = dv.getUint32(at, true); at += 4\n this.opaque = dv.getUint64(at, true); at += 8\n this.size = dv.getUint32(at, true); at += 4\n if (a.byteLength > at) {\n this.data = a.slice(at)\n at += this.data.byteLength\n }\n }\n}\n\nclass SpiceMsgMainAgentTokens {\n num_tokens: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.num_tokens = dv.getUint32(at, true); at += 4\n }\n}\n\nclass SpiceMsgSetAck {\n generation: number\n window: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.generation = dv.getUint32(at, true); at += 4\n this.window = dv.getUint32(at, true); at += 4\n }\n}\n\nclass SpiceMsgcAckSync {\n generation: number\n\n constructor (ack: { generation: number }) {\n this.generation = ack.generation\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.generation, true); at += 4\n }\n\n buffer_size (): number {\n return 4\n }\n}\n\nclass SpiceMsgcMainMouseModeRequest {\n mode: number\n\n constructor (mode: number) {\n this.mode = mode\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint16(at, this.mode, true); at += 2\n }\n\n buffer_size (): number {\n return 2\n }\n}\n\nclass SpiceMsgcMainAgentStart {\n num_tokens: number\n\n constructor (num_tokens: number) {\n this.num_tokens = num_tokens\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.num_tokens, true); at += 4\n }\n\n buffer_size (): number {\n return 4\n }\n}\n\nclass SpiceMsgcMainAgentData {\n protocol: number\n type: number\n opaque: number\n size: number\n data: { buffer_size: () => number, to_buffer: (a: ArrayBuffer, at?: number) => void }\n\n constructor (type: number, data: { buffer_size: () => number, to_buffer: (a: ArrayBuffer, at?: number) => void }) {\n this.protocol = Constants.VD_AGENT_PROTOCOL\n this.type = type\n this.opaque = 0\n this.size = data.buffer_size()\n this.data = data\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.protocol, true); at += 4\n dv.setUint32(at, this.type, true); at += 4\n dv.setUint64(at, this.opaque, true); at += 8\n dv.setUint32(at, this.size, true); at += 4\n this.data.to_buffer(a, at)\n }\n\n buffer_size (): number {\n return 4 + 4 + 8 + 4 + this.data.buffer_size()\n }\n}\n\nclass VDAgentAnnounceCapabilities {\n request: number\n caps: number\n\n constructor (request: number, caps?: number) {\n if (caps) {\n this.request = request\n this.caps = caps\n } else { this.from_buffer(request as any) }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.request, true); at += 4\n dv.setUint32(at, this.caps, true); at += 4\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.request = dv.getUint32(at, true); at += 4\n this.caps = dv.getUint32(at, true); at += 4\n return at\n }\n\n buffer_size (): number {\n return 8\n }\n}\n\nclass VDAgentMonitorsConfig {\n num_mon: number\n flags: number\n width: number\n height: number\n depth: number\n x: number\n y: number\n\n constructor (flags: number, width: number, height: number, depth: number, x: number, y: number) {\n this.num_mon = 1\n this.flags = flags\n this.width = width\n this.height = height\n this.depth = depth\n this.x = x\n this.y = y\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.num_mon, true); at += 4\n dv.setUint32(at, this.flags, true); at += 4\n dv.setUint32(at, this.height, true); at += 4\n dv.setUint32(at, this.width, true); at += 4\n dv.setUint32(at, this.depth, true); at += 4\n dv.setUint32(at, this.x, true); at += 4\n dv.setUint32(at, this.y, true); at += 4\n }\n\n buffer_size (): number {\n return 28\n }\n}\n\nclass VDAgentFileXferStatusMessage {\n id: number\n result: number\n\n constructor (data: number, result?: number) {\n if (result) {\n this.id = data\n this.result = result\n } else { this.from_buffer(data as any) }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.id, true); at += 4\n dv.setUint32(at, this.result, true); at += 4\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.id = dv.getUint32(at, true); at += 4\n this.result = dv.getUint32(at, true); at += 4\n return at\n }\n\n buffer_size (): number {\n return 8\n }\n}\n\nclass VDAgentFileXferStartMessage {\n id: number\n string: string\n\n constructor (id: number, name: string, size: number) {\n this.id = id\n this.string = '[vdagent-file-xfer]\\n' + 'name=' + name + '\\nsize=' + size + '\\n'\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.id, true); at += 4\n for (let i = 0; i < this.string.length; i++, at++) { dv.setUint8(at, this.string.charCodeAt(i)) }\n }\n\n buffer_size (): number {\n return 4 + this.string.length + 1\n }\n}\n\nclass VDAgentFileXferDataMessage {\n id: number\n size: number\n data: ArrayBuffer | undefined\n\n constructor (id: number, size: number, data: ArrayBuffer | undefined) {\n this.id = id\n this.size = size\n this.data = data\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.id, true); at += 4\n dv.setUint64(at, this.size, true); at += 8\n if (this.data && this.data.byteLength > 0) {\n const u8arr = new Uint8Array(this.data)\n for (let i = 0; i < u8arr.length; i++, at++) { dv.setUint8(at, u8arr[i]) }\n }\n }\n\n buffer_size (): number {\n return 12 + this.size\n }\n}\n\nclass SpiceMsgNotify {\n time_stamp: number\n severity: number\n visibility: number\n what: number\n message_len: number\n message: string\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n let i: number\n const dv = new SpiceDataView(a)\n this.time_stamp = dv.getUint64(at, true); at += 8\n this.severity = dv.getUint32(at, true); at += 4\n this.visibility = dv.getUint32(at, true); at += 4\n this.what = dv.getUint32(at, true); at += 4\n this.message_len = dv.getUint32(at, true); at += 4\n this.message = ''\n for (i = 0; i < this.message_len; i++) {\n const c = dv.getUint8(at, true); at++\n this.message += String.fromCharCode(c)\n }\n }\n}\n\nclass SpiceMsgcDisplayInit {\n pixmap_cache_id: number\n glz_dictionary_id: number\n pixmap_cache_size: number\n glz_dictionary_window_size: number\n\n constructor () {\n this.pixmap_cache_id = 1\n this.glz_dictionary_id = 0\n this.pixmap_cache_size = 10 * 1024 * 1024\n this.glz_dictionary_window_size = 0\n }\n\n to_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint8(at, this.pixmap_cache_id, true); at++\n dv.setUint64(at, this.pixmap_cache_size, true); at += 8\n dv.setUint8(at, this.glz_dictionary_id, true); at++\n dv.setUint32(at, this.glz_dictionary_window_size, true); at += 4\n }\n\n buffer_size (): number {\n return 14\n }\n}\n\nclass SpiceMsgDisplayBase {\n surface_id: number\n box: SpiceRect\n clip: SpiceClip\n\n from_dv (dv: SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.surface_id = dv.getUint32(at, true); at += 4\n this.box = new SpiceRect()\n at = this.box.from_dv(dv, at, mb)\n this.clip = new SpiceClip()\n return this.clip.from_dv(dv, at, mb)\n }\n}\n\nclass SpiceMsgDisplayDrawCopy {\n base: SpiceMsgDisplayBase\n data: SpiceCopy\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.base = new SpiceMsgDisplayBase()\n at = this.base.from_dv(dv, at, a)\n this.data = new SpiceCopy()\n return this.data.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgDisplayDrawFill {\n base: SpiceMsgDisplayBase\n data: SpiceFill\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.base = new SpiceMsgDisplayBase()\n at = this.base.from_dv(dv, at, a)\n this.data = new SpiceFill()\n return this.data.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgDisplayCopyBits {\n base: SpiceMsgDisplayBase\n src_pos: SpicePoint\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.base = new SpiceMsgDisplayBase()\n at = this.base.from_dv(dv, at, a)\n this.src_pos = new SpicePoint()\n return this.src_pos.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgSurfaceCreate {\n surface: SpiceSurface\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.surface = new SpiceSurface()\n return this.surface.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgSurfaceDestroy {\n surface_id: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.surface_id = dv.getUint32(at, true); at += 4\n }\n}\n\nclass SpiceMsgInputsInit {\n keyboard_modifiers: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.keyboard_modifiers = dv.getUint16(at, true); at += 2\n return at\n }\n}\n\nclass SpiceMsgInputsKeyModifiers {\n keyboard_modifiers: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.keyboard_modifiers = dv.getUint16(at, true); at += 2\n return at\n }\n}\n\nclass SpiceMsgCursorInit {\n position: SpicePoint16\n trail_length: number\n trail_frequency: number\n visible: number\n cursor: SpiceCursor\n\n constructor (a: ArrayBuffer, at?: number, mb?: ArrayBuffer) {\n this.from_buffer(a, at, mb)\n }\n\n from_buffer (a: ArrayBuffer, at?: number, mb?: ArrayBuffer): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.position = new SpicePoint16()\n at = this.position.from_dv(dv, at, mb)\n this.trail_length = dv.getUint16(at, true); at += 2\n this.trail_frequency = dv.getUint16(at, true); at += 2\n this.visible = dv.getUint8(at, true); at++\n this.cursor = new SpiceCursor()\n return this.cursor.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgPlaybackData {\n time: number\n data: ArrayBuffer | undefined\n\n constructor (a: ArrayBuffer, at?: number, mb?: ArrayBuffer) {\n this.from_buffer(a, at, mb)\n }\n\n from_buffer (a: ArrayBuffer, at?: number, mb?: ArrayBuffer): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.time = dv.getUint32(at, true); at += 4\n if (a.byteLength > at) {\n this.data = a.slice(at)\n at += this.data.byteLength\n }\n return at\n }\n}\n\nclass SpiceMsgPlaybackMode {\n time: number\n mode: number\n data: ArrayBuffer | undefined\n\n constructor (a: ArrayBuffer, at?: number, mb?: ArrayBuffer) {\n this.from_buffer(a, at, mb)\n }\n\n from_buffer (a: ArrayBuffer, at?: number, mb?: ArrayBuffer): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.time = dv.getUint32(at, true); at += 4\n this.mode = dv.getUint16(at, true); at += 2\n if (a.byteLength > at) {\n this.data = a.slice(at)\n at += this.data.byteLength\n }\n return at\n }\n}\n\nclass SpiceMsgPlaybackStart {\n channels: number\n format: number\n frequency: number\n time: number\n\n constructor (a: ArrayBuffer, at?: number, mb?: ArrayBuffer) {\n this.from_buffer(a, at, mb)\n }\n\n from_buffer (a: ArrayBuffer, at?: number, mb?: ArrayBuffer): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.channels = dv.getUint32(at, true); at += 4\n this.format = dv.getUint16(at, true); at += 2\n this.frequency = dv.getUint32(at, true); at += 4\n this.time = dv.getUint32(at, true); at += 4\n return at\n }\n}\n\nclass SpiceMsgCursorSet {\n position: SpicePoint16\n visible: number\n cursor: SpiceCursor\n\n constructor (a: ArrayBuffer, at?: number, mb?: ArrayBuffer) {\n this.from_buffer(a, at, mb)\n }\n\n from_buffer (a: ArrayBuffer, at?: number, mb?: ArrayBuffer): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.position = new SpicePoint16()\n at = this.position.from_dv(dv, at, mb)\n this.visible = dv.getUint8(at, true); at++\n this.cursor = new SpiceCursor()\n return this.cursor.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgcMousePosition {\n display_id: number\n buttons_state: number\n x: number\n y: number\n\n constructor (sc: { buttons_state: number, mousex: number, mousey: number }, e?: { offsetX: number, offsetY: number }) {\n // FIXME - figure out how to correctly compute display_id\n this.display_id = 0\n this.buttons_state = sc.buttons_state\n if (e) {\n this.x = e.offsetX\n this.y = e.offsetY\n\n sc.mousex = e.offsetX\n sc.mousey = e.offsetY\n } else {\n this.x = this.y = this.buttons_state = 0\n }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.x, true); at += 4\n dv.setUint32(at, this.y, true); at += 4\n dv.setUint16(at, this.buttons_state, true); at += 2\n dv.setUint8(at, this.display_id, true); at += 1\n return at\n }\n\n buffer_size (): number {\n return 11\n }\n}\n\nclass SpiceMsgcMouseMotion {\n display_id: number\n buttons_state: number\n x: number\n y: number\n\n constructor (sc: { buttons_state: number, mousex: number, mousey: number }, e?: { offsetX: number, offsetY: number }) {\n // FIXME - figure out how to correctly compute display_id\n this.display_id = 0\n this.buttons_state = sc.buttons_state\n if (e) {\n this.x = e.offsetX\n this.y = e.offsetY\n\n if (sc.mousex !== undefined) {\n this.x -= sc.mousex\n this.y -= sc.mousey\n }\n sc.mousex = e.offsetX\n sc.mousey = e.offsetY\n } else {\n this.x = this.y = this.buttons_state = 0\n }\n }\n\n to_buffer: (a: ArrayBuffer, at?: number) => number = SpiceMsgcMousePosition.prototype.to_buffer\n buffer_size: () => number = SpiceMsgcMousePosition.prototype.buffer_size\n}\n\nclass SpiceMsgcMousePress {\n button: number\n buttons_state: number\n\n constructor (sc: { buttons_state: number }, e?: { button: number }) {\n if (e) {\n this.button = e.button + 1\n this.buttons_state = 1 << e.button\n sc.buttons_state = this.buttons_state\n } else {\n this.button = Constants.SPICE_MOUSE_BUTTON_LEFT\n this.buttons_state = Constants.SPICE_MOUSE_BUTTON_MASK_LEFT\n }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint8(at, this.button, true); at++\n dv.setUint16(at, this.buttons_state, true); at += 2\n return at\n }\n\n buffer_size (): number {\n return 3\n }\n}\n\nclass SpiceMsgcMouseRelease {\n button: number\n buttons_state: number\n\n constructor (sc: { buttons_state: number }, e?: { button: number }) {\n if (e) {\n this.button = e.button + 1\n this.buttons_state = 0\n sc.buttons_state = this.buttons_state\n } else {\n this.button = Constants.SPICE_MOUSE_BUTTON_LEFT\n this.buttons_state = 0\n }\n }\n\n to_buffer: (a: ArrayBuffer, at?: number) => number = SpiceMsgcMousePress.prototype.to_buffer\n buffer_size: () => number = SpiceMsgcMousePress.prototype.buffer_size\n}\n\nclass SpiceMsgcKeyDown {\n code: number\n\n constructor (e?: { keyCode: number, code: string }) {\n if (e) {\n this.code = keycode_to_start_scan(e.keyCode, e.code)\n } else {\n this.code = 0\n }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.code, true); at += 4\n return at\n }\n\n buffer_size (): number {\n return 4\n }\n}\n\nclass SpiceMsgcKeyUp {\n code: number\n\n constructor (e?: { keyCode: number, code: string }) {\n if (e) {\n this.code = keycode_to_end_scan(e.keyCode, e.code)\n } else {\n this.code = 0\n }\n }\n\n to_buffer: (a: ArrayBuffer, at?: number) => number = SpiceMsgcKeyDown.prototype.to_buffer\n buffer_size: () => number = SpiceMsgcKeyDown.prototype.buffer_size\n}\n\nclass SpiceMsgDisplayStreamCreate {\n surface_id: number\n id: number\n flags: number\n codec_type: number\n stamp: number\n stream_width: number\n stream_height: number\n src_width: number\n src_height: number\n dest: SpiceRect\n clip: SpiceClip\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.surface_id = dv.getUint32(at, true); at += 4\n this.id = dv.getUint32(at, true); at += 4\n this.flags = dv.getUint8(at, true); at += 1\n this.codec_type = dv.getUint8(at, true); at += 1\n this.stamp = dv.getUint64(at, true); at += 8\n this.stream_width = dv.getUint32(at, true); at += 4\n this.stream_height = dv.getUint32(at, true); at += 4\n this.src_width = dv.getUint32(at, true); at += 4\n this.src_height = dv.getUint32(at, true); at += 4\n\n this.dest = new SpiceRect()\n at = this.dest.from_dv(dv, at, a)\n this.clip = new SpiceClip()\n this.clip.from_dv(dv, at, a)\n }\n}\n\nclass SpiceStreamDataHeader {\n id: number\n multi_media_time: number\n\n from_dv (dv: SpiceDataView, at: number, mb: ArrayBuffer): number {\n this.id = dv.getUint32(at, true); at += 4\n this.multi_media_time = dv.getUint32(at, true); at += 4\n return at\n }\n}\n\nclass SpiceMsgDisplayStreamData {\n base: SpiceStreamDataHeader\n data_size: number\n data: Uint8Array\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.base = new SpiceStreamDataHeader()\n at = this.base.from_dv(dv, at, a)\n this.data_size = dv.getUint32(at, true); at += 4\n this.data = dv.u8.subarray(at, at + this.data_size)\n }\n}\n\nclass SpiceMsgDisplayStreamDataSized {\n base: SpiceStreamDataHeader\n width: number\n height: number\n dest: SpiceRect\n data_size: number\n data: Uint8Array\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.base = new SpiceStreamDataHeader()\n at = this.base.from_dv(dv, at, a)\n this.width = dv.getUint32(at, true); at += 4\n this.height = dv.getUint32(at, true); at += 4\n this.dest = new SpiceRect()\n at = this.dest.from_dv(dv, at, a)\n this.data_size = dv.getUint32(at, true); at += 4\n this.data = dv.u8.subarray(at, at + this.data_size)\n }\n}\n\nclass SpiceMsgDisplayStreamClip {\n id: number\n clip: SpiceClip\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.id = dv.getUint32(at, true); at += 4\n this.clip = new SpiceClip()\n this.clip.from_dv(dv, at, a)\n }\n}\n\nclass SpiceMsgDisplayStreamDestroy {\n id: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.id = dv.getUint32(at, true); at += 4\n }\n}\n\nclass SpiceMsgDisplayStreamActivateReport {\n stream_id: number\n unique_id: number\n max_window_size: number\n timeout_ms: number\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n this.stream_id = dv.getUint32(at, true); at += 4\n this.unique_id = dv.getUint32(at, true); at += 4\n this.max_window_size = dv.getUint32(at, true); at += 4\n this.timeout_ms = dv.getUint32(at, true); at += 4\n }\n}\n\nclass SpiceMsgcDisplayStreamReport {\n stream_id: number\n unique_id: number\n start_frame_mm_time: number\n end_frame_mm_time: number\n num_frames: number\n num_drops: number\n last_frame_delay: number\n audio_delay: number\n\n constructor (stream_id: number, unique_id: number) {\n this.stream_id = stream_id\n this.unique_id = unique_id\n this.start_frame_mm_time = 0\n this.end_frame_mm_time = 0\n this.num_frames = 0\n this.num_drops = 0\n this.last_frame_delay = 0\n\n // TODO - Implement audio delay\n this.audio_delay = -1\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.stream_id, true); at += 4\n dv.setUint32(at, this.unique_id, true); at += 4\n dv.setUint32(at, this.start_frame_mm_time, true); at += 4\n dv.setUint32(at, this.end_frame_mm_time, true); at += 4\n dv.setUint32(at, this.num_frames, true); at += 4\n dv.setUint32(at, this.num_drops, true); at += 4\n dv.setUint32(at, this.last_frame_delay, true); at += 4\n dv.setUint32(at, this.audio_delay, true); at += 4\n return at\n }\n\n buffer_size (): number {\n return 8 * 4\n }\n}\n\nclass SpiceMsgDisplayInvalList {\n count: number\n resources: Array<{ type: number, id: number }>\n\n constructor (a: ArrayBuffer, at?: number) {\n this.count = 0\n this.resources = []\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n let i: number\n at = at || 0\n const dv = new SpiceDataView(a)\n this.count = dv.getUint16(at, true); at += 2\n for (i = 0; i < this.count; i++) {\n this.resources[i] = {}\n this.resources[i].type = dv.getUint8(at, true); at++\n this.resources[i].id = dv.getUint64(at, true); at += 8\n }\n }\n}\n\nclass SpiceMsgPortInit {\n opened: number\n name: ArrayBuffer\n\n constructor (a: ArrayBuffer, at?: number) {\n this.from_buffer(a, at)\n }\n\n from_buffer (a: ArrayBuffer, at?: number): void {\n at = at || 0\n const dv = new SpiceDataView(a)\n const namesize = dv.getUint32(at, true); at += 4\n const offset = dv.getUint32(at, true); at += 4\n this.opened = dv.getUint8(at, true); at += 1\n this.name = a.slice(offset, offset + namesize - 1)\n }\n}\n\nexport {\n SpiceLinkHeader,\n SpiceLinkMess,\n SpiceLinkReply,\n SpiceLinkAuthTicket,\n SpiceLinkAuthReply,\n SpiceMiniData,\n SpiceMsgChannels,\n SpiceMsgClipboardGrab,\n SpiceMsgClipboardReceive,\n SpiceMsgClipboardRequest,\n SpiceMsgClipboardSend,\n SpiceMsgMainInit,\n SpiceMsgMainMouseMode,\n SpiceMsgMainAgentData,\n SpiceMsgMainAgentTokens,\n SpiceMsgSetAck,\n SpiceMsgcAckSync,\n SpiceMsgcMainMouseModeRequest,\n SpiceMsgcMainAgentStart,\n SpiceMsgcMainAgentData,\n VDAgentAnnounceCapabilities,\n VDAgentMonitorsConfig,\n VDAgentFileXferStatusMessage,\n VDAgentFileXferStartMessage,\n VDAgentFileXferDataMessage,\n SpiceMsgNotify,\n SpiceMsgcDisplayInit,\n SpiceMsgDisplayBase,\n SpiceMsgDisplayDrawCopy,\n SpiceMsgDisplayDrawFill,\n SpiceMsgDisplayCopyBits,\n SpiceMsgSurfaceCreate,\n SpiceMsgSurfaceDestroy,\n SpiceMsgInputsInit,\n SpiceMsgInputsKeyModifiers,\n SpiceMsgCursorInit,\n SpiceMsgPlaybackData,\n SpiceMsgPlaybackMode,\n SpiceMsgPlaybackStart,\n SpiceMsgCursorSet,\n SpiceMsgcMousePosition,\n SpiceMsgcMouseMotion,\n SpiceMsgcMousePress,\n SpiceMsgcMouseRelease,\n SpiceMsgcKeyDown,\n SpiceMsgcKeyUp,\n SpiceMsgDisplayStreamCreate,\n SpiceStreamDataHeader,\n SpiceMsgDisplayStreamData,\n SpiceMsgDisplayStreamDataSized,\n SpiceMsgDisplayStreamClip,\n SpiceMsgDisplayStreamDestroy,\n SpiceMsgDisplayStreamActivateReport,\n SpiceMsgcDisplayStreamReport,\n SpiceMsgDisplayInvalList,\n SpiceMsgPortInit\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** crc logic from rfc2083 ported to Javascript\n**-------------------------------------------------------------------------- */\n\nimport { SpiceDataView } from './spicedataview.js'\n\nconst rfc2083_crc_table: number[] = Array(256)\nlet rfc2083_crc_table_computed: number = 0\n/* Make the table for a fast CRC. */\nfunction rfc2083_make_crc_table (): void {\n let c: number\n let n: number, k: number\n for (n = 0; n < 256; n++) {\n c = n\n for (k = 0; k < 8; k++) {\n if (c & 1) {\n c = ((0xedb88320 ^ (c >>> 1)) >>> 0) & 0xffffffff\n } else {\n c = c >>> 1\n }\n }\n rfc2083_crc_table[n] = c\n }\n\n rfc2083_crc_table_computed = 1\n}\n\n/* Update a running CRC with the bytes buf[0..len-1]--the CRC\n should be initialized to all 1's, and the transmitted value\n is the 1's complement of the final running CRC (see the\n crc() routine below)). */\n\nfunction rfc2083_update_crc (crc: number, u8buf: Uint8Array, at: number, len: number): number {\n let c = crc\n let n: number\n\n if (!rfc2083_crc_table_computed) {\n rfc2083_make_crc_table()\n }\n\n for (n = 0; n < len; n++) {\n c = rfc2083_crc_table[(c ^ u8buf[at + n]) & 0xff] ^ (c >>> 8)\n }\n\n return c\n}\n\nfunction rfc2083_crc (u8buf: Uint8Array, at: number, len: number): number {\n return rfc2083_update_crc(0xffffffff, u8buf, at, len) ^ 0xffffffff\n}\n\nfunction crc32 (mb: ArrayBuffer, at: number, len: number): number {\n const u8 = new Uint8Array(mb)\n return rfc2083_crc(u8, at, len)\n}\n\nclass PngIHDR {\n depth: number = 8\n type: number = 6\n compression: number = 0\n filter: number = 0\n interlace: number = 0\n\n constructor (public width: number, public height: number) {}\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const orig = at\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.buffer_size() - 12); at += 4\n dv.setUint8(at, 'I'.charCodeAt(0)); at++\n dv.setUint8(at, 'H'.charCodeAt(0)); at++\n dv.setUint8(at, 'D'.charCodeAt(0)); at++\n dv.setUint8(at, 'R'.charCodeAt(0)); at++\n dv.setUint32(at, this.width); at += 4\n dv.setUint32(at, this.height); at += 4\n dv.setUint8(at, this.depth); at++\n dv.setUint8(at, this.type); at++\n dv.setUint8(at, this.compression); at++\n dv.setUint8(at, this.filter); at++\n dv.setUint8(at, this.interlace); at++\n dv.setUint32(at, crc32(a, orig + 4, this.buffer_size() - 8)); at += 4\n return at\n }\n\n buffer_size (): number {\n return 12 + 13\n }\n}\n\nclass adler {\n s1: number = 1\n s2: number = 0\n\n update (b: number): void {\n this.s1 += b\n this.s1 %= 65521\n this.s2 += this.s1\n this.s2 %= 65521\n }\n}\n\nclass PngIDAT {\n constructor (public width: number, public height: number, public data: ArrayBuffer) {\n if (data.byteLength > 65535) {\n throw new Error('Cannot handle more than 64K')\n }\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const orig = at\n let x: number, y: number, i: number\n const dv = new SpiceDataView(a)\n const zsum = new adler()\n dv.setUint32(at, this.buffer_size() - 12); at += 4\n dv.setUint8(at, 'I'.charCodeAt(0)); at++\n dv.setUint8(at, 'D'.charCodeAt(0)); at++\n dv.setUint8(at, 'A'.charCodeAt(0)); at++\n dv.setUint8(at, 'T'.charCodeAt(0)); at++\n\n /* zlib header. */\n dv.setUint8(at, 0x78); at++\n dv.setUint8(at, 0x01); at++\n\n /* Deflate header. Specifies uncompressed, final bit */\n dv.setUint8(at, 0x80); at++\n dv.setUint16(at, this.data.byteLength + this.height); at += 2\n dv.setUint16(at, ~(this.data.byteLength + this.height)); at += 2\n const u8 = new Uint8Array(this.data)\n for (i = 0, y = 0; y < this.height; y++) {\n /* Filter type 0 - uncompressed */\n dv.setUint8(at, 0); at++\n zsum.update(0)\n for (x = 0; x < this.width && i < this.data.byteLength; x++) {\n zsum.update(u8[i])\n dv.setUint8(at, u8[i++]); at++\n zsum.update(u8[i])\n dv.setUint8(at, u8[i++]); at++\n zsum.update(u8[i])\n dv.setUint8(at, u8[i++]); at++\n zsum.update(u8[i])\n dv.setUint8(at, u8[i++]); at++\n }\n }\n\n /* zlib checksum. */\n dv.setUint16(at, zsum.s2); at += 2\n dv.setUint16(at, zsum.s1); at += 2\n\n /* FIXME - something is not quite right with the zlib code;\n you get an error from libpng if you open the image in\n gimp. But it works, so it's good enough for now... */\n\n dv.setUint32(at, crc32(a, orig + 4, this.buffer_size() - 8)); at += 4\n return at\n }\n\n buffer_size (): number {\n return 12 + this.data.byteLength + this.height + 4 + 2 + 1 + 2 + 2\n }\n}\n\nclass PngIEND {\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const orig = at\n const dv = new SpiceDataView(a)\n dv.setUint32(at, this.buffer_size() - 12); at += 4\n dv.setUint8(at, 'I'.charCodeAt(0)); at++\n dv.setUint8(at, 'E'.charCodeAt(0)); at++\n dv.setUint8(at, 'N'.charCodeAt(0)); at++\n dv.setUint8(at, 'D'.charCodeAt(0)); at++\n dv.setUint32(at, crc32(a, orig + 4, this.buffer_size() - 8)); at += 4\n return at\n }\n\n buffer_size (): number {\n return 12\n }\n}\n\nexport function create_rgba_png (width: number, height: number, bytes: ArrayBuffer): string {\n let i: number\n const ihdr = new PngIHDR(width, height)\n const idat = new PngIDAT(width, height, bytes)\n const iend = new PngIEND()\n\n const mb = new ArrayBuffer(ihdr.buffer_size() + idat.buffer_size() + iend.buffer_size())\n let at = ihdr.to_buffer(mb)\n at = idat.to_buffer(mb, at)\n at = iend.to_buffer(mb, at)\n\n const u8 = new Uint8Array(mb)\n let str = ''\n for (i = 0; i < at; i++) {\n str += '%'\n if (u8[i] < 16) {\n str += '0'\n }\n str += u8[i].toString(16)\n }\n\n return '%89PNG%0D%0A%1A%0A' + str\n}\n","/*\n Copyright (C) 2013 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** SpiceSimulateCursor\n** Internet Explorer 10 does not support data uri's in cursor assignment.\n** This file provides a number of gimmicks to compensate. First, if there\n** is a preloaded cursor available, we will use that. Failing that, we will\n** simulate a cursor using an image that is moved around the screen.\n**-------------------------------------------------------------------------- */\n\nimport { SpiceDataView } from './spicedataview.js'\nimport { hex_sha1 } from './thirdparty/sha1.js'\n\nexport namespace SpiceSimulateCursor {\n\n export const cursors: Record<string, string> = {}\n export const unknown_cursors: Record<string, string> = {}\n export let warned: boolean = false\n\n export function add_cursor (sha1: string, value: string): void {\n cursors[sha1] = value\n }\n\n export function unknown_cursor (sha1: string, curdata: string): void {\n if (!warned) {\n warned = true\n alert('Internet Explorer does not support dynamic cursors. ' +\n 'This page will now simulate cursors with images, ' +\n 'which will be imperfect. We recommend using Chrome or Firefox instead. ' +\n '\\n\\nIf you need to use Internet Explorer, you can create a static cursor ' +\n 'file for each cursor your application uses. ' +\n 'View the console log for more information on creating static cursors for your environment.')\n }\n\n if (!unknown_cursors[sha1]) {\n unknown_cursors[sha1] = curdata\n console.log('Unknown cursor. Simulation required. To avoid simulation for this cursor, create and include a custom javascript file, and add the following line:')\n console.log('SpiceCursorSimulator.add_cursor(\"' + sha1 + '\"), \"<your filename here>.cur\");')\n console.log('And then run following command, redirecting output into <your filename here>.cur:')\n console.log('php -r \"echo urldecode(\\'' + curdata + '\\');\"')\n }\n }\n\n export function simulate_cursor (spicecursor: any, cursor: any, screen: HTMLElement, pngstr: string): void {\n const cursor_sha = hex_sha1(pngstr + ' ' + cursor.header.hot_spot_x + ' ' + cursor.header.hot_spot_y)\n if (typeof cursors[cursor_sha] !== 'undefined') {\n const curstr = 'url(' + cursors[cursor_sha] + '), default'\n screen.style.cursor = curstr\n }\n\n if (window.getComputedStyle(screen, null).cursor == 'auto') {\n unknown_cursor(cursor_sha,\n create_icondir(cursor.header.width, cursor.header.height,\n cursor.data.byteLength, cursor.header.hot_spot_x, cursor.header.hot_spot_y) + pngstr)\n\n document.getElementById(spicecursor.parent.screen_id)?.style.setProperty('cursor', 'none')\n if (!spicecursor.spice_simulated_cursor) {\n spicecursor.spice_simulated_cursor = document.createElement('img')\n\n spicecursor.spice_simulated_cursor.style.position = 'absolute'\n spicecursor.spice_simulated_cursor.style.display = 'none'\n spicecursor.spice_simulated_cursor.style.overflow = 'hidden'\n\n spicecursor.spice_simulated_cursor.spice_screen = document.getElementById(spicecursor.parent.screen_id)\n\n spicecursor.spice_simulated_cursor.addEventListener('mousemove', handle_sim_mousemove)\n\n spicecursor.spice_simulated_cursor.spice_screen?.appendChild(spicecursor.spice_simulated_cursor)\n }\n\n spicecursor.spice_simulated_cursor.src = 'data:image/png,' + pngstr\n\n spicecursor.spice_simulated_cursor.spice_hot_x = cursor.header.hot_spot_x\n spicecursor.spice_simulated_cursor.spice_hot_y = cursor.header.hot_spot_y\n\n spicecursor.spice_simulated_cursor.style.pointerEvents = 'none'\n } else {\n if (spicecursor.spice_simulated_cursor) {\n spicecursor.spice_simulated_cursor.spice_screen?.removeChild(spicecursor.spice_simulated_cursor)\n delete spicecursor.spice_simulated_cursor\n }\n }\n }\n\n export function handle_sim_mousemove (e: MouseEvent): boolean {\n const f = duplicate_mouse_event(e, this.spice_screen)\n return this.spice_screen.dispatchEvent(f)\n }\n\n export function duplicate_mouse_event (e: MouseEvent, target: Element): MouseEvent {\n const evt = document.createEvent('mouseevent') as MouseEvent\n evt.initMouseEvent(e.type, true, true, e.view, e.detail,\n e.screenX, e.screenY, e.clientX, e.clientY,\n e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget)\n return evt\n }\n\n export class ICONDIR {\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint16(at, 0, true); at += 2\n dv.setUint16(at, 2, true); at += 2\n dv.setUint16(at, 1, true); at += 2\n return at\n }\n\n buffer_size (): number {\n return 6\n }\n }\n\n export class ICONDIRENTRY {\n constructor (public width: number, public height: number, public bytes: number, public hot_x: number, public hot_y: number) {}\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new SpiceDataView(a)\n dv.setUint8(at, this.width); at++\n dv.setUint8(at, this.height); at++\n dv.setUint8(at, 0); at++ /* color palette count, unused */\n dv.setUint8(at, 0); at++ /* reserved */\n dv.setUint16(at, this.hot_x, true); at += 2\n dv.setUint16(at, this.hot_y, true); at += 2\n dv.setUint32(at, this.bytes, true); at += 4\n dv.setUint32(at, at + 4, true); at += 4 /* Offset to bytes */\n return at\n }\n\n buffer_size (): number {\n return 16\n }\n }\n\n export function create_icondir (width: number, height: number, bytes: number, hot_x: number, hot_y: number): string {\n let i: number\n const header = new ICONDIR()\n const entry = new ICONDIRENTRY(width, height, bytes, hot_x, hot_y)\n\n const mb = new ArrayBuffer(header.buffer_size() + entry.buffer_size())\n let at = header.to_buffer(mb)\n at = entry.to_buffer(mb, at)\n\n const u8 = new Uint8Array(mb)\n let str = ''\n for (i = 0; i < at; i++) {\n str += '%'\n if (u8[i] < 16) {\n str += '0'\n }\n str += u8[i].toString(16)\n }\n return str\n }\n\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* --------------------------------------------------------------------------------------\n** SpiceWireReader\n** This class will receive messages from a WebSocket and relay it to a given\n** callback. It will optionally save and pass along a header, useful in processing\n** the mini message format.\n**-------------------------------------------------------------------------------------- */\n\nimport { DEBUG, combine_array_buffers } from './utils'\n\nexport class SpiceWireReader {\n sc: any\n callback: Function\n needed: number = 0\n size: number = 0\n buffers: ArrayBuffer[] = []\n saved_msg_header: any\n\n constructor (sc: any, callback: Function) {\n this.sc = sc\n this.callback = callback\n\n this.sc.ws.wire_reader = this\n this.sc.ws.binaryType = 'arraybuffer'\n this.sc.ws.addEventListener('message', wire_blob_catcher)\n }\n\n /* ------------------------------------------------------------------------\n ** Process messages coming in from our WebSocket\n **---------------------------------------------------------------------- */\n inbound (mb: ArrayBuffer): void {\n /* Just buffer if we don't need anything yet */\n if (this.needed == 0) {\n this.buffers.push(mb)\n this.size += mb.byteLength\n return\n }\n\n /* Optimization - if we have just one inbound block, and it's\n suitable for our needs, just use it. */\n if (this.buffers.length == 0 && mb.byteLength >= this.needed) {\n if (mb.byteLength > this.needed) {\n this.size = mb.byteLength - this.needed\n this.buffers.push(mb.slice(this.needed))\n mb = mb.slice(0, this.needed)\n }\n this.callback.call(this.sc, mb,\n this.saved_msg_header || undefined)\n } else {\n this.buffers.push(mb)\n this.size += mb.byteLength\n }\n\n /* Optimization - All it takes is one combine */\n while (this.size >= this.needed) {\n let count = 0\n const frame = new ArrayBuffer(this.needed)\n const view = new Uint8Array(frame)\n\n while (count < frame.byteLength && this.buffers.length > 0) {\n const buf = this.buffers.shift()\n if (!buf) {\n return\n }\n const uint8 = new Uint8Array(buf)\n const step = frame.byteLength - count\n\n /* Optimization - use dataview.set() instead of combine_array_buffers() */\n if (uint8.length <= step) {\n view.set(uint8, count)\n count += uint8.length\n this.size -= uint8.length\n } else {\n const temp = uint8.slice(0, step)\n view.set(temp, count)\n count += temp.length\n this.size -= temp.length\n\n this.buffers.unshift(uint8.slice(step).buffer)\n }\n }\n\n this.callback.call(this.sc, frame, this.saved_msg_header || undefined)\n }\n }\n\n request (n: number): void {\n this.needed = n\n }\n\n save_header (h: any): void {\n this.saved_msg_header = h\n }\n\n clear_header (): void {\n this.saved_msg_header = undefined\n }\n}\n\nfunction wire_blob_catcher (e: MessageEvent): void {\n DEBUG > 1 && console.log('>> WebSockets.onmessage')\n const wireReader = (this as WebSocket & { wire_reader: SpiceWireReader }).wire_reader\n DEBUG > 1 && console.log('id ' + wireReader.sc.connection_id + '; type ' + wireReader.sc.type)\n wireReader.inbound(e.data as ArrayBuffer)\n}\n","/*\n Copyright (C) 2014 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** EBML identifiers\n**-------------------------------------------------------------------------- */\nconst EBML_HEADER = [0x1a, 0x45, 0xdf, 0xa3]\nconst EBML_HEADER_VERSION = [0x42, 0x86]\nconst EBML_HEADER_READ_VERSION = [0x42, 0xf7]\nconst EBML_HEADER_MAX_ID_LENGTH = [0x42, 0xf2]\nconst EBML_HEADER_MAX_SIZE_LENGTH = [0x42, 0xf3]\nconst EBML_HEADER_DOC_TYPE = [0x42, 0x82]\nconst EBML_HEADER_DOC_TYPE_VERSION = [0x42, 0x87]\nconst EBML_HEADER_DOC_TYPE_READ_VERSION = [0x42, 0x85]\n\nconst WEBM_SEGMENT_HEADER = [0x18, 0x53, 0x80, 0x67]\nconst WEBM_SEGMENT_INFORMATION = [0x15, 0x49, 0xA9, 0x66]\n\nconst WEBM_TIMECODE_SCALE = [0x2A, 0xD7, 0xB1]\nconst WEBM_MUXING_APP = [0x4D, 0x80]\nconst WEBM_WRITING_APP = [0x57, 0x41]\n\nconst WEBM_SEEK_HEAD = [0x11, 0x4D, 0x9B, 0x74]\nconst WEBM_SEEK = [0x4D, 0xBB]\nconst WEBM_SEEK_ID = [0x53, 0xAB]\nconst WEBM_SEEK_POSITION = [0x53, 0xAC]\n\nconst WEBM_TRACKS = [0x16, 0x54, 0xAE, 0x6B]\nconst WEBM_TRACK_ENTRY = [0xAE]\nconst WEBM_TRACK_NUMBER = [0xD7]\nconst WEBM_TRACK_UID = [0x73, 0xC5]\nconst WEBM_TRACK_TYPE = [0x83]\nconst WEBM_FLAG_ENABLED = [0xB9]\nconst WEBM_FLAG_DEFAULT = [0x88]\nconst WEBM_FLAG_FORCED = [0x55, 0xAA]\nconst WEBM_FLAG_LACING = [0x9C]\nconst WEBM_MIN_CACHE = [0x6D, 0xE7]\n\nconst WEBM_MAX_BLOCK_ADDITION_ID = [0x55, 0xEE]\nconst WEBM_CODEC_DECODE_ALL = [0xAA]\nconst WEBM_SEEK_PRE_ROLL = [0x56, 0xBB]\nconst WEBM_CODEC_DELAY = [0x56, 0xAA]\nconst WEBM_CODEC_PRIVATE = [0x63, 0xA2]\nconst WEBM_CODEC_ID = [0x86]\n\nconst WEBM_VIDEO = [0xE0]\nconst WEBM_FLAG_INTERLACED = [0x9A]\nconst WEBM_PIXEL_WIDTH = [0xB0]\nconst WEBM_PIXEL_HEIGHT = [0xBA]\n\nconst WEBM_AUDIO = [0xE1]\nconst WEBM_SAMPLING_FREQUENCY = [0xB5]\nconst WEBM_CHANNELS = [0x9F]\n\nconst WEBM_CLUSTER = [0x1F, 0x43, 0xB6, 0x75]\nconst WEBM_TIME_CODE = [0xE7]\nconst WEBM_SIMPLE_BLOCK = [0xA3]\n\n/* ----------------------------------------------------------------------------\n** Various OPUS / Webm constants\n**-------------------------------------------------------------------------- */\nexport const Constants = {\n CLUSTER_SIMPLEBLOCK_FLAG_KEYFRAME: 1 << 7,\n\n OPUS_FREQUENCY: 48000,\n OPUS_CHANNELS: 2,\n\n SPICE_PLAYBACK_CODEC: 'audio/webm; codecs=\"opus\"',\n MAX_CLUSTER_TIME: 1000,\n\n EXPECTED_PACKET_DURATION: 10,\n GAP_DETECTION_THRESHOLD: 50,\n\n SPICE_VP8_CODEC: 'video/webm; codecs=\"vp8\"'\n}\n\n/* ----------------------------------------------------------------------------\n** EBML utility functions\n** These classes can create the binary representation of a webm file\n**-------------------------------------------------------------------------- */\nfunction EBML_write_u1_data_len (len: number, dv: DataView, at: number): number {\n const b = 0x80 | len\n dv.setUint8(at, b)\n return at + 1\n}\n\nfunction EBML_write_u8_value (id: number[], val: number, dv: DataView, at: number): number {\n at = EBML_write_array(id, dv, at)\n at = EBML_write_u1_data_len(1, dv, at)\n dv.setUint8(at, val)\n return at + 1\n}\n\nfunction EBML_write_u32_value (id: number[], val: number, dv: DataView, at: number): number {\n at = EBML_write_array(id, dv, at)\n at = EBML_write_u1_data_len(4, dv, at)\n dv.setUint32(at, val)\n return at + 4\n}\n\nfunction EBML_write_u16_value (id: number[], val: number, dv: DataView, at: number): number {\n at = EBML_write_array(id, dv, at)\n at = EBML_write_u1_data_len(2, dv, at)\n dv.setUint16(at, val)\n return at + 2\n}\n\nfunction EBML_write_float_value (id: number[], val: number, dv: DataView, at: number): number {\n at = EBML_write_array(id, dv, at)\n at = EBML_write_u1_data_len(4, dv, at)\n dv.setFloat32(at, val)\n return at + 4\n}\n\nfunction EBML_write_u64_data_len (len: number, dv: DataView, at: number): number {\n /* Javascript doesn't do 64 bit ints, so this cheats and\n just has a max of 32 bits. Fine for our purposes */\n dv.setUint8(at++, 0x01)\n dv.setUint8(at++, 0x00)\n dv.setUint8(at++, 0x00)\n dv.setUint8(at++, 0x00)\n const val = len & 0xFFFFFFFF\n for (let shift = 24; shift >= 0; shift -= 8) {\n dv.setUint8(at++, val >> shift)\n }\n return at\n}\n\nfunction EBML_write_array (arr: number[], dv: DataView, at: number): number {\n for (let i = 0; i < arr.length; i++) {\n dv.setUint8(at + i, arr[i])\n }\n return at + arr.length\n}\n\nfunction EBML_write_string (str: string, dv: DataView, at: number): number {\n for (let i = 0; i < str.length; i++) {\n dv.setUint8(at + i, str.charCodeAt(i))\n }\n return at + str.length\n}\n\nfunction EBML_write_data (id: number[], data: string | number[], dv: DataView, at: number): number {\n at = EBML_write_array(id, dv, at)\n if (data.length < 127) {\n at = EBML_write_u1_data_len(data.length, dv, at)\n } else {\n at = EBML_write_u64_data_len(data.length, dv, at)\n }\n if (typeof data === 'string') {\n at = EBML_write_string(data, dv, at)\n } else {\n at = EBML_write_array(data, dv, at)\n }\n return at\n}\n\n/* ----------------------------------------------------------------------------\n** Webm objects\n** These classes can create the binary representation of a webm file\n**-------------------------------------------------------------------------- */\nclass EBMLHeader {\n id: number[] = EBML_HEADER\n Version: number = 1\n ReadVersion: number = 1\n MaxIDLength: number = 4\n MaxSizeLength: number = 8\n DocType: string = 'webm'\n DocTypeVersion: number = 2 /* Not well specified by the WebM guys, but functionally required for Firefox */\n DocTypeReadVersion: number = 2\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(0x1f, dv, at)\n at = EBML_write_u8_value(EBML_HEADER_VERSION, this.Version, dv, at)\n at = EBML_write_u8_value(EBML_HEADER_READ_VERSION, this.ReadVersion, dv, at)\n at = EBML_write_u8_value(EBML_HEADER_MAX_ID_LENGTH, this.MaxIDLength, dv, at)\n at = EBML_write_u8_value(EBML_HEADER_MAX_SIZE_LENGTH, this.MaxSizeLength, dv, at)\n at = EBML_write_data(EBML_HEADER_DOC_TYPE, this.DocType, dv, at)\n at = EBML_write_u8_value(EBML_HEADER_DOC_TYPE_VERSION, this.DocTypeVersion, dv, at)\n at = EBML_write_u8_value(EBML_HEADER_DOC_TYPE_READ_VERSION, this.DocTypeReadVersion, dv, at)\n\n return at\n }\n\n buffer_size (): number {\n return 0x1f + 8 + this.id.length\n }\n}\n\nclass webm_Segment {\n id: number[] = WEBM_SEGMENT_HEADER\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n\n at = EBML_write_array(this.id, dv, at)\n dv.setUint8(at++, 0xff)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 1\n }\n}\n\nclass webm_SegmentInformation {\n id: number[] = WEBM_SEGMENT_INFORMATION\n timecode_scale: number = 1000000 /* 1 ms */\n muxing_app: string = 'spice'\n writing_app: string = 'spice-html5'\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n at = EBML_write_u32_value(WEBM_TIMECODE_SCALE, this.timecode_scale, dv, at)\n at = EBML_write_data(WEBM_MUXING_APP, this.muxing_app, dv, at)\n at = EBML_write_data(WEBM_WRITING_APP, this.writing_app, dv, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n WEBM_TIMECODE_SCALE.length + 1 + 4 +\n WEBM_MUXING_APP.length + 1 + this.muxing_app.length +\n WEBM_WRITING_APP.length + 1 + this.writing_app.length\n }\n}\n\nexport class Audio {\n id: number[] = WEBM_AUDIO\n sampling_frequency: number\n channels: number = Constants.OPUS_CHANNELS\n\n constructor (frequency: number) {\n this.sampling_frequency = frequency\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n at = EBML_write_u8_value(WEBM_CHANNELS, this.channels, dv, at)\n at = EBML_write_float_value(WEBM_SAMPLING_FREQUENCY, this.sampling_frequency, dv, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n WEBM_SAMPLING_FREQUENCY.length + 1 + 4 +\n WEBM_CHANNELS.length + 1 + 1\n }\n}\n\nexport class Video {\n id: number[] = WEBM_VIDEO\n flag_interlaced: number = 0\n width: number\n height: number\n\n constructor (width: number, height: number) {\n this.width = width\n this.height = height\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_INTERLACED, this.flag_interlaced, dv, at)\n at = EBML_write_u16_value(WEBM_PIXEL_WIDTH, this.width, dv, at)\n at = EBML_write_u16_value(WEBM_PIXEL_HEIGHT, this.height, dv, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n WEBM_FLAG_INTERLACED.length + 1 + 1 +\n WEBM_PIXEL_WIDTH.length + 1 + 2 +\n WEBM_PIXEL_HEIGHT.length + 1 + 2\n }\n}\n\n/* ---------------------------\n SeekHead not currently used. Hopefully not needed.\n*/\nclass webm_Seek {\n id: number[] = WEBM_SEEK\n pos: number\n seekid: number[]\n\n constructor (seekid: number[], pos: number) {\n this.pos = pos\n this.seekid = seekid\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u1_data_len(this.buffer_size() - 1 - this.id.length, dv, at)\n\n at = EBML_write_data(WEBM_SEEK_ID, this.seekid, dv, at)\n at = EBML_write_u16_value(WEBM_SEEK_POSITION, this.pos, dv, at)\n\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 1 +\n WEBM_SEEK_ID.length + 1 + this.seekid.length +\n WEBM_SEEK_POSITION.length + 1 + 2\n }\n}\n\nclass webm_SeekHead {\n id: number[] = WEBM_SEEK_HEAD\n info: webm_Seek\n track: webm_Seek\n\n constructor (info_pos: number, track_pos: number) {\n this.info = new webm_Seek(WEBM_SEGMENT_INFORMATION, info_pos)\n this.track = new webm_Seek(WEBM_TRACKS, track_pos)\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n\n at = this.info.to_buffer(a, at)\n at = this.track.to_buffer(a, at)\n\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n this.info.buffer_size() +\n this.track.buffer_size()\n }\n}\n\nexport class AudioTrackEntry {\n id: number[] = WEBM_TRACK_ENTRY\n number: number = 1\n uid: number = 2 // Arbitrary id; most likely makes no difference\n type: number = 2 // Audio\n flag_enabled: number = 1\n flag_default: number = 1\n flag_forced: number = 1\n flag_lacing: number = 0\n min_cache: number = 0 // fixme - check\n max_block_addition_id: number = 0\n codec_decode_all: number = 0 // fixme - check\n seek_pre_roll: number = 0 // 80000000; // fixme - check\n codec_delay: number = 80000000 // Must match codec_private.preskip\n codec_id: string = 'A_OPUS'\n audio: Audio = new Audio(Constants.OPUS_FREQUENCY)\n\n // See: http://tools.ietf.org/html/draft-terriberry-oggopus-01\n codec_private: number[] = [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, // OpusHead\n 0x01, // Version\n Constants.OPUS_CHANNELS,\n 0x00, 0x0F, // Preskip - 3840 samples - should be 8ms at 48kHz\n 0x80, 0xbb, 0x00, 0x00, // 48000\n 0x00, 0x00, // Output gain\n 0x00 // Channel mapping family\n ]\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n at = EBML_write_u8_value(WEBM_TRACK_NUMBER, this.number, dv, at)\n at = EBML_write_u8_value(WEBM_TRACK_UID, this.uid, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_ENABLED, this.flag_enabled, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_DEFAULT, this.flag_default, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_FORCED, this.flag_forced, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_LACING, this.flag_lacing, dv, at)\n at = EBML_write_data(WEBM_CODEC_ID, this.codec_id, dv, at)\n at = EBML_write_u8_value(WEBM_MIN_CACHE, this.min_cache, dv, at)\n at = EBML_write_u8_value(WEBM_MAX_BLOCK_ADDITION_ID, this.max_block_addition_id, dv, at)\n at = EBML_write_u8_value(WEBM_CODEC_DECODE_ALL, this.codec_decode_all, dv, at)\n at = EBML_write_u32_value(WEBM_CODEC_DELAY, this.codec_delay, dv, at)\n at = EBML_write_u32_value(WEBM_SEEK_PRE_ROLL, this.seek_pre_roll, dv, at)\n at = EBML_write_u8_value(WEBM_TRACK_TYPE, this.type, dv, at)\n at = EBML_write_data(WEBM_CODEC_PRIVATE, this.codec_private, dv, at)\n\n at = this.audio.to_buffer(a, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n WEBM_TRACK_NUMBER.length + 1 + 1 +\n WEBM_TRACK_UID.length + 1 + 1 +\n WEBM_TRACK_TYPE.length + 1 + 1 +\n WEBM_FLAG_ENABLED.length + 1 + 1 +\n WEBM_FLAG_DEFAULT.length + 1 + 1 +\n WEBM_FLAG_FORCED.length + 1 + 1 +\n WEBM_FLAG_LACING.length + 1 + 1 +\n WEBM_MIN_CACHE.length + 1 + 1 +\n WEBM_MAX_BLOCK_ADDITION_ID.length + 1 + 1 +\n WEBM_CODEC_DECODE_ALL.length + 1 + 1 +\n WEBM_SEEK_PRE_ROLL.length + 1 + 4 +\n WEBM_CODEC_DELAY.length + 1 + 4 +\n WEBM_CODEC_ID.length + this.codec_id.length + 1 +\n WEBM_CODEC_PRIVATE.length + 1 + this.codec_private.length +\n this.audio.buffer_size()\n }\n}\n\nexport class VideoTrackEntry {\n /*\n ** In general, we follow specifications found by looking here:\n ** https://www.webmproject.org/docs/container/\n ** which points here:\n ** https://www.matroska.org/technical/specs/index.html\n ** and here:\n ** https://datatracker.ietf.org/doc/draft-ietf-cellar-matroska/\n ** Our goal is to supply mandatory values, and note where we differ\n ** from the default.\n */\n id: number[] = WEBM_TRACK_ENTRY\n number: number = 1\n uid: number = 1\n type: number = 1 // Video\n flag_enabled: number = 1\n flag_default: number = 1\n flag_forced: number = 1 // Different than default; we wish to force\n flag_lacing: number = 1\n min_cache: number = 0\n max_block_addition_id: number = 0\n codec_id: string = 'V_VP8'\n codec_decode_all: number = 1\n seek_pre_roll: number = 0\n\n video: Video\n\n constructor (width: number, height: number) {\n this.video = new Video(width, height)\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n at = EBML_write_u8_value(WEBM_TRACK_NUMBER, this.number, dv, at)\n at = EBML_write_u8_value(WEBM_TRACK_UID, this.uid, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_ENABLED, this.flag_enabled, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_DEFAULT, this.flag_default, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_FORCED, this.flag_forced, dv, at)\n at = EBML_write_u8_value(WEBM_FLAG_LACING, this.flag_lacing, dv, at)\n at = EBML_write_data(WEBM_CODEC_ID, this.codec_id, dv, at)\n at = EBML_write_u8_value(WEBM_MIN_CACHE, this.min_cache, dv, at)\n at = EBML_write_u8_value(WEBM_MAX_BLOCK_ADDITION_ID, this.max_block_addition_id, dv, at)\n at = EBML_write_u8_value(WEBM_CODEC_DECODE_ALL, this.codec_decode_all, dv, at)\n at = EBML_write_u32_value(WEBM_SEEK_PRE_ROLL, this.seek_pre_roll, dv, at)\n at = EBML_write_u8_value(WEBM_TRACK_TYPE, this.type, dv, at)\n at = this.video.to_buffer(a, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n WEBM_TRACK_NUMBER.length + 1 + 1 +\n WEBM_TRACK_UID.length + 1 + 1 +\n WEBM_FLAG_ENABLED.length + 1 + 1 +\n WEBM_FLAG_DEFAULT.length + 1 + 1 +\n WEBM_FLAG_FORCED.length + 1 + 1 +\n WEBM_FLAG_LACING.length + 1 + 1 +\n WEBM_CODEC_ID.length + this.codec_id.length + 1 +\n WEBM_MIN_CACHE.length + 1 + 1 +\n WEBM_MAX_BLOCK_ADDITION_ID.length + 1 + 1 +\n WEBM_CODEC_DECODE_ALL.length + 1 + 1 +\n WEBM_SEEK_PRE_ROLL.length + 1 + 4 +\n WEBM_TRACK_TYPE.length + 1 + 1 +\n this.video.buffer_size()\n }\n}\n\nexport class Tracks {\n id: number[] = WEBM_TRACKS\n track_entry: AudioTrackEntry | VideoTrackEntry\n\n constructor (entry: AudioTrackEntry | VideoTrackEntry) {\n this.track_entry = entry\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at)\n at = this.track_entry.to_buffer(a, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n this.track_entry.buffer_size()\n }\n}\n\nexport class Cluster {\n id: number[] = WEBM_CLUSTER\n timecode: number\n data?: ArrayBuffer\n\n constructor (timecode: number, data?: ArrayBuffer) {\n this.timecode = timecode\n this.data = data\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n dv.setUint8(at++, 0xff)\n at = EBML_write_u32_value(WEBM_TIME_CODE, this.timecode, dv, at)\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 1 +\n WEBM_TIME_CODE.length + 1 + 4\n }\n}\n\nexport class SimpleBlock {\n id: number[] = WEBM_SIMPLE_BLOCK\n timecode: number\n data: ArrayBuffer\n keyframe: boolean\n\n constructor (timecode: number, data: ArrayBuffer, keyframe: boolean) {\n this.timecode = timecode\n this.data = data\n this.keyframe = keyframe\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n const dv = new DataView(a)\n at = EBML_write_array(this.id, dv, at)\n at = EBML_write_u64_data_len(this.data.byteLength + 4, dv, at)\n at = EBML_write_u1_data_len(1, dv, at) // Track #\n dv.setUint16(at, this.timecode); at += 2 // timecode - relative to cluster\n dv.setUint8(at, this.keyframe ? Constants.CLUSTER_SIMPLEBLOCK_FLAG_KEYFRAME : 0); at += 1 // flags\n\n // FIXME - There should be a better way to copy\n const u8 = new Uint8Array(this.data)\n for (let i = 0; i < this.data.byteLength; i++) {\n dv.setUint8(at++, u8[i])\n }\n\n return at\n }\n\n buffer_size (): number {\n return this.id.length + 8 +\n 1 + 2 + 1 +\n this.data.byteLength\n }\n}\n\nexport class Header {\n ebml: EBMLHeader = new EBMLHeader()\n segment: webm_Segment = new webm_Segment()\n seek_head: webm_SeekHead = new webm_SeekHead(0, 0)\n info: webm_SegmentInformation = new webm_SegmentInformation()\n\n constructor () {\n this.seek_head.info.pos = this.segment.buffer_size() + this.seek_head.buffer_size()\n this.seek_head.track.pos = this.seek_head.info.pos + this.info.buffer_size()\n }\n\n to_buffer (a: ArrayBuffer, at?: number): number {\n at = at || 0\n at = this.ebml.to_buffer(a, at)\n at = this.segment.to_buffer(a, at)\n at = this.info.to_buffer(a, at)\n\n return at\n }\n\n buffer_size (): number {\n return this.ebml.buffer_size() +\n this.segment.buffer_size() +\n this.info.buffer_size()\n }\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** SpiceConn\n** This is the base Javascript class for establishing and\n** managing a connection to a Spice Server.\n** It is used to provide core functionality to the Spice main,\n** display, inputs, and cursor channels. See main.js for\n** usage.\n**-------------------------------------------------------------------------- */\n\nimport { Constants } from './enums'\nimport { SpiceWireReader } from './wire'\nimport {\n SpiceLinkHeader,\n SpiceLinkMess,\n SpiceLinkReply,\n SpiceLinkAuthTicket,\n SpiceLinkAuthReply,\n SpiceMiniData,\n SpiceMsgcDisplayInit,\n SpiceMsgSetAck,\n SpiceMsgcAckSync,\n SpiceMsgNotify\n} from './spicemsg'\nimport { DEBUG, hexdump_buffer } from './utils'\nimport * as Webm from './webm'\nimport { rsa_encrypt } from './ticket'\n\nclass SpiceConn {\n ws: WebSocket\n connection_id: number\n type: number\n chan_id: number\n parent?: SpiceConn\n message_id?: string\n password?: string\n screen_id?: string\n dump_id?: string\n onerror?: (error: Error) => void\n onsuccess?: (message: string) => void\n onagent?: (conn: SpiceConn) => void\n state: string\n wire_reader: SpiceWireReader\n messages_sent: number\n warnings: { [key: number]: boolean }\n reply_hdr?: SpiceLinkHeader\n reply_link?: SpiceLinkReply\n auth_reply?: SpiceLinkAuthReply\n ack_window?: number\n msgs_until_ack?: number\n timeout?: number\n\n constructor (o: any) {\n if (o === undefined || o.uri === undefined || !o.uri) { throw new Error('You must specify a uri') }\n\n this.ws = new WebSocket(o.uri, 'binary')\n\n if (!this.ws.binaryType) { throw new Error(\"WebSocket doesn't support binaryType. Try a different browser.\") }\n\n this.connection_id = o.connection_id !== undefined ? o.connection_id : 0\n this.type = o.type !== undefined ? o.type : Constants.SPICE_CHANNEL_MAIN\n this.chan_id = o.chan_id !== undefined ? o.chan_id : 0\n if (o.parent !== undefined) {\n this.parent = o.parent\n this.message_id = o.parent.message_id\n this.password = o.parent.password\n }\n if (o.screen_id !== undefined) { this.screen_id = o.screen_id }\n if (o.dump_id !== undefined) { this.dump_id = o.dump_id }\n if (o.message_id !== undefined) { this.message_id = o.message_id }\n if (o.password !== undefined) { this.password = o.password }\n if (o.onerror !== undefined) { this.onerror = o.onerror }\n if (o.onsuccess !== undefined) { this.onsuccess = o.onsuccess }\n if (o.onagent !== undefined) { this.onagent = o.onagent }\n\n this.state = 'connecting'\n this.ws.parent = this\n this.wire_reader = new SpiceWireReader(this, this.process_inbound.bind(this))\n this.messages_sent = 0\n this.warnings = []\n\n this.ws.addEventListener('open', function (e) {\n DEBUG > 0 && console.log('>> WebSockets.onopen')\n DEBUG > 0 && console.log('id ' + this.parent.connection_id + '; type ' + this.parent.type)\n\n /***********************************************************************\n ** WHERE IT ALL REALLY BEGINS\n ***********************************************************************/\n this.parent.send_hdr()\n this.parent.wire_reader.request(SpiceLinkHeader.prototype.buffer_size())\n this.parent.state = 'start'\n })\n this.ws.addEventListener('error', function (e) {\n if ('url' in e.target) {\n this.parent.log_err(\"WebSocket error: Can't connect to websocket on URL: \" + e.target.url)\n }\n this.parent.report_error(e)\n })\n this.ws.addEventListener('close', function (e) {\n DEBUG > 0 && console.log('>> WebSockets.onclose')\n DEBUG > 0 && console.log('id ' + this.parent.connection_id + '; type ' + this.parent.type)\n DEBUG > 0 && console.log(e)\n if (this.parent.state != 'closing' && this.parent.state != 'error' && this.parent.onerror !== undefined) {\n var e: Error\n if (this.parent.state == 'connecting') { e = new Error('Connection refused.') } else if (this.parent.state == 'start' || this.parent.state == 'link') { e = new Error('Unexpected protocol mismatch.') } else if (this.parent.state == 'ticket') { e = new Error('Bad password.') } else { e = new Error('Unexpected close while ' + this.parent.state) }\n\n this.parent.onerror(e)\n this.parent.log_err(e.toString())\n }\n })\n\n if (this.ws.readyState == 2 || this.ws.readyState == 3) { throw new Error('Unable to connect to ' + o.uri) }\n\n this.timeout = window.setTimeout(spiceconn_timeout, Constants.SPICE_CONNECT_TIMEOUT, this)\n }\n\n send_hdr (): void {\n const hdr = new SpiceLinkHeader()\n const msg = new SpiceLinkMess()\n\n msg.connection_id = this.connection_id\n msg.channel_type = this.type\n msg.channel_id = this.chan_id\n\n msg.common_caps.push(\n (1 << Constants.SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION) |\n (1 << Constants.SPICE_COMMON_CAP_MINI_HEADER)\n )\n\n if (msg.channel_type == Constants.SPICE_CHANNEL_PLAYBACK) {\n var caps = 0\n if ('MediaSource' in window && MediaSource.isTypeSupported(Webm.Constants.SPICE_PLAYBACK_CODEC)) { caps |= (1 << Constants.SPICE_PLAYBACK_CAP_OPUS) }\n msg.channel_caps.push(caps)\n } else if (msg.channel_type == Constants.SPICE_CHANNEL_MAIN) {\n msg.channel_caps.push(\n (1 << Constants.SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS)\n )\n } else if (msg.channel_type == Constants.SPICE_CHANNEL_DISPLAY) {\n var caps = (1 << Constants.SPICE_DISPLAY_CAP_SIZED_STREAM) |\n (1 << Constants.SPICE_DISPLAY_CAP_STREAM_REPORT) |\n (1 << Constants.SPICE_DISPLAY_CAP_MULTI_CODEC) |\n (1 << Constants.SPICE_DISPLAY_CAP_CODEC_MJPEG)\n if ('MediaSource' in window && MediaSource.isTypeSupported(Webm.Constants.SPICE_VP8_CODEC)) { caps |= (1 << Constants.SPICE_DISPLAY_CAP_CODEC_VP8) }\n msg.channel_caps.push(caps)\n }\n\n hdr.size = msg.buffer_size()\n\n const mb = new ArrayBuffer(hdr.buffer_size() + msg.buffer_size())\n hdr.to_buffer(mb)\n msg.to_buffer(mb, hdr.buffer_size())\n\n DEBUG > 1 && console.log('Sending header:')\n DEBUG > 2 && hexdump_buffer(mb)\n this.ws.send(mb)\n }\n\n send_ticket (ticket: number[]): void {\n const hdr = new SpiceLinkAuthTicket()\n hdr.auth_mechanism = Constants.SPICE_COMMON_CAP_AUTH_SPICE\n // FIXME - we need to implement RSA to make this work right\n hdr.encrypted_data = ticket\n const mb = new ArrayBuffer(hdr.buffer_size())\n\n hdr.to_buffer(mb)\n DEBUG > 1 && console.log('Sending ticket:')\n DEBUG > 2 && hexdump_buffer(mb)\n this.ws.send(mb)\n }\n\n send_msg (msg: any): void {\n const mb = new ArrayBuffer(msg.buffer_size())\n msg.to_buffer(mb)\n this.messages_sent++\n DEBUG > 0 && console.log('>> hdr ' + this.channel_type() + ' type ' + msg.type + ' size ' + mb.byteLength)\n DEBUG > 2 && hexdump_buffer(mb)\n this.ws.send(mb)\n }\n\n process_inbound (mb: ArrayBuffer, saved_header: any): void {\n DEBUG > 2 && console.log(this.type + ': processing message of size ' + mb.byteLength + '; state is ' + this.state)\n if (this.state == 'ready') {\n if (saved_header == undefined) {\n const msg = new SpiceMiniData(mb)\n\n if (msg.type > 500) {\n if (DEBUG > 0) {\n if (typeof alert === 'function') {\n alert('Something has gone very wrong; we think we have message of type ' + msg.type)\n }\n debugger\n }\n }\n\n if (msg.size == 0) {\n this.process_message(msg)\n this.wire_reader.request(SpiceMiniData.prototype.buffer_size())\n } else {\n this.wire_reader.request(msg.size)\n this.wire_reader.save_header(msg)\n }\n } else {\n saved_header.data = mb\n this.process_message(saved_header)\n this.wire_reader.request(SpiceMiniData.prototype.buffer_size())\n this.wire_reader.save_header(undefined)\n }\n } else if (this.state == 'start') {\n this.reply_hdr = new SpiceLinkHeader(mb)\n if (this.reply_hdr.magic != Constants.SPICE_MAGIC) {\n this.state = 'error'\n var e = new Error('Error: magic mismatch: ' + this.reply_hdr.magic)\n this.report_error(e)\n } else {\n // FIXME - Determine major/minor version requirements\n this.wire_reader.request(this.reply_hdr.size)\n this.state = 'link'\n }\n } else if (this.state == 'link') {\n this.reply_link = new SpiceLinkReply(mb)\n // FIXME - Screen the caps - require minihdr at least, right?\n if (this.reply_link.error) {\n this.state = 'error'\n var e = new Error('Error: reply link error ' + this.reply_link.error)\n this.report_error(e)\n } else {\n this.send_ticket(rsa_encrypt(this.reply_link.pub_key, this.password + String.fromCharCode(0)))\n this.state = 'ticket'\n this.wire_reader.request(SpiceLinkAuthReply.prototype.buffer_size())\n }\n } else if (this.state == 'ticket') {\n this.auth_reply = new SpiceLinkAuthReply(mb)\n if (this.auth_reply.auth_code == Constants.SPICE_LINK_ERR_OK) {\n DEBUG > 0 && console.log(this.type + ': Connected')\n\n if (this.type == Constants.SPICE_CHANNEL_DISPLAY) {\n // FIXME - pixmap and glz dictionary config info?\n const dinit = new SpiceMsgcDisplayInit()\n const reply = new SpiceMiniData()\n reply.build_msg(Constants.SPICE_MSGC_DISPLAY_INIT, dinit)\n DEBUG > 0 && console.log('Request display init')\n this.send_msg(reply)\n }\n this.state = 'ready'\n this.wire_reader.request(SpiceMiniData.prototype.buffer_size())\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n delete this.timeout\n }\n } else {\n this.state = 'error'\n if (this.auth_reply.auth_code == Constants.SPICE_LINK_ERR_PERMISSION_DENIED) {\n var e = new Error('Permission denied.')\n } else {\n var e = new Error('Unexpected link error ' + this.auth_reply.auth_code)\n }\n this.report_error(e)\n }\n }\n }\n\n process_common_messages (msg: any): boolean {\n if (msg.type == Constants.SPICE_MSG_SET_ACK) {\n const ack = new SpiceMsgSetAck(msg.data)\n // FIXME - what to do with generation?\n this.ack_window = ack.window\n DEBUG > 1 && console.log(this.type + ': set ack to ' + ack.window)\n this.msgs_until_ack = this.ack_window\n const ackack = new SpiceMsgcAckSync(ack)\n const reply = new SpiceMiniData()\n reply.build_msg(Constants.SPICE_MSGC_ACK_SYNC, ackack)\n this.send_msg(reply)\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_PING) {\n DEBUG > 1 && console.log('ping!')\n const pong = new SpiceMiniData()\n pong.type = Constants.SPICE_MSGC_PONG\n if (msg.data) {\n pong.data = msg.data.slice(0, 12)\n }\n pong.size = pong.buffer_size()\n this.send_msg(pong)\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_NOTIFY) {\n // FIXME - Visibility + what\n const notify = new SpiceMsgNotify(msg.data)\n if (notify.severity == Constants.SPICE_NOTIFY_SEVERITY_ERROR) { this.log_err(notify.message) } else if (notify.severity == Constants.SPICE_NOTIFY_SEVERITY_WARN) { this.log_warn(notify.message) } else { this.log_info(notify.message) }\n return true\n }\n\n return false\n }\n\n process_message (msg: any): boolean {\n let rc: boolean\n const start = Date.now()\n DEBUG > 0 && console.log('<< hdr ' + this.channel_type() + ' type ' + msg.type + ' size ' + (msg.data && msg.data.byteLength))\n rc = this.process_common_messages(msg)\n if (!rc) {\n if ((this as any).process_channel_message) {\n rc = (this as any).process_channel_message(msg)\n if (!rc) { this.log_warn(this.channel_type() + ': Unknown message type ' + msg.type + '!') }\n } else { this.log_err(this.channel_type() + ': No message handlers for this channel; message ' + msg.type) }\n }\n\n if (this.msgs_until_ack !== undefined && this.ack_window) {\n this.msgs_until_ack--\n if (this.msgs_until_ack <= 0) {\n this.msgs_until_ack = this.ack_window\n const ack = new SpiceMiniData()\n ack.type = Constants.SPICE_MSGC_ACK\n this.send_msg(ack)\n DEBUG > 1 && console.log(this.type + ': sent ack')\n }\n }\n\n const delta = Date.now() - start\n if (DEBUG > 0 || delta > Webm.Constants.GAP_DETECTION_THRESHOLD) { console.log('delta ' + this.channel_type() + ':' + msg.type + ' ' + delta) }\n return rc\n }\n\n channel_type (): string {\n if (this.type == Constants.SPICE_CHANNEL_MAIN) { return 'main' } else if (this.type == Constants.SPICE_CHANNEL_DISPLAY) { return 'display' } else if (this.type == Constants.SPICE_CHANNEL_INPUTS) { return 'inputs' } else if (this.type == Constants.SPICE_CHANNEL_CURSOR) { return 'cursor' } else if (this.type == Constants.SPICE_CHANNEL_PLAYBACK) { return 'playback' } else if (this.type == Constants.SPICE_CHANNEL_RECORD) { return 'record' } else if (this.type == Constants.SPICE_CHANNEL_TUNNEL) { return 'tunnel' } else if (this.type == Constants.SPICE_CHANNEL_SMARTCARD) { return 'smartcard' } else if (this.type == Constants.SPICE_CHANNEL_USBREDIR) { return 'usbredir' } else if (this.type == Constants.SPICE_CHANNEL_PORT) { return 'port' } else if (this.type == Constants.SPICE_CHANNEL_WEBDAV) { return 'webdav' }\n return 'unknown-' + this.type\n }\n\n log_info (): void {\n const msg = Array.prototype.join.call(arguments, ' ')\n console.log(msg)\n if (this.message_id) {\n const p = document.createElement('p')\n p.appendChild(document.createTextNode(msg))\n p.className += 'spice-message-info'\n const elem = document.getElementById(this.message_id)\n if (elem) {\n elem.appendChild(p)\n }\n }\n }\n\n log_warn (): void {\n const msg = Array.prototype.join.call(arguments, ' ')\n console.log('WARNING: ' + msg)\n if (this.message_id) {\n const p = document.createElement('p')\n p.appendChild(document.createTextNode(msg))\n p.className += 'spice-message-warning'\n const elem = document.getElementById(this.message_id)\n if (elem) {\n elem.appendChild(p)\n }\n }\n }\n\n log_err (): void {\n const msg = Array.prototype.join.call(arguments, ' ')\n console.log('ERROR: ' + msg)\n if (this.message_id) {\n const p = document.createElement('p')\n p.appendChild(document.createTextNode(msg))\n p.className += 'spice-message-error'\n const elem = document.getElementById(this.message_id)\n if (elem) {\n elem.appendChild(p)\n }\n }\n }\n\n known_unimplemented (type: number, msg: string): void {\n if ((!this.warnings[type]) || DEBUG > 1) {\n let str = ''\n if (DEBUG <= 1) { str = ' [ further notices suppressed ]' }\n this.log_warn('Unimplemented function ' + type + '(' + msg + ')' + str)\n this.warnings[type] = true\n }\n }\n\n report_error (e: Error): void {\n this.log_err(e.toString())\n if (this.onerror != undefined) { this.onerror(e) } else { throw (e) }\n }\n\n report_success (m: string): void {\n if (this.onsuccess != undefined) { this.onsuccess(m) }\n }\n\n cleanup (): void {\n if (this.timeout) {\n window.clearTimeout(this.timeout)\n delete this.timeout\n }\n if (this.ws) {\n this.ws.close()\n this.ws = undefined as any\n }\n }\n\n handle_timeout (): void {\n const e = new Error('Connection timed out.')\n this.report_error(e)\n }\n}\n\nfunction spiceconn_timeout (sc: SpiceConn): void {\n sc.handle_timeout()\n}\n\nexport {\n SpiceConn\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport { create_rgba_png } from './png'\nimport { Constants } from './enums'\nimport { DEBUG } from './utils'\nimport {\n SpiceMsgCursorInit,\n SpiceMsgCursorSet\n} from './spicemsg'\nimport { SpiceSimulateCursor } from './simulatecursor'\nimport { SpiceConn } from './spiceconn'\n\n/* ----------------------------------------------------------------------------\n** SpiceCursorConn\n** Drive the Spice Cursor Channel\n**-------------------------------------------------------------------------- */\nexport class SpiceCursorConn extends SpiceConn {\n process_channel_message (msg: any): boolean {\n if (msg.type == Constants.SPICE_MSG_CURSOR_INIT) {\n const cursor_init = new SpiceMsgCursorInit(msg.data)\n DEBUG > 1 && console.log('SpiceMsgCursorInit')\n if (this.parent && this.parent.inputs &&\n this.parent.inputs.mouse_mode == Constants.SPICE_MOUSE_MODE_SERVER) {\n // FIXME - this imagines that the server actually\n // provides the current cursor position,\n // instead of 0,0. As of May 11, 2012,\n // that assumption was false :-(.\n this.parent.inputs.mousex = cursor_init.position.x\n this.parent.inputs.mousey = cursor_init.position.y\n }\n // FIXME - We don't handle most of the parameters here...\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_SET) {\n const cursor_set = new SpiceMsgCursorSet(msg.data)\n DEBUG > 1 && console.log('SpiceMsgCursorSet')\n if (cursor_set.flags & Constants.SPICE_CURSOR_FLAGS_NONE) {\n document.getElementById(this.parent.screen_id).style.cursor = 'none'\n return true\n }\n\n if (cursor_set.flags > 0) {\n this.log_warn('FIXME: No support for cursor flags ' + cursor_set.flags)\n }\n\n if (cursor_set.cursor.header.type != Constants.SPICE_CURSOR_TYPE_ALPHA) {\n this.log_warn('FIXME: No support for cursor type ' + cursor_set.cursor.header.type)\n return false\n }\n\n this.set_cursor(cursor_set.cursor)\n\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_MOVE) {\n this.known_unimplemented(msg.type, 'Cursor Move')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_HIDE) {\n DEBUG > 1 && console.log('SpiceMsgCursorHide')\n document.getElementById(this.parent.screen_id).style.cursor = 'none'\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_TRAIL) {\n this.known_unimplemented(msg.type, 'Cursor Trail')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_RESET) {\n DEBUG > 1 && console.log('SpiceMsgCursorReset')\n document.getElementById(this.parent.screen_id).style.cursor = 'auto'\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_INVAL_ONE) {\n this.known_unimplemented(msg.type, 'Cursor Inval One')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_CURSOR_INVAL_ALL) {\n DEBUG > 1 && console.log('SpiceMsgCursorInvalAll')\n // FIXME - There may be something useful to do here...\n return true\n }\n\n return false\n }\n\n set_cursor (cursor: any): void {\n const pngstr = create_rgba_png(cursor.header.width, cursor.header.height, cursor.data)\n const curstr = 'url(data:image/png,' + pngstr + ') ' +\n cursor.header.hot_spot_x + ' ' + cursor.header.hot_spot_y + ', default'\n const screen = document.getElementById(this.parent.screen_id)\n screen.style.cursor = 'auto'\n screen.style.cursor = curstr\n if (window.getComputedStyle(screen, null).cursor == 'auto') {\n SpiceSimulateCursor.simulate_cursor(this, cursor, screen, pngstr)\n }\n }\n}\n","/*\n Copyright (C) 2014 Red Hat, Inc.\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nexport class SpiceFileXferTask {\n id: number\n file: File\n progressbar_container: HTMLDivElement | null = null\n progressbar: HTMLProgressElement | null = null\n cancelled: boolean = false\n\n constructor (id: number, file: File) {\n this.id = id\n this.file = file\n }\n\n create_progressbar (): void {\n const _this = this\n const cancel = document.createElement('input')\n this.progressbar_container = document.createElement('div')\n this.progressbar = document.createElement('progress')\n\n cancel.type = 'button'\n cancel.value = 'Cancel'\n cancel.style.float = 'right'\n cancel.onclick = function () {\n _this.cancelled = true\n _this.remove_progressbar()\n }\n\n if (this.progressbar) {\n this.progressbar.setAttribute('max', this.file.size.toString())\n this.progressbar.setAttribute('value', '0')\n this.progressbar.style.width = '100%'\n this.progressbar.style.margin = '4px auto'\n this.progressbar.style.display = 'inline-block'\n }\n\n if (this.progressbar_container) {\n this.progressbar_container.style.width = '90%'\n this.progressbar_container.style.margin = 'auto'\n this.progressbar_container.style.padding = '4px'\n this.progressbar_container.textContent = this.file.name\n this.progressbar_container.appendChild(cancel)\n if (this.progressbar) {\n this.progressbar_container.appendChild(this.progressbar)\n }\n const xferArea = document.getElementById('spice-xfer-area')\n if (xferArea) {\n xferArea.appendChild(this.progressbar_container)\n }\n }\n }\n\n update_progressbar (value: number): void {\n if (this.progressbar) {\n this.progressbar.setAttribute('value', value.toString())\n }\n }\n\n remove_progressbar (): void {\n if (this.progressbar_container && this.progressbar_container.parentNode) {\n this.progressbar_container.parentNode.removeChild(this.progressbar_container)\n }\n }\n}\n\nexport function handle_file_dragover (e: DragEvent): void {\n e.stopPropagation()\n e.preventDefault()\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'copy'\n }\n}\n\nexport function handle_file_drop (e: DragEvent): void {\n const sc = (window as any).spice_connection\n const files = e.dataTransfer?.files\n\n e.stopPropagation()\n e.preventDefault()\n if (files) {\n for (let i = files.length - 1; i >= 0; i--) {\n if (files[i].type) { // do not copy a directory\n sc.file_xfer_start(files[i])\n }\n }\n }\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport * as Messages from './spicemsg'\nimport { Constants } from './enums'\nimport { KeyNames } from './atKeynames'\nimport { SpiceConn } from './spiceconn'\nimport { DEBUG } from './utils'\n\n/* ----------------------------------------------------------------------------\n ** Modifier Keystates\n ** These need to be tracked because focus in and out can get the keyboard\n ** out of sync.\n **------------------------------------------------------------------------ */\nlet Shift_state: boolean | -1 = -1\nlet Ctrl_state: boolean | -1 = -1\nlet Alt_state: boolean | -1 = -1\nlet Meta_state: boolean | -1 = -1\n\n/* ----------------------------------------------------------------------------\n** SpiceInputsConn\n** Drive the Spice Inputs channel (e.g. mouse + keyboard)\n**-------------------------------------------------------------------------- */\nexport class SpiceInputsConn extends SpiceConn {\n mousex: number | undefined\n mousey: number | undefined\n button_state: number = 0\n waiting_for_ack: number = 0\n keyboard_modifiers: number | undefined\n\n constructor (...args: any[]) {\n super(...args)\n }\n\n process_channel_message (msg: any): boolean {\n if (msg.type == Constants.SPICE_MSG_INPUTS_INIT) {\n const inputs_init = new Messages.SpiceMsgInputsInit(msg.data)\n this.keyboard_modifiers = inputs_init.keyboard_modifiers\n DEBUG > 1 && console.log('MsgInputsInit - modifier ' + this.keyboard_modifiers)\n // FIXME - We don't do anything with the keyboard modifiers...\n return true\n }\n if (msg.type == Constants.SPICE_MSG_INPUTS_KEY_MODIFIERS) {\n const key = new Messages.SpiceMsgInputsKeyModifiers(msg.data)\n this.keyboard_modifiers = key.keyboard_modifiers\n DEBUG > 1 && console.log('MsgInputsKeyModifiers - modifier ' + this.keyboard_modifiers)\n // FIXME - We don't do anything with the keyboard modifiers...\n return true\n }\n if (msg.type == Constants.SPICE_MSG_INPUTS_MOUSE_MOTION_ACK) {\n DEBUG > 1 && console.log('mouse motion ack')\n this.waiting_for_ack -= Constants.SPICE_INPUT_MOTION_ACK_BUNCH\n return true\n }\n return false\n }\n}\n\n/* ----------------------------------------------------------------------------\n** Event handlers for mouse and keyboard events\n**-------------------------------------------------------------------------- */\nexport function handle_mousemove (this: { sc: any }, e: MouseEvent) {\n const msg = new Messages.SpiceMiniData()\n let move\n if (this.sc.mouse_mode == Constants.SPICE_MOUSE_MODE_CLIENT) {\n move = new Messages.SpiceMsgcMousePosition(this.sc, e)\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_POSITION, move)\n } else {\n move = new Messages.SpiceMsgcMouseMotion(this.sc, e)\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_MOTION, move)\n }\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n if (this.sc.inputs.waiting_for_ack < (2 * Constants.SPICE_INPUT_MOTION_ACK_BUNCH)) {\n this.sc.inputs.send_msg(msg)\n this.sc.inputs.waiting_for_ack++\n } else {\n DEBUG > 0 && this.sc.log_info('Discarding mouse motion')\n }\n }\n\n if (this.sc && this.sc.cursor && this.sc.cursor.spice_simulated_cursor) {\n this.sc.cursor.spice_simulated_cursor.style.display = 'block'\n this.sc.cursor.spice_simulated_cursor.style.left = e.pageX - this.sc.cursor.spice_simulated_cursor.spice_hot_x + 'px'\n this.sc.cursor.spice_simulated_cursor.style.top = e.pageY - this.sc.cursor.spice_simulated_cursor.spice_hot_y + 'px'\n e.preventDefault()\n }\n}\n\nexport function handle_mousedown (this: { sc: any }, e: MouseEvent) {\n const press = new Messages.SpiceMsgcMousePress(this.sc, e)\n const msg = new Messages.SpiceMiniData()\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_PRESS, press)\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n this.sc.inputs.send_msg(msg)\n }\n\n e.preventDefault()\n}\n\nexport function handle_contextmenu (this: any, e: MouseEvent) {\n e.preventDefault()\n return false\n}\n\nexport function handle_mouseup (this: { sc: any }, e: MouseEvent) {\n const release = new Messages.SpiceMsgcMouseRelease(this.sc, e)\n const msg = new Messages.SpiceMiniData()\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_RELEASE, release)\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n this.sc.inputs.send_msg(msg)\n }\n\n e.preventDefault()\n}\n\nexport function handle_mousewheel (this: { sc: any }, e: WheelEvent) {\n const press = new Messages.SpiceMsgcMousePress()\n const release = new Messages.SpiceMsgcMouseRelease()\n if (e.deltaY < 0) {\n press.button = release.button = Constants.SPICE_MOUSE_BUTTON_UP\n } else {\n press.button = release.button = Constants.SPICE_MOUSE_BUTTON_DOWN\n }\n press.buttons_state = 0\n release.buttons_state = 0\n\n const msg = new Messages.SpiceMiniData()\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_PRESS, press)\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n this.sc.inputs.send_msg(msg)\n }\n\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_RELEASE, release)\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n this.sc.inputs.send_msg(msg)\n }\n\n e.preventDefault()\n}\n\nexport function handle_keydown (this: { sc: any }, e: KeyboardEvent) {\n const key = new Messages.SpiceMsgcKeyDown(e)\n const msg = new Messages.SpiceMiniData()\n check_and_update_modifiers(e, key.code, this.sc)\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_DOWN, key)\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n this.sc.inputs.send_msg(msg)\n }\n\n e.preventDefault()\n}\n\nexport function handle_keyup (this: { sc: any }, e: KeyboardEvent) {\n const key = new Messages.SpiceMsgcKeyUp(e)\n const msg = new Messages.SpiceMiniData()\n check_and_update_modifiers(e, key.code, this.sc)\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_UP, key)\n if (this.sc && this.sc.inputs && this.sc.inputs.state === 'ready') {\n this.sc.inputs.send_msg(msg)\n }\n\n e.preventDefault()\n}\n\nexport function sendCtrlAltDel (sc: any) {\n if (sc && sc.inputs && sc.inputs.state === 'ready') {\n const key = new Messages.SpiceMsgcKeyDown()\n const msg = new Messages.SpiceMiniData()\n\n update_modifier(true, KeyNames.KEY_LCtrl, sc)\n update_modifier(true, KeyNames.KEY_Alt, sc)\n\n key.code = KeyNames.KEY_KP_Decimal\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_DOWN, key)\n sc.inputs.send_msg(msg)\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_UP, key)\n sc.inputs.send_msg(msg)\n\n if (Ctrl_state == false) update_modifier(false, KeyNames.KEY_LCtrl, sc)\n if (Alt_state == false) update_modifier(false, KeyNames.KEY_Alt, sc)\n }\n}\n\nfunction update_modifier (state: boolean, code: number, sc: any) {\n const msg = new Messages.SpiceMiniData()\n if (!state) {\n var key = new Messages.SpiceMsgcKeyUp()\n key.code = (0x80 | code)\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_UP, key)\n } else {\n var key = new Messages.SpiceMsgcKeyDown()\n key.code = code\n msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_DOWN, key)\n }\n\n sc.inputs.send_msg(msg)\n}\n\nfunction check_and_update_modifiers (e: KeyboardEvent, code: number, sc: any) {\n if (Shift_state === -1) {\n Shift_state = e.shiftKey\n Ctrl_state = e.ctrlKey\n Alt_state = e.altKey\n Meta_state = e.metaKey\n }\n\n if (code === KeyNames.KEY_ShiftL) {\n Shift_state = true\n } else if (code === KeyNames.KEY_Alt) {\n Alt_state = true\n } else if (code === KeyNames.KEY_LCtrl) {\n Ctrl_state = true\n } else if (code === 0xE0B5) {\n Meta_state = true\n } else if (code === (0x80 | KeyNames.KEY_ShiftL)) {\n Shift_state = false\n } else if (code === (0x80 | KeyNames.KEY_Alt)) {\n Alt_state = false\n } else if (code === (0x80 | KeyNames.KEY_LCtrl)) {\n Ctrl_state = false\n } else if (code === (0x80 | 0xE0B5)) {\n Meta_state = false\n }\n\n if (sc && sc.inputs && sc.inputs.state === 'ready') {\n if (Shift_state != e.shiftKey) {\n console.log('Shift state out of sync')\n update_modifier(e.shiftKey, KeyNames.KEY_ShiftL, sc)\n Shift_state = e.shiftKey\n }\n if (Alt_state != e.altKey) {\n console.log('Alt state out of sync')\n update_modifier(e.altKey, KeyNames.KEY_Alt, sc)\n Alt_state = e.altKey\n }\n if (Ctrl_state != e.ctrlKey) {\n console.log('Ctrl state out of sync')\n update_modifier(e.ctrlKey, KeyNames.KEY_LCtrl, sc)\n Ctrl_state = e.ctrlKey\n }\n if (Meta_state != e.metaKey) {\n console.log('Meta state out of sync')\n update_modifier(e.metaKey, 0xE0B5, sc)\n Meta_state = e.metaKey\n }\n }\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport { Constants } from './enums'\n\n/* ----------------------------------------------------------------------------\n** lz.js\n** Functions for handling SPICE_IMAGE_TYPE_LZ_RGB\n** Adapted from lz.c .\n**-------------------------------------------------------------------------- */\nfunction lz_rgb32_decompress (in_buf: Uint8Array, at: number, out_buf: Uint8ClampedArray, type: number, default_alpha: boolean): number {\n let encoder = at\n let op = 0\n let ctrl: number\n let i = 0\n\n for (ctrl = in_buf[encoder++]; (op * 4) < out_buf.length; ctrl = in_buf[encoder++]) {\n let ref = op\n let len = ctrl >> 5\n let ofs = (ctrl & 31) << 8\n\n if (ctrl >= 32) {\n var code: number\n len--\n\n if (len == 7 - 1) {\n do {\n code = in_buf[encoder++]\n len += code\n } while (code == 255)\n }\n code = in_buf[encoder++]\n ofs += code\n\n if (code == 255) {\n if ((ofs - code) == (31 << 8)) {\n ofs = in_buf[encoder++] << 8\n ofs += in_buf[encoder++]\n ofs += 8191\n }\n }\n len += 1\n if (type == Constants.LZ_IMAGE_TYPE_RGBA) {\n len += 2\n }\n\n ofs += 1\n\n ref -= ofs\n if (ref == (op - 1)) {\n const b = ref\n for (; len; --len) {\n if (type == Constants.LZ_IMAGE_TYPE_RGBA) {\n out_buf[(op * 4) + 3] = out_buf[(b * 4) + 3]\n } else {\n for (i = 0; i < 4; i++) {\n out_buf[(op * 4) + i] = out_buf[(b * 4) + i]\n }\n }\n op++\n }\n } else {\n for (; len; --len) {\n if (type == Constants.LZ_IMAGE_TYPE_RGBA) {\n out_buf[(op * 4) + 3] = out_buf[(ref * 4) + 3]\n } else {\n for (i = 0; i < 4; i++) {\n out_buf[(op * 4) + i] = out_buf[(ref * 4) + i]\n }\n }\n op++\n ref++\n }\n }\n } else {\n ctrl++\n\n if (type == Constants.LZ_IMAGE_TYPE_RGBA) {\n out_buf[(op * 4) + 3] = in_buf[encoder++]\n } else {\n out_buf[(op * 4) + 0] = in_buf[encoder + 2]\n out_buf[(op * 4) + 1] = in_buf[encoder + 1]\n out_buf[(op * 4) + 2] = in_buf[encoder + 0]\n if (default_alpha) {\n out_buf[(op * 4) + 3] = 255\n }\n encoder += 3\n }\n op++\n\n for (--ctrl; ctrl; ctrl--) {\n if (type == Constants.LZ_IMAGE_TYPE_RGBA) {\n out_buf[(op * 4) + 3] = in_buf[encoder++]\n } else {\n out_buf[(op * 4) + 0] = in_buf[encoder + 2]\n out_buf[(op * 4) + 1] = in_buf[encoder + 1]\n out_buf[(op * 4) + 2] = in_buf[encoder + 0]\n if (default_alpha) {\n out_buf[(op * 4) + 3] = 255\n }\n encoder += 3\n }\n op++\n }\n }\n }\n return encoder - 1\n}\n\nfunction flip_image_data (img: ImageData): void {\n const wb = img.width * 4\n const h = img.height\n let temp_h = h\n const buff = new Uint8Array(img.width * img.height * 4)\n while (temp_h--) {\n buff.set(img.data.subarray(temp_h * wb, (temp_h + 1) * wb), (h - temp_h - 1) * wb)\n }\n img.data.set(buff)\n}\n\nfunction lz4_decompress (in_buf: Uint8Array, out_buf: Uint8Array): number {\n let ip = 0\n let op = 0\n const in_len = in_buf.length\n const out_len = out_buf.length\n\n while (ip < in_len && op < out_len) {\n const token = in_buf[ip++]\n let literal_len = token >> 4\n let match_len = token & 0x0F\n\n if (literal_len > 0) {\n if (literal_len === 0x0F) {\n var len\n do {\n len = in_buf[ip++]\n literal_len += len\n } while (len === 0xFF && ip < in_len)\n }\n\n if (op + literal_len > out_len) {\n literal_len = out_len - op\n }\n out_buf.set(in_buf.subarray(ip, ip + literal_len), op)\n ip += literal_len\n op += literal_len\n\n if (op >= out_len || ip >= in_len) {\n break\n }\n }\n\n const offset = in_buf[ip] | (in_buf[ip + 1] << 8)\n ip += 2\n\n if (match_len === 0x0F) {\n var len\n do {\n len = in_buf[ip++]\n match_len += len\n } while (len === 0xFF && ip < in_len)\n }\n match_len += 4\n\n let ref = op - offset\n if (ref < 0) {\n break\n }\n\n if (op + match_len > out_len) {\n match_len = out_len - op\n }\n\n for (let i = 0; i < match_len; i++) {\n out_buf[op++] = out_buf[ref++]\n }\n }\n\n return op\n}\n\nexport function convert_spice_lz_to_web (context: CanvasRenderingContext2D, lz_image: any): ImageData | undefined {\n let at: number\n\n if (lz_image.type >= Constants.LZ_IMAGE_TYPE_LZ4_RGB32 && lz_image.type <= Constants.LZ_IMAGE_TYPE_LZ4_XXXA) {\n const compressed = new Uint8Array(lz_image.data)\n var ret = context.createImageData(lz_image.width, lz_image.height)\n const out_len = lz_image.width * lz_image.height * 4\n const decompressed = new Uint8Array(out_len)\n\n lz4_decompress(compressed, decompressed)\n\n if (lz_image.type === Constants.LZ_IMAGE_TYPE_LZ4_RGBA ||\n lz_image.type === Constants.LZ_IMAGE_TYPE_LZ4_XXXA) {\n ret.data.set(decompressed)\n } else {\n for (let i = 0; i < out_len; i += 4) {\n ret.data[i] = decompressed[i + 2]\n ret.data[i + 1] = decompressed[i + 1]\n ret.data[i + 2] = decompressed[i]\n ret.data[i + 3] = 255\n }\n }\n\n if (!lz_image.top_down) {\n flip_image_data(ret)\n }\n return ret\n }\n\n if (lz_image.type === Constants.LZ_IMAGE_TYPE_RGB32 || lz_image.type === Constants.LZ_IMAGE_TYPE_RGBA) {\n var u8 = new Uint8Array(lz_image.data)\n var ret = context.createImageData(lz_image.width, lz_image.height)\n\n at = lz_rgb32_decompress(u8, 0, ret.data, Constants.LZ_IMAGE_TYPE_RGB32, lz_image.type != Constants.LZ_IMAGE_TYPE_RGBA)\n if (!lz_image.top_down) {\n flip_image_data(ret)\n }\n\n if (lz_image.type == Constants.LZ_IMAGE_TYPE_RGBA) {\n lz_rgb32_decompress(u8, at, ret.data, Constants.LZ_IMAGE_TYPE_RGBA, false)\n }\n return ret\n } else if (lz_image.type === Constants.LZ_IMAGE_TYPE_XXXA) {\n var u8 = new Uint8Array(lz_image.data)\n var ret = context.createImageData(lz_image.width, lz_image.height)\n lz_rgb32_decompress(u8, 0, ret.data, Constants.LZ_IMAGE_TYPE_RGBA, false)\n return ret\n }\n return undefined\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport { Constants } from './enums'\n\ninterface SpiceBitmap {\n data: ArrayBuffer\n format: number\n flags: number\n x: number\n y: number\n stride: number\n}\n\nexport function convert_spice_bitmap_to_web (context: CanvasRenderingContext2D, spice_bitmap: SpiceBitmap): ImageData | undefined {\n let ret: ImageData\n let offset: number; let x: number; let src_offset: number = 0; let src_dec: number = 0\n const u8 = new Uint8Array(spice_bitmap.data)\n\n if (spice_bitmap.format != Constants.SPICE_BITMAP_FMT_32BIT &&\n spice_bitmap.format != Constants.SPICE_BITMAP_FMT_RGBA) {\n return undefined\n }\n\n if (!(spice_bitmap.flags & Constants.SPICE_BITMAP_FLAGS_TOP_DOWN)) {\n src_offset = (spice_bitmap.y - 1) * spice_bitmap.stride\n src_dec = 2 * spice_bitmap.stride\n }\n\n ret = context.createImageData(spice_bitmap.x, spice_bitmap.y)\n\n for (offset = 0; offset < (spice_bitmap.y * spice_bitmap.stride); src_offset -= src_dec) {\n for (x = 0; x < spice_bitmap.x; x++, offset += 4, src_offset += 4) {\n ret.data[offset + 0] = u8[src_offset + 2]\n ret.data[offset + 1] = u8[src_offset + 1]\n ret.data[offset + 2] = u8[src_offset + 0]\n\n // FIXME - We effectively treat all images as having SPICE_IMAGE_FLAGS_HIGH_BITS_SET\n if (spice_bitmap.format == Constants.SPICE_BITMAP_FMT_32BIT) {\n ret.data[offset + 3] = 255\n } else {\n ret.data[offset + 3] = u8[src_offset]\n }\n }\n }\n\n return ret\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport * as Webm from './webm'\nimport * as Messages from './spicemsg'\nimport * as Quic from './quic'\nimport * as Utils from './utils'\nimport * as Inputs from './inputs'\nimport { Constants } from './enums'\nimport { SpiceConn } from './spiceconn'\nimport { SpiceRect } from './spicetype'\nimport { convert_spice_lz_to_web } from './lz'\nimport { convert_spice_bitmap_to_web } from './bitmap'\n\n/* ----------------------------------------------------------------------------\n** FIXME: putImageData does not support Alpha blending\n** or compositing. So if we have data in an ImageData\n** format, we have to draw it onto a context,\n** and then use drawImage to put it onto the target,\n** as drawImage does alpha.\n**-------------------------------------------------------------------------- */\nexport function putImageDataWithAlpha (context: CanvasRenderingContext2D, d: ImageData, x: number, y: number): void {\n const c = document.createElement('canvas')\n const t = c.getContext('2d')\n if (!t) return\n c.setAttribute('width', d.width.toString())\n c.setAttribute('height', d.height.toString())\n t.putImageData(d, 0, 0)\n context.drawImage(c, x, y, d.width, d.height)\n}\n\n/* ----------------------------------------------------------------------------\n** FIXME: Spice will send an image with '0' alpha when it is intended to\n** go on a surface w/no alpha. So in that case, we have to strip\n** out the alpha. The test case for this was flux box; in a Xspice\n** server, right click on the desktop to get the menu; the top bar\n** doesn't paint/highlight correctly w/out this change.\n**-------------------------------------------------------------------------- */\nexport function stripAlpha (d: ImageData): void {\n for (let i = 0; i < (d.width * d.height * 4); i += 4) {\n d.data[i + 3] = 255\n }\n}\n\ninterface DrawCopyHelperOptions {\n base: any\n src_area: any\n image_data: ImageData\n tag: string\n has_alpha: boolean\n descriptor: any\n}\n\n/* ----------------------------------------------------------------------------\n** SpiceDisplayConn\n** Drive the Spice Display Channel\n**-------------------------------------------------------------------------- */\nexport class SpiceDisplayConn extends SpiceConn {\n surfaces: any[]\n primary_surface: number\n cache: any\n focusListener: () => void\n\n process_channel_message (msg: any): boolean {\n if (msg.type == Constants.SPICE_MSG_DISPLAY_MODE) {\n this.known_unimplemented(msg.type, 'Display Mode')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_MARK) {\n // FIXME - DISPLAY_MARK not implemented (may be hard or impossible)\n this.known_unimplemented(msg.type, 'Display Mark')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_RESET) {\n Utils.DEBUG > 2 && console.log('Display reset')\n this.surfaces[this.primary_surface].canvas.context.restore()\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_COPY) {\n const draw_copy = new Messages.SpiceMsgDisplayDrawCopy(msg.data)\n\n Utils.DEBUG > 1 && this.log_draw('DrawCopy', draw_copy)\n\n if (!draw_copy.base.box.is_same_size(draw_copy.data.src_area)) {\n this.log_warn('FIXME: DrawCopy src_area is a different size than base.box; we do not handle that yet.')\n }\n if (draw_copy.base.clip.type != Constants.SPICE_CLIP_TYPE_NONE) {\n this.log_warn(\"FIXME: DrawCopy we don't handle clipping yet\")\n }\n if (draw_copy.data.rop_descriptor != Constants.SPICE_ROPD_OP_PUT) {\n this.log_warn(\"FIXME: DrawCopy we don't handle ropd type: \" + draw_copy.data.rop_descriptor)\n }\n if (draw_copy.data.mask.flags) {\n this.log_warn(\"FIXME: DrawCopy we don't handle mask flag: \" + draw_copy.data.mask.flags)\n }\n if (draw_copy.data.mask.bitmap) {\n this.log_warn(\"FIXME: DrawCopy we don't handle mask\")\n }\n\n if (draw_copy.data && draw_copy.data.src_bitmap) {\n if (draw_copy.data.src_bitmap.descriptor.flags &&\n draw_copy.data.src_bitmap.descriptor.flags != Constants.SPICE_IMAGE_FLAGS_CACHE_ME &&\n draw_copy.data.src_bitmap.descriptor.flags != Constants.SPICE_IMAGE_FLAGS_HIGH_BITS_SET) {\n this.log_warn('FIXME: DrawCopy unhandled image flags: ' + draw_copy.data.src_bitmap.descriptor.flags)\n Utils.DEBUG <= 1 && this.log_draw('DrawCopy', draw_copy)\n }\n\n if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_QUIC) {\n const canvas = this.surfaces[draw_copy.base.surface_id].canvas\n if (!draw_copy.data.src_bitmap.quic) {\n this.log_warn('FIXME: DrawCopy could not handle this QUIC file.')\n return false\n }\n const source_img = Quic.convert_spice_quic_to_web(canvas.context,\n draw_copy.data.src_bitmap.quic)\n\n return this.draw_copy_helper({\n base: draw_copy.base,\n src_area: draw_copy.data.src_area,\n image_data: source_img,\n tag: 'copyquic.' + draw_copy.data.src_bitmap.quic.type,\n has_alpha: (draw_copy.data.src_bitmap.quic.type == Quic.Constants.QUIC_IMAGE_TYPE_RGBA),\n descriptor: draw_copy.data.src_bitmap.descriptor\n })\n } else if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_FROM_CACHE ||\n draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS) {\n if (!this.cache || !this.cache[draw_copy.data.src_bitmap.descriptor.id]) {\n this.log_warn('FIXME: DrawCopy did not find image id ' + draw_copy.data.src_bitmap.descriptor.id + ' in cache.')\n return false\n }\n\n return this.draw_copy_helper({\n base: draw_copy.base,\n src_area: draw_copy.data.src_area,\n image_data: this.cache[draw_copy.data.src_bitmap.descriptor.id],\n tag: 'copycache.' + draw_copy.data.src_bitmap.descriptor.id,\n has_alpha: true, /* FIXME - may want this to be false... */\n descriptor: draw_copy.data.src_bitmap.descriptor\n })\n\n /* FIXME - LOSSLESS CACHE ramifications not understood or handled */\n } else if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_SURFACE) {\n const source_context = this.surfaces[draw_copy.data.src_bitmap.surface_id].canvas.context\n\n const source_img = source_context.getImageData(\n draw_copy.data.src_area.left, draw_copy.data.src_area.top,\n draw_copy.data.src_area.right - draw_copy.data.src_area.left,\n draw_copy.data.src_area.bottom - draw_copy.data.src_area.top)\n const computed_src_area = new SpiceRect()\n computed_src_area.top = computed_src_area.left = 0\n computed_src_area.right = source_img.width\n computed_src_area.bottom = source_img.height\n\n /* FIXME - there is a potential optimization here.\n That is, if the surface is from 0,0, and\n both surfaces are alpha surfaces, you should\n be able to just do a drawImage, which should\n save time. */\n\n return this.draw_copy_helper({\n base: draw_copy.base,\n src_area: computed_src_area,\n image_data: source_img,\n tag: 'copysurf.' + draw_copy.data.src_bitmap.surface_id,\n has_alpha: this.surfaces[draw_copy.data.src_bitmap.surface_id].format != Constants.SPICE_SURFACE_FMT_32_xRGB,\n descriptor: draw_copy.data.src_bitmap.descriptor\n })\n } else if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_JPEG) {\n if (!draw_copy.data.src_bitmap.jpeg) {\n this.log_warn('FIXME: DrawCopy could not handle this JPEG file.')\n return false\n }\n\n // FIXME - how lame is this. Be have it in binary format, and we have\n // to put it into string to get it back into jpeg. Blech.\n let tmpstr = 'data:image/jpeg,'\n const img = new Image()\n const qdv = new Uint8Array(draw_copy.data.src_bitmap.jpeg.data)\n for (let i = 0; i < qdv.length; i++) {\n tmpstr += '%'\n if (qdv[i] < 16) {\n tmpstr += '0'\n }\n tmpstr += qdv[i].toString(16)\n }\n\n img.o = {\n base: draw_copy.base,\n tag: 'jpeg.' + draw_copy.data.src_bitmap.surface_id,\n descriptor: draw_copy.data.src_bitmap.descriptor,\n sc: this\n }\n img.onload = handle_draw_jpeg_onload\n img.src = tmpstr\n\n return true\n } else if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_JPEG_ALPHA) {\n if (!draw_copy.data.src_bitmap.jpeg_alpha) {\n this.log_warn('FIXME: DrawCopy could not handle this JPEG ALPHA file.')\n return false\n }\n\n // FIXME - how lame is this. Be have it in binary format, and we have\n // to put it into string to get it back into jpeg. Blech.\n let tmpstr = 'data:image/jpeg,'\n const img = new Image()\n const qdv = new Uint8Array(draw_copy.data.src_bitmap.jpeg_alpha.data)\n for (let i = 0; i < qdv.length; i++) {\n tmpstr += '%'\n if (qdv[i] < 16) {\n tmpstr += '0'\n }\n tmpstr += qdv[i].toString(16)\n }\n\n img.o = {\n base: draw_copy.base,\n tag: 'jpeg.' + draw_copy.data.src_bitmap.surface_id,\n descriptor: draw_copy.data.src_bitmap.descriptor,\n sc: this\n }\n\n if (this.surfaces[draw_copy.base.surface_id].format == Constants.SPICE_SURFACE_FMT_32_ARGB) {\n const canvas = this.surfaces[draw_copy.base.surface_id].canvas\n img.alpha_img = convert_spice_lz_to_web(canvas.context,\n draw_copy.data.src_bitmap.jpeg_alpha.alpha)\n }\n img.onload = handle_draw_jpeg_onload\n img.src = tmpstr\n\n return true\n } else if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_BITMAP) {\n const canvas = this.surfaces[draw_copy.base.surface_id].canvas\n if (!draw_copy.data.src_bitmap.bitmap) {\n this.log_err('null bitmap')\n return false\n }\n\n const source_img = convert_spice_bitmap_to_web(canvas.context,\n draw_copy.data.src_bitmap.bitmap)\n if (!source_img) {\n this.log_warn('FIXME: Unable to interpret bitmap of format: ' +\n draw_copy.data.src_bitmap.bitmap.format)\n return false\n }\n\n return this.draw_copy_helper({\n base: draw_copy.base,\n src_area: draw_copy.data.src_area,\n image_data: source_img,\n tag: 'bitmap.' + draw_copy.data.src_bitmap.bitmap.format,\n has_alpha: draw_copy.data.src_bitmap.bitmap != Constants.SPICE_BITMAP_FMT_32BIT,\n descriptor: draw_copy.data.src_bitmap.descriptor\n })\n } else if (draw_copy.data.src_bitmap.descriptor.type == Constants.SPICE_IMAGE_TYPE_LZ_RGB) {\n const canvas = this.surfaces[draw_copy.base.surface_id].canvas\n if (!draw_copy.data.src_bitmap.lz_rgb) {\n this.log_err('null lz_rgb ')\n return false\n }\n\n const source_img = convert_spice_lz_to_web(canvas.context,\n draw_copy.data.src_bitmap.lz_rgb)\n if (!source_img) {\n this.log_warn('FIXME: Unable to interpret bitmap of type: ' +\n draw_copy.data.src_bitmap.lz_rgb.type)\n return false\n }\n\n return this.draw_copy_helper({\n base: draw_copy.base,\n src_area: draw_copy.data.src_area,\n image_data: source_img,\n tag: 'lz_rgb.' + draw_copy.data.src_bitmap.lz_rgb.type,\n has_alpha: draw_copy.data.src_bitmap.lz_rgb.type == Constants.LZ_IMAGE_TYPE_RGBA,\n descriptor: draw_copy.data.src_bitmap.descriptor\n })\n } else {\n this.log_warn('FIXME: DrawCopy unhandled image type: ' + draw_copy.data.src_bitmap.descriptor.type)\n this.log_draw('DrawCopy', draw_copy)\n return false\n }\n }\n\n this.log_warn('FIXME: DrawCopy no src_bitmap.')\n return false\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_FILL) {\n const draw_fill = new Messages.SpiceMsgDisplayDrawFill(msg.data)\n\n Utils.DEBUG > 1 && this.log_draw('DrawFill', draw_fill)\n\n if (draw_fill.data.rop_descriptor != Constants.SPICE_ROPD_OP_PUT) {\n this.log_warn(\"FIXME: DrawFill we don't handle ropd type: \" + draw_fill.data.rop_descriptor)\n }\n if (draw_fill.data.mask.flags) {\n this.log_warn(\"FIXME: DrawFill we don't handle mask flag: \" + draw_fill.data.mask.flags)\n }\n if (draw_fill.data.mask.bitmap) {\n this.log_warn(\"FIXME: DrawFill we don't handle mask\")\n }\n\n if (draw_fill.data.brush.type == Constants.SPICE_BRUSH_TYPE_SOLID) {\n // FIXME - do brushes ever have alpha?\n const color = draw_fill.data.brush.color & 0xffffff\n const color_str = 'rgb(' + (color >> 16) + ', ' + ((color >> 8) & 0xff) + ', ' + (color & 0xff) + ')'\n this.surfaces[draw_fill.base.surface_id].canvas.context.fillStyle = color_str\n\n this.surfaces[draw_fill.base.surface_id].canvas.context.fillRect(\n draw_fill.base.box.left, draw_fill.base.box.top,\n draw_fill.base.box.right - draw_fill.base.box.left,\n draw_fill.base.box.bottom - draw_fill.base.box.top)\n\n if (Utils.DUMP_DRAWS && this.parent.dump_id) {\n const debug_canvas = document.createElement('canvas')\n debug_canvas.setAttribute('width', this.surfaces[draw_fill.base.surface_id].canvas.width.toString())\n debug_canvas.setAttribute('height', this.surfaces[draw_fill.base.surface_id].canvas.height.toString())\n debug_canvas.setAttribute('id', 'fillbrush.' + draw_fill.base.surface_id + '.' + this.surfaces[draw_fill.base.surface_id].draw_count)\n debug_canvas.getContext('2d').fillStyle = color_str\n debug_canvas.getContext('2d').fillRect(\n draw_fill.base.box.left, draw_fill.base.box.top,\n draw_fill.base.box.right - draw_fill.base.box.left,\n draw_fill.base.box.bottom - draw_fill.base.box.top)\n document.getElementById(this.parent.dump_id).appendChild(debug_canvas)\n }\n\n this.surfaces[draw_fill.base.surface_id].draw_count++\n } else {\n this.log_warn(\"FIXME: DrawFill can't handle brush type: \" + draw_fill.data.brush.type)\n }\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_OPAQUE) {\n this.known_unimplemented(msg.type, 'Display Draw Opaque')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_BLEND) {\n this.known_unimplemented(msg.type, 'Display Draw Blend')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_BLACKNESS) {\n this.known_unimplemented(msg.type, 'Display Draw Blackness')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_WHITENESS) {\n this.known_unimplemented(msg.type, 'Display Draw Whiteness')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_INVERS) {\n this.known_unimplemented(msg.type, 'Display Draw Invers')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_ROP3) {\n this.known_unimplemented(msg.type, 'Display Draw ROP3')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_STROKE) {\n this.known_unimplemented(msg.type, 'Display Draw Stroke')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_TRANSPARENT) {\n this.known_unimplemented(msg.type, 'Display Draw Transparent')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND) {\n this.known_unimplemented(msg.type, 'Display Draw Alpha Blend')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_COPY_BITS) {\n const copy_bits = new Messages.SpiceMsgDisplayCopyBits(msg.data)\n\n Utils.DEBUG > 1 && this.log_draw('CopyBits', copy_bits)\n\n const source_canvas = this.surfaces[copy_bits.base.surface_id].canvas\n const source_context = source_canvas.context\n\n let width = source_canvas.width - copy_bits.src_pos.x\n let height = source_canvas.height - copy_bits.src_pos.y\n if (width > (copy_bits.base.box.right - copy_bits.base.box.left)) {\n width = copy_bits.base.box.right - copy_bits.base.box.left\n }\n if (height > (copy_bits.base.box.bottom - copy_bits.base.box.top)) {\n height = copy_bits.base.box.bottom - copy_bits.base.box.top\n }\n\n const source_img = source_context.getImageData(\n copy_bits.src_pos.x, copy_bits.src_pos.y, width, height)\n putImageDataWithAlpha(source_context, source_img, copy_bits.base.box.left, copy_bits.base.box.top)\n\n if (Utils.DUMP_DRAWS && this.parent.dump_id) {\n const debug_canvas = document.createElement('canvas')\n debug_canvas.setAttribute('width', width.toString())\n debug_canvas.setAttribute('height', height.toString())\n debug_canvas.setAttribute('id', 'copybits' + copy_bits.base.surface_id + '.' + this.surfaces[copy_bits.base.surface_id].draw_count)\n debug_canvas.getContext('2d').putImageData(source_img, 0, 0)\n document.getElementById(this.parent.dump_id).appendChild(debug_canvas)\n }\n\n this.surfaces[copy_bits.base.surface_id].draw_count++\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS) {\n this.known_unimplemented(msg.type, 'Display Inval All Pixmaps')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_INVAL_PALETTE) {\n this.known_unimplemented(msg.type, 'Display Inval Palette')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES) {\n this.known_unimplemented(msg.type, 'Inval All Palettes')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_SURFACE_CREATE) {\n if (!this.surfaces) {\n this.surfaces = []\n }\n\n const m = new Messages.SpiceMsgSurfaceCreate(msg.data)\n Utils.DEBUG > 1 && console.log(this.type + ': MsgSurfaceCreate id ' + m.surface.surface_id +\n '; ' + m.surface.width + 'x' + m.surface.height +\n '; format ' + m.surface.format +\n '; flags ' + m.surface.flags)\n if (m.surface.format != Constants.SPICE_SURFACE_FMT_32_xRGB &&\n m.surface.format != Constants.SPICE_SURFACE_FMT_32_ARGB) {\n this.log_warn('FIXME: cannot handle surface format ' + m.surface.format + ' yet.')\n return false\n }\n\n const canvas = document.createElement('canvas')\n canvas.setAttribute('width', m.surface.width.toString())\n canvas.setAttribute('height', m.surface.height.toString())\n canvas.setAttribute('id', 'spice_surface_' + m.surface.surface_id)\n canvas.setAttribute('tabindex', m.surface.surface_id.toString())\n canvas.context = canvas.getContext('2d')\n\n if (Utils.DUMP_CANVASES && this.parent.dump_id) {\n document.getElementById(this.parent.dump_id).appendChild(canvas)\n }\n\n m.surface.canvas = canvas\n m.surface.draw_count = 0\n this.surfaces[m.surface.surface_id] = m.surface\n\n if (m.surface.flags & Constants.SPICE_SURFACE_FLAGS_PRIMARY) {\n this.primary_surface = m.surface.surface_id\n\n /* This .save() is done entirely to enable SPICE_MSG_DISPLAY_RESET */\n canvas.context.save()\n document.getElementById(this.parent.screen_id).appendChild(canvas)\n\n /* We're going to leave width dynamic, but correctly set the height */\n document.getElementById(this.parent.screen_id).style.height = m.surface.height + 'px'\n this.hook_events()\n }\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_SURFACE_DESTROY) {\n const m = new Messages.SpiceMsgSurfaceDestroy(msg.data)\n Utils.DEBUG > 1 && console.log(this.type + ': MsgSurfaceDestroy id ' + m.surface_id)\n this.delete_surface(m.surface_id)\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_CREATE) {\n const m = new Messages.SpiceMsgDisplayStreamCreate(msg.data)\n Utils.STREAM_DEBUG > 0 && console.log(this.type + ': MsgStreamCreate id' + m.id + '; type ' + m.codec_type +\n '; width ' + m.stream_width + '; height ' + m.stream_height +\n '; left ' + m.dest.left + '; top ' + m.dest.top\n )\n if (!this.streams) {\n this.streams = []\n }\n if (this.streams[m.id]) {\n console.log('Stream ' + m.id + ' already exists')\n } else {\n this.streams[m.id] = m\n }\n\n if (m.codec_type == Constants.SPICE_VIDEO_CODEC_TYPE_VP8) {\n const media = new MediaSource()\n const v = document.createElement('video')\n v.src = window.URL.createObjectURL(media)\n\n v.setAttribute('muted', 'true')\n v.setAttribute('autoplay', 'true')\n v.setAttribute('width', m.stream_width.toString())\n v.setAttribute('height', m.stream_height.toString())\n\n let left = m.dest.left\n let top = m.dest.top\n if (this.surfaces[m.surface_id] !== undefined) {\n left += this.surfaces[m.surface_id].canvas.offsetLeft\n top += this.surfaces[m.surface_id].canvas.offsetTop\n }\n document.getElementById(this.parent.screen_id).appendChild(v)\n v.setAttribute('style', 'pointer-events:none; position: absolute; top:' + top + 'px; left:' + left + 'px;')\n\n media.addEventListener('sourceopen', handle_video_source_open, false)\n media.addEventListener('sourceended', handle_video_source_ended, false)\n media.addEventListener('sourceclosed', handle_video_source_closed, false)\n\n const s = this.streams[m.id]\n s.video = v\n s.media = media\n s.queue = []\n s.start_time = 0\n s.cluster_time = 0\n s.append_okay = false\n\n media.stream = s\n media.spiceconn = this\n v.spice_stream = s\n } else if (m.codec_type == Constants.SPICE_VIDEO_CODEC_TYPE_MJPEG) {\n this.streams[m.id].frames_loading = 0\n } else {\n console.log('Unhandled stream codec: ' + m.codec_type)\n }\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_DATA ||\n msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_DATA_SIZED) {\n let m\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_DATA_SIZED) {\n m = new Messages.SpiceMsgDisplayStreamDataSized(msg.data)\n } else {\n m = new Messages.SpiceMsgDisplayStreamData(msg.data)\n }\n\n if (!this.streams[m.base.id]) {\n console.log('no stream for data')\n return false\n }\n\n const time_until_due = m.base.multi_media_time - this.parent.relative_now()\n\n if (this.streams[m.base.id].codec_type === Constants.SPICE_VIDEO_CODEC_TYPE_MJPEG) {\n process_mjpeg_stream_data(this, m, time_until_due)\n }\n\n if (this.streams[m.base.id].codec_type === Constants.SPICE_VIDEO_CODEC_TYPE_VP8) {\n process_video_stream_data(this.streams[m.base.id], m)\n }\n\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT) {\n const m = new Messages.SpiceMsgDisplayStreamActivateReport(msg.data)\n\n const report = new Messages.SpiceMsgcDisplayStreamReport(m.stream_id, m.unique_id)\n if (this.streams[m.stream_id]) {\n this.streams[m.stream_id].report = report\n this.streams[m.stream_id].max_window_size = m.max_window_size\n this.streams[m.stream_id].timeout_ms = m.timeout_ms\n }\n\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_CLIP) {\n const m = new Messages.SpiceMsgDisplayStreamClip(msg.data)\n Utils.STREAM_DEBUG > 1 && console.log(this.type + ': MsgStreamClip id' + m.id)\n this.streams[m.id].clip = m.clip\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_DESTROY) {\n const m = new Messages.SpiceMsgDisplayStreamDestroy(msg.data)\n Utils.STREAM_DEBUG > 0 && console.log(this.type + ': MsgStreamDestroy id' + m.id)\n\n if (this.streams[m.id].codec_type == Constants.SPICE_VIDEO_CODEC_TYPE_VP8) {\n document.getElementById(this.parent.screen_id).removeChild(this.streams[m.id].video)\n this.streams[m.id].source_buffer = null\n this.streams[m.id].media = null\n this.streams[m.id].video = null\n }\n this.streams[m.id] = undefined\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_STREAM_DESTROY_ALL) {\n this.known_unimplemented(msg.type, 'Display Stream Destroy All')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_INVAL_LIST) {\n const m = new Messages.SpiceMsgDisplayInvalList(msg.data)\n Utils.DEBUG > 1 && console.log(this.type + ': MsgInvalList ' + m.count + ' items')\n for (let i = 0; i < m.count; i++) {\n if (this.cache[m.resources[i].id] != undefined) {\n delete this.cache[m.resources[i].id]\n }\n }\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_MONITORS_CONFIG) {\n this.known_unimplemented(msg.type, 'Display Monitors Config')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_DISPLAY_DRAW_COMPOSITE) {\n this.known_unimplemented(msg.type, 'Display Draw Composite')\n return true\n }\n\n return false\n }\n\n delete_surface (surface_id: number): void {\n const canvas = document.getElementById('spice_surface_' + surface_id)\n if (Utils.DUMP_CANVASES && this.parent.dump_id) {\n document.getElementById(this.parent.dump_id).removeChild(canvas)\n }\n if (this.primary_surface == surface_id) {\n this.unhook_events()\n this.primary_surface = undefined\n document.getElementById(this.parent.screen_id).removeChild(canvas)\n }\n\n delete this.surfaces[surface_id]\n }\n\n draw_copy_helper (o: DrawCopyHelperOptions): boolean {\n const canvas = this.surfaces[o.base.surface_id].canvas\n if (o.has_alpha) {\n /* FIXME - This is based on trial + error, not a serious thoughtful\n analysis of what Spice requires. See display.js for more. */\n if (this.surfaces[o.base.surface_id].format == Constants.SPICE_SURFACE_FMT_32_xRGB) {\n stripAlpha(o.image_data)\n canvas.context.putImageData(o.image_data, o.base.box.left, o.base.box.top)\n } else {\n putImageDataWithAlpha(canvas.context, o.image_data,\n o.base.box.left, o.base.box.top)\n }\n } else {\n canvas.context.putImageData(o.image_data, o.base.box.left, o.base.box.top)\n }\n\n if (o.src_area.left > 0 || o.src_area.top > 0) {\n this.log_warn('FIXME: DrawCopy not shifting draw copies just yet...')\n }\n\n if (o.descriptor && (o.descriptor.flags & Constants.SPICE_IMAGE_FLAGS_CACHE_ME)) {\n if (!this.cache) {\n this.cache = {}\n }\n this.cache[o.descriptor.id] = o.image_data\n }\n\n if (Utils.DUMP_DRAWS && this.parent.dump_id) {\n const debug_canvas = document.createElement('canvas')\n debug_canvas.setAttribute('width', o.image_data.width.toString())\n debug_canvas.setAttribute('height', o.image_data.height.toString())\n debug_canvas.setAttribute('id', o.tag + '.' +\n this.surfaces[o.base.surface_id].draw_count + '.' +\n o.base.surface_id + '@' + o.base.box.left + 'x' + o.base.box.top)\n debug_canvas.getContext('2d').putImageData(o.image_data, 0, 0)\n document.getElementById(this.parent.dump_id).appendChild(debug_canvas)\n }\n\n this.surfaces[o.base.surface_id].draw_count++\n\n return true\n }\n\n log_draw (prefix: string, draw: any): void {\n let str = prefix + '.' + draw.base.surface_id + '.' + this.surfaces[draw.base.surface_id].draw_count + ': '\n str += 'base.box ' + draw.base.box.left + ', ' + draw.base.box.top + ' to ' +\n draw.base.box.right + ', ' + draw.base.box.bottom\n str += '; clip.type ' + draw.base.clip.type\n\n if (draw.data) {\n if (draw.data.src_area) {\n str += '; src_area ' + draw.data.src_area.left + ', ' + draw.data.src_area.top + ' to ' +\n draw.data.src_area.right + ', ' + draw.data.src_area.bottom\n }\n\n if (draw.data.src_bitmap && draw.data.src_bitmap != null) {\n str += '; src_bitmap id: ' + draw.data.src_bitmap.descriptor.id\n str += '; src_bitmap width ' + draw.data.src_bitmap.descriptor.width + ', height ' + draw.data.src_bitmap.descriptor.height\n str += '; src_bitmap type ' + draw.data.src_bitmap.descriptor.type + ', flags ' + draw.data.src_bitmap.descriptor.flags\n if (draw.data.src_bitmap.surface_id !== undefined) {\n str += '; src_bitmap surface_id ' + draw.data.src_bitmap.surface_id\n }\n if (draw.data.src_bitmap.bitmap) {\n str += '; BITMAP format ' + draw.data.src_bitmap.bitmap.format +\n '; flags ' + draw.data.src_bitmap.bitmap.flags +\n '; x ' + draw.data.src_bitmap.bitmap.x +\n '; y ' + draw.data.src_bitmap.bitmap.y +\n '; stride ' + draw.data.src_bitmap.bitmap.stride\n }\n if (draw.data.src_bitmap.quic) {\n str += '; QUIC type ' + draw.data.src_bitmap.quic.type +\n '; width ' + draw.data.src_bitmap.quic.width +\n '; height ' + draw.data.src_bitmap.quic.height\n }\n if (draw.data.src_bitmap.lz_rgb) {\n str += '; LZ_RGB length ' + draw.data.src_bitmap.lz_rgb.length +\n '; magic ' + draw.data.src_bitmap.lz_rgb.magic +\n '; version 0x' + draw.data.src_bitmap.lz_rgb.version.toString(16) +\n '; type ' + draw.data.src_bitmap.lz_rgb.type +\n '; width ' + draw.data.src_bitmap.lz_rgb.width +\n '; height ' + draw.data.src_bitmap.lz_rgb.height +\n '; stride ' + draw.data.src_bitmap.lz_rgb.stride +\n '; top down ' + draw.data.src_bitmap.lz_rgb.top_down\n }\n } else {\n str += '; src_bitmap is null'\n }\n\n if (draw.data.brush) {\n if (draw.data.brush.type == Constants.SPICE_BRUSH_TYPE_SOLID) {\n str += '; brush.color 0x' + draw.data.brush.color.toString(16)\n }\n if (draw.data.brush.type == Constants.SPICE_BRUSH_TYPE_PATTERN) {\n str += '; brush.pat '\n if (draw.data.brush.pattern.pat != null) {\n str += '[SpiceImage]'\n } else {\n str += '[null]'\n }\n str += ' at ' + draw.data.brush.pattern.pos.x + ', ' + draw.data.brush.pattern.pos.y\n }\n }\n\n str += '; rop_descriptor ' + draw.data.rop_descriptor\n if (draw.data.scale_mode !== undefined) {\n str += '; scale_mode ' + draw.data.scale_mode\n }\n str += '; mask.flags ' + draw.data.mask.flags\n str += '; mask.pos ' + draw.data.mask.pos.x + ', ' + draw.data.mask.pos.y\n if (draw.data.mask.bitmap != null) {\n str += '; mask.bitmap width ' + draw.data.mask.bitmap.descriptor.width + ', height ' + draw.data.mask.bitmap.descriptor.height\n str += '; mask.bitmap type ' + draw.data.mask.bitmap.descriptor.type + ', flags ' + draw.data.mask.bitmap.descriptor.flags\n } else {\n str += '; mask.bitmap is null'\n }\n }\n\n console.log(str)\n }\n\n hook_events (): void {\n if (this.primary_surface !== undefined) {\n const canvas = this.surfaces[this.primary_surface].canvas\n canvas.sc = this.parent\n canvas.addEventListener('mousemove', Inputs.handle_mousemove)\n canvas.addEventListener('mousedown', Inputs.handle_mousedown)\n canvas.addEventListener('contextmenu', Inputs.handle_contextmenu)\n canvas.addEventListener('mouseup', Inputs.handle_mouseup)\n canvas.addEventListener('keydown', Inputs.handle_keydown)\n canvas.addEventListener('keyup', Inputs.handle_keyup)\n canvas.addEventListener('mouseout', handle_mouseout)\n canvas.addEventListener('mouseover', handle_mouseover)\n canvas.addEventListener('wheel', Inputs.handle_mousewheel)\n canvas.focus()\n\n this.focusListener = () => this.parent.send_clipboard_grab()\n // send host clipboard when the canvas is rendered initially\n this.focusListener()\n // register focus event to grab host clipboard when the canvas gets focus\n canvas.addEventListener('focus', this.focusListener)\n }\n }\n\n unhook_events (): void {\n if (this.primary_surface !== undefined) {\n const canvas = this.surfaces[this.primary_surface].canvas\n canvas.removeEventListener('mousemove', Inputs.handle_mousemove)\n canvas.removeEventListener('mousedown', Inputs.handle_mousedown)\n canvas.removeEventListener('contextmenu', Inputs.handle_contextmenu)\n canvas.removeEventListener('mouseup', Inputs.handle_mouseup)\n canvas.removeEventListener('keydown', Inputs.handle_keydown)\n canvas.removeEventListener('keyup', Inputs.handle_keyup)\n canvas.removeEventListener('mouseout', handle_mouseout)\n canvas.removeEventListener('mouseover', handle_mouseover)\n canvas.removeEventListener('wheel', Inputs.handle_mousewheel)\n canvas.removeEventListener('focus', this.focusListener)\n }\n }\n\n destroy_surfaces (): void {\n for (const s in this.surfaces) {\n this.delete_surface(this.surfaces[s].surface_id)\n }\n\n this.surfaces = undefined\n }\n}\n\nfunction handle_mouseover (e: MouseEvent): void {\n this.focus()\n}\n\nfunction handle_mouseout (e: MouseEvent): void {\n if (this.sc && this.sc.cursor && this.sc.cursor.spice_simulated_cursor) {\n this.sc.cursor.spice_simulated_cursor.style.display = 'none'\n }\n this.blur()\n}\n\nfunction handle_draw_jpeg_onload (this: HTMLImageElement & { o: any, alpha_img?: ImageData }): void {\n let temp_canvas = null\n let context: CanvasRenderingContext2D\n\n if ('streams' in this.o.sc && this.o.sc.streams[this.o.id]) {\n this.o.sc.streams[this.o.id].frames_loading--\n }\n\n /* ------------------------------------------------------------\n ** FIXME:\n ** The helper should be extended to be able to handle actual HtmlImageElements\n ** ...and the cache should be modified to do so as well\n **---------------------------------------------------------- */\n if (this.o.sc.surfaces[this.o.base.surface_id] === undefined) {\n // This can happen; if the jpeg image loads after our surface\n // has been destroyed (e.g. open a menu, close it quickly),\n // we'll find we have no surface.\n Utils.DEBUG > 2 && this.o.sc.log_info('Discarding jpeg; presumed lost surface ' + this.o.base.surface_id)\n temp_canvas = document.createElement('canvas')\n temp_canvas.setAttribute('width', this.o.base.box.right.toString())\n temp_canvas.setAttribute('height', this.o.base.box.bottom.toString())\n context = temp_canvas.getContext('2d')!\n } else {\n context = this.o.sc.surfaces[this.o.base.surface_id].canvas.context\n }\n\n if (this.alpha_img) {\n const c = document.createElement('canvas')\n const t = c.getContext('2d')!\n c.setAttribute('width', this.alpha_img.width.toString())\n c.setAttribute('height', this.alpha_img.height.toString())\n t.putImageData(this.alpha_img, 0, 0)\n t.globalCompositeOperation = 'source-in'\n t.drawImage(this, 0, 0)\n\n context.drawImage(c, this.o.base.box.left, this.o.base.box.top)\n\n if (this.o.descriptor &&\n (this.o.descriptor.flags & Constants.SPICE_IMAGE_FLAGS_CACHE_ME)) {\n if (!this.o.sc.cache) {\n this.o.sc.cache = {}\n }\n\n this.o.sc.cache[this.o.descriptor.id] = t.getImageData(0, 0,\n this.alpha_img.width,\n this.alpha_img.height)\n }\n } else {\n context.drawImage(this, this.o.base.box.left, this.o.base.box.top)\n\n // Give the Garbage collector a clue to recycle this; avoids\n // fairly massive memory leaks during video playback\n this.onload = undefined\n this.src = Utils.EMPTY_GIF_IMAGE\n\n if (this.o.descriptor &&\n (this.o.descriptor.flags & Constants.SPICE_IMAGE_FLAGS_CACHE_ME)) {\n if (!this.o.sc.cache) {\n this.o.sc.cache = {}\n }\n\n this.o.sc.cache[this.o.descriptor.id] = context.getImageData(this.o.base.box.left, this.o.base.box.top,\n this.o.base.box.right - this.o.base.box.left,\n this.o.base.box.bottom - this.o.base.box.top)\n }\n }\n\n if (temp_canvas == null) {\n if (Utils.DUMP_DRAWS && this.o.sc.parent.dump_id) {\n const debug_canvas = document.createElement('canvas')\n debug_canvas.setAttribute('id', this.o.tag + '.' +\n this.o.sc.surfaces[this.o.base.surface_id].draw_count + '.' +\n this.o.base.surface_id + '@' + this.o.base.box.left + 'x' + this.o.base.box.top)\n debug_canvas.getContext('2d').drawImage(this, 0, 0)\n document.getElementById(this.o.sc.parent.dump_id).appendChild(debug_canvas)\n }\n\n this.o.sc.surfaces[this.o.base.surface_id].draw_count++\n }\n\n if (this.o.sc.streams[this.o.id] && 'report' in this.o.sc.streams[this.o.id]) {\n process_stream_data_report(this.o.sc, this.o.id, this.o.msg_mmtime, this.o.msg_mmtime - this.o.sc.parent.relative_now())\n }\n}\n\nfunction process_mjpeg_stream_data (sc: SpiceDisplayConn, m: any, time_until_due: number): void {\n /* If we are currently processing an mjpeg frame when a new one arrives,\n and the new one is 'late', drop the new frame. This helps the browsers\n keep up, and provides rate control feedback as well */\n if (time_until_due < 0 && sc.streams[m.base.id].frames_loading > 0) {\n if ('report' in sc.streams[m.base.id]) {\n sc.streams[m.base.id].report.num_drops++\n }\n return\n }\n\n let tmpstr = 'data:image/jpeg,'\n const img = new Image()\n const qdv = new Uint8Array(m.data)\n for (let i = 0; i < qdv.length; i++) {\n tmpstr += '%'\n if (qdv[i] < 16) {\n tmpstr += '0'\n }\n tmpstr += qdv[i].toString(16)\n }\n const strm_base = new Messages.SpiceMsgDisplayBase()\n strm_base.surface_id = sc.streams[m.base.id].surface_id\n strm_base.box = m.dest || sc.streams[m.base.id].dest\n strm_base.clip = sc.streams[m.base.id].clip\n img.o = {\n base: strm_base,\n tag: 'mjpeg.' + m.base.id,\n descriptor: null,\n sc,\n id: m.base.id,\n msg_mmtime: m.base.multi_media_time\n }\n img.onload = handle_draw_jpeg_onload\n img.src = tmpstr\n\n sc.streams[m.base.id].frames_loading++\n}\n\nfunction process_stream_data_report (sc: SpiceDisplayConn, id: number, msg_mmtime: number, time_until_due: number): void {\n sc.streams[id].report.num_frames++\n if (sc.streams[id].report.start_frame_mm_time == 0) {\n sc.streams[id].report.start_frame_mm_time = msg_mmtime\n }\n\n if (sc.streams[id].report.num_frames > sc.streams[id].max_window_size ||\n (msg_mmtime - sc.streams[id].report.start_frame_mm_time) > sc.streams[id].timeout_ms) {\n sc.streams[id].report.end_frame_mm_time = msg_mmtime\n sc.streams[id].report.last_frame_delay = time_until_due\n\n const msg = new Messages.SpiceMiniData()\n msg.build_msg(Constants.SPICE_MSGC_DISPLAY_STREAM_REPORT, sc.streams[id].report)\n sc.send_msg(msg)\n\n sc.streams[id].report.start_frame_mm_time = 0\n sc.streams[id].report.num_frames = 0\n sc.streams[id].report.num_drops = 0\n }\n}\n\nfunction handle_video_source_open (e: Event): void {\n const media = e.target as MediaSource\n const stream = media.stream\n const p = media.spiceconn\n\n if (stream.source_buffer) {\n return\n }\n\n let s: SourceBuffer\n try {\n s = media.addSourceBuffer(Webm.Constants.SPICE_VP8_CODEC)\n } catch (e) {\n p.log_err('Codec ' + Webm.Constants.SPICE_VP8_CODEC + ' not available.')\n return\n }\n\n stream.source_buffer = s\n s.spiceconn = p\n s.stream = stream\n\n listen_for_video_events(stream)\n\n const h = new Webm.Header()\n const te = new Webm.VideoTrackEntry(stream.stream_width, stream.stream_height)\n const t = new Webm.Tracks(te)\n\n const mb = new ArrayBuffer(h.buffer_size() + t.buffer_size())\n const b = h.to_buffer(mb)\n t.to_buffer(mb, b)\n\n s.addEventListener('error', handle_video_buffer_error, false)\n s.addEventListener('updateend', handle_append_video_buffer_done, false)\n\n append_video_buffer(s, mb)\n}\n\nfunction handle_video_source_ended (e: Event): void {\n const media = e.target as MediaSource\n const p = media.spiceconn\n p.log_err('Video source unexpectedly ended.')\n}\n\nfunction handle_video_source_closed (e: Event): void {\n const media = e.target as MediaSource\n const p = media.spiceconn\n p.log_err('Video source unexpectedly closed.')\n}\n\nfunction append_video_buffer (sb: SourceBuffer, mb: ArrayBuffer): void {\n try {\n sb.stream.append_okay = false\n sb.appendBuffer(mb)\n } catch (e) {\n const p = sb.spiceconn\n p.log_err('Error invoking appendBuffer: ' + (e as Error).message)\n }\n}\n\nfunction handle_append_video_buffer_done (e: Event): void {\n const sb = e.target as SourceBuffer\n const stream = sb.stream\n\n if (stream.current_frame && 'report' in stream) {\n const sc = stream.media.spiceconn\n const t = stream.current_frame.msg_mmtime\n process_stream_data_report(sc, stream.id, t, t - sc.parent.relative_now())\n }\n\n if (stream.queue.length > 0) {\n stream.current_frame = stream.queue.shift()\n append_video_buffer(stream.source_buffer, stream.current_frame.mb)\n } else {\n stream.append_okay = true\n }\n\n if (!stream.video) {\n if (Utils.STREAM_DEBUG > 0) {\n console.log('Stream id ' + stream.id + ' received updateend after video is gone.')\n }\n return\n }\n\n if (stream.video.buffered.length > 0 &&\n stream.video.currentTime < stream.video.buffered.start(stream.video.buffered.length - 1)) {\n console.log('Video appears to have fallen behind; advancing to ' +\n stream.video.buffered.start(stream.video.buffered.length - 1))\n stream.video.currentTime = stream.video.buffered.start(stream.video.buffered.length - 1)\n }\n\n /* Modern browsers try not to auto play video. */\n if (stream.video.paused && stream.video.readyState >= 2) {\n stream.video.play()\n }\n\n if (Utils.STREAM_DEBUG > 1) {\n console.log(stream.video.currentTime + ':id ' + stream.id + ' updateend ' + Utils.dump_media_element(stream.video))\n }\n}\n\nfunction handle_video_buffer_error (e: Event): void {\n const sb = e.target as SourceBuffer\n const p = sb.spiceconn\n p.log_err('source_buffer error ' + (e as Error).message)\n}\n\nfunction push_or_queue (stream: any, msg: any, mb: ArrayBuffer): void {\n const frame = {\n msg_mmtime: msg.base.multi_media_time\n }\n\n if (stream.append_okay) {\n stream.current_frame = frame\n append_video_buffer(stream.source_buffer, mb)\n } else {\n frame.mb = mb\n stream.queue.push(frame)\n }\n}\n\nfunction video_simple_block (stream: any, msg: any, keyframe: boolean): void {\n const simple = new Webm.SimpleBlock(msg.base.multi_media_time - stream.cluster_time, msg.data, keyframe)\n const mb = new ArrayBuffer(simple.buffer_size())\n simple.to_buffer(mb)\n\n push_or_queue(stream, msg, mb)\n}\n\nfunction new_video_cluster (stream: any, msg: any): void {\n stream.cluster_time = msg.base.multi_media_time\n const c = new Webm.Cluster(stream.cluster_time - stream.start_time, msg.data)\n\n const mb = new ArrayBuffer(c.buffer_size())\n c.to_buffer(mb)\n\n push_or_queue(stream, msg, mb)\n\n video_simple_block(stream, msg, true)\n}\n\nfunction process_video_stream_data (stream: any, msg: any): void {\n if (stream.start_time == 0) {\n stream.start_time = msg.base.multi_media_time\n new_video_cluster(stream, msg)\n } else if (msg.base.multi_media_time - stream.cluster_time >= Webm.Constants.MAX_CLUSTER_TIME) {\n new_video_cluster(stream, msg)\n } else {\n video_simple_block(stream, msg, false)\n }\n}\n\nfunction video_handle_event_debug (e: Event): void {\n const s = (e.target as HTMLVideoElement).spice_stream\n if (s.video) {\n if (Utils.STREAM_DEBUG > 0 || s.video.buffered.length > 1) {\n console.log(s.video.currentTime + ':id ' + s.id + ' event ' + e.type +\n Utils.dump_media_element(s.video))\n }\n }\n\n if (Utils.STREAM_DEBUG > 1 && s.media) {\n console.log(' media_source ' + Utils.dump_media_source(s.media))\n }\n\n if (Utils.STREAM_DEBUG > 1 && s.source_buffer) {\n console.log(' source_buffer ' + Utils.dump_source_buffer(s.source_buffer))\n }\n\n if (Utils.STREAM_DEBUG > 1 || s.queue.length > 1) {\n console.log(' queue len ' + s.queue.length + '; append_okay: ' + s.append_okay)\n }\n}\n\nfunction video_debug_listen_for_one_event (this: HTMLVideoElement, name: string): void {\n this.addEventListener(name, video_handle_event_debug)\n}\n\nfunction listen_for_video_events (stream: any): void {\n const video_0_events = [\n 'abort', 'error'\n ]\n\n const video_1_events = [\n 'loadstart', 'suspend', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay',\n 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange',\n 'play', 'pause', 'ratechange'\n ]\n\n const video_2_events = [\n 'timeupdate',\n 'progress',\n 'resize',\n 'volumechange'\n ]\n\n video_0_events.forEach(video_debug_listen_for_one_event, stream.video)\n if (Utils.STREAM_DEBUG > 0) {\n video_1_events.forEach(video_debug_listen_for_one_event, stream.video)\n }\n if (Utils.STREAM_DEBUG > 1) {\n video_2_events.forEach(video_debug_listen_for_one_event, stream.video)\n }\n}\n","/*\n Copyright (C) 2014 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** SpicePlaybackConn\n** Drive the Spice Playback channel (sound out)\n**-------------------------------------------------------------------------- */\n\nimport * as Utils from './utils'\nimport * as Webm from './webm'\nimport * as Messages from './spicemsg'\nimport { Constants } from './enums'\nimport { SpiceConn } from './spiceconn'\n\nexport class SpicePlaybackConn extends SpiceConn {\n queue: ArrayBuffer[] = []\n append_okay: boolean = false\n start_time: number = 0\n media_source: MediaSource | undefined\n audio: HTMLAudioElement | undefined\n source_buffer: SourceBuffer | undefined\n bytes_written: number = 0\n cluster_time: number = 0\n last_data_time: number = 0\n\n constructor (...args: any[]) {\n super(...args)\n }\n\n process_channel_message (msg: any): boolean {\n if (!window.MediaSource) {\n this.log_err('MediaSource API is not available')\n return false\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_START) {\n const start = new Messages.SpiceMsgPlaybackStart(msg.data)\n\n Utils.PLAYBACK_DEBUG > 0 && console.log('PlaybackStart; frequency ' + start.frequency)\n\n if (start.frequency != Webm.Constants.OPUS_FREQUENCY) {\n this.log_err('This player cannot handle frequency ' + start.frequency)\n return false\n }\n\n if (start.channels != Webm.Constants.OPUS_CHANNELS) {\n this.log_err('This player cannot handle ' + start.channels + ' channels')\n return false\n }\n\n if (start.format != Constants.SPICE_AUDIO_FMT_S16) {\n this.log_err('This player cannot format ' + start.format)\n return false\n }\n\n if (!this.source_buffer) {\n this.media_source = new MediaSource()\n this.media_source.spiceconn = this\n\n this.audio = document.createElement('audio')\n this.audio.spiceconn = this\n this.audio.setAttribute('autoplay', 'true')\n this.audio.src = window.URL.createObjectURL(this.media_source)\n var screenElement = document.getElementById(this.parent.screen_id)\n if (screenElement) {\n screenElement.appendChild(this.audio)\n }\n\n this.media_source.addEventListener('sourceopen', handle_source_open, false)\n this.media_source.addEventListener('sourceended', handle_source_ended, false)\n this.media_source.addEventListener('sourceclosed', handle_source_closed, false)\n\n this.bytes_written = 0\n\n return true\n }\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_DATA) {\n const data = new Messages.SpiceMsgPlaybackData(msg.data)\n\n if (!this.source_buffer) {\n return true\n }\n\n if (this.audio && this.audio.readyState >= 3 && this.audio.buffered.length > 1 &&\n this.audio.currentTime == this.audio.buffered.end(0) &&\n this.audio.currentTime < this.audio.buffered.start(this.audio.buffered.length - 1)) {\n console.log('Audio underrun: we appear to have fallen behind; advancing to ' +\n this.audio.buffered.start(this.audio.buffered.length - 1))\n this.audio.currentTime = this.audio.buffered.start(this.audio.buffered.length - 1)\n }\n\n /* Around version 45, Firefox started being very particular about the\n time stamps put into the Opus stream. The time stamps from the Spice server are\n somewhat irregular. They mostly arrive every 10 ms, but sometimes it is 11, or sometimes\n with two time stamps the same in a row. The previous logic resulted in fuzzy and/or\n distorted audio streams in Firefox in a row.\n\n In theory, the sequence mode should be appropriate for us, but as of 09/27/2016,\n I was unable to make sequence mode work with Firefox.\n\n Thus, we end up with an inelegant hack. Essentially, we force every packet to have\n a 10ms time delta, unless there is an obvious gap in time stream, in which case we\n will resync.\n */\n\n if (this.start_time != 0 && data.time != (this.last_data_time + Webm.Constants.EXPECTED_PACKET_DURATION)) {\n if (Math.abs(data.time - (Webm.Constants.EXPECTED_PACKET_DURATION + this.last_data_time)) < Webm.Constants.MAX_CLUSTER_TIME) {\n Utils.PLAYBACK_DEBUG > 1 && console.log('Hacking time of ' + data.time + ' to ' +\n (this.last_data_time + Webm.Constants.EXPECTED_PACKET_DURATION))\n data.time = this.last_data_time + Webm.Constants.EXPECTED_PACKET_DURATION\n } else {\n Utils.PLAYBACK_DEBUG > 1 && console.log('Apparent gap in audio time; now is ' + data.time + ' last was ' + this.last_data_time)\n }\n }\n\n this.last_data_time = data.time\n\n Utils.PLAYBACK_DEBUG > 1 && console.log('PlaybackData; time ' + data.time + '; length ' + data.data.byteLength)\n\n if (this.start_time == 0) {\n this.start_playback(data)\n } else if (data.time - this.cluster_time >= Webm.Constants.MAX_CLUSTER_TIME) {\n this.new_cluster(data)\n } else {\n this.simple_block(data, false)\n }\n\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_MODE) {\n const mode = new Messages.SpiceMsgPlaybackMode(msg.data)\n if (mode.mode != Constants.SPICE_AUDIO_DATA_MODE_OPUS) {\n this.log_err('This player cannot handle mode ' + mode.mode)\n delete this.source_buffer\n }\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_STOP) {\n Utils.PLAYBACK_DEBUG > 0 && console.log('PlaybackStop')\n if (this.source_buffer) {\n var screenElement = document.getElementById(this.parent.screen_id)\n if (screenElement && this.audio) {\n screenElement.removeChild(this.audio)\n window.URL.revokeObjectURL(this.audio.src)\n }\n\n delete this.source_buffer\n delete this.media_source\n delete this.audio\n\n this.append_okay = false\n this.queue = []\n this.start_time = 0\n\n return true\n }\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_VOLUME) {\n this.known_unimplemented(msg.type, 'Playback Volume')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_MUTE) {\n this.known_unimplemented(msg.type, 'Playback Mute')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_PLAYBACK_LATENCY) {\n this.known_unimplemented(msg.type, 'Playback Latency')\n return true\n }\n\n return false\n }\n\n start_playback (data: any) {\n this.start_time = data.time\n\n const h = new Webm.Header()\n const te = new Webm.AudioTrackEntry()\n const t = new Webm.Tracks(te)\n\n const mb = new ArrayBuffer(h.buffer_size() + t.buffer_size())\n\n this.bytes_written = h.to_buffer(mb)\n this.bytes_written = t.to_buffer(mb, this.bytes_written)\n\n if (this.source_buffer) {\n this.source_buffer.addEventListener('error', handle_sourcebuffer_error, false)\n this.source_buffer.addEventListener('updateend', handle_append_buffer_done, false)\n playback_append_buffer(this, mb)\n }\n\n this.new_cluster(data)\n }\n\n new_cluster (data: any) {\n this.cluster_time = data.time\n\n const c = new Webm.Cluster(data.time - this.start_time)\n\n const mb = new ArrayBuffer(c.buffer_size())\n this.bytes_written += c.to_buffer(mb)\n\n if (this.append_okay) {\n playback_append_buffer(this, mb)\n } else {\n this.queue.push(mb)\n }\n\n this.simple_block(data, true)\n }\n\n simple_block (data: any, keyframe: boolean) {\n const sb = new Webm.SimpleBlock(data.time - this.cluster_time, data.data, keyframe)\n const mb = new ArrayBuffer(sb.buffer_size())\n\n this.bytes_written += sb.to_buffer(mb)\n\n if (this.append_okay) {\n playback_append_buffer(this, mb)\n } else {\n this.queue.push(mb)\n }\n }\n}\n\nfunction handle_source_open (this: MediaSource & { spiceconn: SpicePlaybackConn }, e: Event) {\n const p = this.spiceconn\n\n if (p.source_buffer) {\n return\n }\n\n try {\n p.source_buffer = this.addSourceBuffer(Webm.Constants.SPICE_PLAYBACK_CODEC)\n } catch (error) {\n p.log_err('Codec ' + Webm.Constants.SPICE_PLAYBACK_CODEC + ' not available.')\n return\n }\n\n if (Utils.PLAYBACK_DEBUG > 0) {\n playback_handle_event_debug.call(this, e)\n }\n\n listen_for_audio_events(p)\n\n if (p.source_buffer) {\n p.source_buffer.spiceconn = p\n p.source_buffer.mode = 'segments'\n }\n\n // FIXME - Experimentation with segments and sequences was unsatisfying.\n // Switching to sequence did not solve our gap problem,\n // but the browsers didn't fully support the time seek capability\n // we would expect to gain from 'segments'.\n // Segments worked at the time of this patch, so segments it is for now.\n}\n\nfunction handle_source_ended (this: MediaSource & { spiceconn: SpicePlaybackConn }, e: Event) {\n const p = this.spiceconn\n p.log_err('Audio source unexpectedly ended.')\n}\n\nfunction handle_source_closed (this: MediaSource & { spiceconn: SpicePlaybackConn }, e: Event) {\n const p = this.spiceconn\n p.log_err('Audio source unexpectedly closed.')\n}\n\nfunction condense_playback_queue (queue: ArrayBuffer[]): ArrayBuffer {\n if (queue.length == 1) {\n return queue.shift()!\n }\n\n let len = 0\n let i = 0\n for (i = 0; i < queue.length; i++) {\n len += queue[i].byteLength\n }\n\n const mb = new ArrayBuffer(len)\n const tmp = new Uint8Array(mb)\n len = 0\n for (i = 0; i < queue.length; i++) {\n tmp.set(new Uint8Array(queue[i]), len)\n len += queue[i].byteLength\n }\n queue.length = 0\n return mb\n}\n\nfunction handle_append_buffer_done (this: SourceBuffer & { spiceconn: SpicePlaybackConn }, e: Event) {\n const p = this.spiceconn\n\n if (Utils.PLAYBACK_DEBUG > 1) {\n playback_handle_event_debug.call(this, e)\n }\n\n if (p.queue.length > 0) {\n const mb = condense_playback_queue(p.queue)\n playback_append_buffer(p, mb)\n } else {\n p.append_okay = true\n }\n}\n\nfunction handle_sourcebuffer_error (this: SourceBuffer & { spiceconn: SpicePlaybackConn }, e: Event) {\n const p = this.spiceconn\n p.log_err('source_buffer error')\n}\n\nfunction playback_append_buffer (p: SpicePlaybackConn, b: ArrayBuffer) {\n try {\n if (p.source_buffer) {\n p.source_buffer.appendBuffer(b)\n p.append_okay = false\n }\n } catch (e) {\n p.log_err('Error invoking appendBuffer: ' + (e as Error).message)\n }\n}\n\nfunction playback_handle_event_debug (this: any, e: Event) {\n const p = this.spiceconn\n if (p.audio) {\n if (Utils.PLAYBACK_DEBUG > 0 || p.audio.buffered.length > 1) {\n console.log(p.audio.currentTime + ': event ' + e.type +\n (Utils.dump_media_element ? Utils.dump_media_element(p.audio) : ''))\n }\n }\n\n if (Utils.PLAYBACK_DEBUG > 1 && p.media_source) {\n console.log(' media_source ' + (Utils.dump_media_source ? Utils.dump_media_source(p.media_source) : ''))\n }\n\n if (Utils.PLAYBACK_DEBUG > 1 && p.source_buffer) {\n console.log(' source_buffer ' + (Utils.dump_source_buffer ? Utils.dump_source_buffer(p.source_buffer) : ''))\n }\n\n if (Utils.PLAYBACK_DEBUG > 0 || p.queue.length > 1) {\n console.log(' queue len ' + p.queue.length + '; append_okay: ' + p.append_okay)\n }\n}\n\nfunction playback_debug_listen_for_one_event (this: any, name: string) {\n this.addEventListener(name, playback_handle_event_debug)\n}\n\nfunction listen_for_audio_events (spiceconn: SpicePlaybackConn) {\n const audio_0_events = [\n 'abort', 'error'\n ]\n\n const audio_1_events = [\n 'loadstart', 'suspend', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay',\n 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange',\n 'timeupdate', 'play', 'pause', 'ratechange'\n ]\n\n const audio_2_events = [\n 'progress',\n 'resize',\n 'volumechange'\n ]\n\n if (spiceconn.audio) {\n audio_0_events.forEach(playback_debug_listen_for_one_event, spiceconn.audio)\n if (Utils.PLAYBACK_DEBUG > 0) {\n audio_1_events.forEach(playback_debug_listen_for_one_event, spiceconn.audio)\n }\n if (Utils.PLAYBACK_DEBUG > 1) {\n audio_2_events.forEach(playback_debug_listen_for_one_event, spiceconn.audio)\n }\n }\n}\n","/*\n Copyright (C) 2016 by Oliver Gutierrez <ogutsua@gmail.com>\n Miroslav Chodil <mchodil@redhat.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport { Constants } from './enums'\nimport { DEBUG, arraybuffer_to_str } from './utils'\nimport { SpiceConn } from './spiceconn'\nimport { SpiceMsgPortInit } from './spicemsg'\n\n/* ----------------------------------------------------------------------------\n** SpicePortConn\n** Drive the Spice Port Channel\n**-------------------------------------------------------------------------- */\nexport class SpicePortConn extends SpiceConn {\n port_name: string | null = null\n portName: string = ''\n portOpened: boolean = false\n\n constructor (...args: any[]) {\n super(...args)\n DEBUG > 0 && console.log('SPICE port: created SPICE port channel. Args:', args)\n }\n\n process_channel_message (msg: any): boolean {\n if (msg.type == Constants.SPICE_MSG_PORT_INIT) {\n if (this.port_name === null) {\n const m = new SpiceMsgPortInit(msg.data)\n this.portName = arraybuffer_to_str(new Uint8Array(m.name))\n this.portOpened = m.opened\n DEBUG > 0 && console.log('SPICE port: Port', this.portName, 'initialized')\n return true\n }\n\n DEBUG > 0 && console.log('SPICE port: Port', this.port_name, 'is already initialized.')\n } else if (msg.type == Constants.SPICE_MSG_PORT_EVENT) {\n DEBUG > 0 && console.log('SPICE port: Port event received for', this.portName, msg)\n var event = new CustomEvent('spice-port-event', {\n detail: {\n channel: this,\n spiceEvent: new Uint8Array(msg.data)\n },\n bubbles: true,\n cancelable: true\n })\n\n window.dispatchEvent(event)\n return true\n } else if (msg.type == Constants.SPICE_MSG_SPICEVMC_DATA) {\n DEBUG > 0 && console.log('SPICE port: Data received in port', this.portName, msg)\n var event = new CustomEvent('spice-port-data', {\n detail: {\n channel: this,\n data: msg.data\n },\n bubbles: true,\n cancelable: true\n })\n window.dispatchEvent(event)\n return true\n } else {\n DEBUG > 0 && console.log('SPICE port: SPICE message type not recognized:', msg)\n }\n\n return false\n }\n}\n","/*\n Copyright (C) 2014 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* ----------------------------------------------------------------------------\n** resize.js\n** This bit of Javascript is a set of logic to help with window\n** resizing, using the agent channel to request screen resizes.\n**\n** It's a bit tricky, as we want to wait for resizing to settle down\n** before sending a size. Further, while horizontal resizing to use the whole\n** browser width is fairly easy to arrange with css, resizing an element to use\n** the whole vertical space (or to force a middle div to consume the bulk of the browser\n** window size) is tricky, and the consensus seems to be that Javascript is\n** the only right way to do it.\n**-------------------------------------------------------------------------- */\nfunction resize_helper (sc: any) {\n let w = document.getElementById(sc.screen_id).clientWidth\n const m = document.getElementById(sc.message_id)\n\n /* Resize vertically; basically we leave a 20 pixel margin\n at the bottom, and use the position of the message window\n to figure out how to resize */\n\n let h = window.innerHeight - 20\n\n /* Screen height based on debug console visibility */\n if (m != null) {\n if (window.getComputedStyle(m).getPropertyValue('display') == 'none') {\n /* Get console height from spice.css .spice-message */\n const mh = parseInt(window.getComputedStyle(m).getPropertyValue('height'), 10)\n h = h - mh\n } else {\n /* Show both div elements - spice-area and message-div */\n h = h - m.offsetHeight - m.clientHeight\n }\n }\n\n /* Xorg requires height be a multiple of 8; round down */\n if (h % 8 > 0) { h -= (h % 8) }\n\n /* Xorg requires width be a multiple of 8; round down */\n if (w % 8 > 0) { w -= (w % 8) }\n\n sc.resize_window(0, w, h, 32, 0, 0)\n sc.spice_resize_timer = undefined\n}\n\nfunction handle_resize (e: Event) {\n const sc = window.spice_connection\n\n if (sc && sc.spice_resize_timer) {\n window.clearTimeout(sc.spice_resize_timer)\n sc.spice_resize_timer = undefined\n }\n\n sc.spice_resize_timer = window.setTimeout(resize_helper, 200, sc)\n}\n\nexport {\n resize_helper,\n handle_resize\n}\n","/*\n Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>\n\n This file is part of spice-html5.\n\n spice-html5 is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n spice-html5 is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with spice-html5. If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport * as Messages from './spicemsg'\nimport { Constants } from './enums'\nimport { SpiceCursorConn } from './cursor'\nimport { SpiceConn } from './spiceconn'\nimport { DEBUG } from './utils'\nimport { SpiceFileXferTask, handle_file_dragover, handle_file_drop } from './filexfer'\nimport { SpiceInputsConn, sendCtrlAltDel } from './inputs'\nimport { SpiceDisplayConn } from './display'\nimport { SpicePlaybackConn } from './playback'\nimport { SpicePortConn } from './port'\nimport { resize_helper, handle_resize } from './resize'\n\n/* ----------------------------------------------------------------------------\n** SpiceMainConn\n** This is the master Javascript class for establishing and\n** managing a connection to a Spice Server.\n**\n** Invocation: You must pass an object with properties as follows:\n** uri (required) Uri of a WebSocket listener that is\n** connected to a spice server.\n** password (required) Password to send to the spice server\n** message_id (optional) Identifier of an element in the DOM\n** where SpiceConn will write messages.\n** It will use classes spice-messages-x,\n** where x is one of info, warning, or error.\n** screen_id (optional) Identifier of an element in the DOM\n** where SpiceConn will create any new\n** client screens. This is the main UI.\n** dump_id (optional) If given, an element to use for\n** dumping every single image + canvas drawn.\n** Sometimes useful for debugging.\n** onerror (optional) If given, a function to receive async\n** errors. Note that you should also catch\n** errors for ones that occur inline\n** onagent (optional) If given, a function to be called when\n** a VD agent is connected; a good opportunity\n** to request a resize\n** onsuccess (optional) If given, a function to be called when the\n** session is successfully connected\n**\n** Throws error if there are troubles. Requires a modern (by 2012 standards)\n** browser, including WebSocket and WebSocket.binaryType == arraybuffer\n**\n**-------------------------------------------------------------------------- */\nclass SpiceMainConn extends SpiceConn {\n agent_msg_queue: any[]\n file_xfer_tasks: { [key: number]: SpiceFileXferTask }\n file_xfer_task_id: number\n file_xfer_read_queue: SpiceFileXferTask[]\n ports: SpicePortConn[]\n agent_caps: number[]\n agent_tokens: number\n connection_id: number\n main_init: any\n our_mm_time: number\n mm_time: number\n mouse_mode: number\n agent_connected: boolean\n inputs?: SpiceInputsConn\n cursor?: SpiceCursorConn | SpicePlaybackConn\n display?: SpiceDisplayConn\n extra_channels?: SpiceConn[]\n\n constructor (options: any) {\n if (typeof WebSocket === 'undefined') { throw new Error('WebSocket unavailable. You need to use a different browser.') }\n\n super(options)\n\n this.agent_msg_queue = []\n this.file_xfer_tasks = {}\n this.file_xfer_task_id = 0\n this.file_xfer_read_queue = []\n this.ports = []\n this.agent_caps = [0]\n }\n\n process_channel_message (msg: any): boolean {\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN) {\n this.known_unimplemented(msg.type, 'Main Migrate Begin')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_CANCEL) {\n this.known_unimplemented(msg.type, 'Main Migrate Cancel')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_INIT) {\n this.log_info('Connected to ' + this.ws.url)\n this.report_success('Connected')\n this.main_init = new Messages.SpiceMsgMainInit(msg.data)\n this.connection_id = this.main_init.session_id\n this.agent_tokens = this.main_init.agent_tokens\n\n if (DEBUG > 0) {\n // FIXME - there is a lot here we don't handle; mouse modes, agent,\n // ram_hint, multi_media_time\n this.log_info('session id ' + this.main_init.session_id +\n ' ; display_channels_hint ' + this.main_init.display_channels_hint +\n ' ; supported_mouse_modes ' + this.main_init.supported_mouse_modes +\n ' ; current_mouse_mode ' + this.main_init.current_mouse_mode +\n ' ; agent_connected ' + this.main_init.agent_connected +\n ' ; agent_tokens ' + this.main_init.agent_tokens +\n ' ; multi_media_time ' + this.main_init.multi_media_time +\n ' ; ram_hint ' + this.main_init.ram_hint)\n }\n\n this.our_mm_time = Date.now()\n this.mm_time = this.main_init.multi_media_time\n\n this.handle_mouse_mode(this.main_init.current_mouse_mode,\n this.main_init.supported_mouse_modes)\n\n if (this.main_init.agent_connected) { this.connect_agent() }\n\n const attach = new Messages.SpiceMiniData()\n attach.type = Constants.SPICE_MSGC_MAIN_ATTACH_CHANNELS\n attach.size = attach.buffer_size()\n this.send_msg(attach)\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MOUSE_MODE) {\n const mode = new Messages.SpiceMsgMainMouseMode(msg.data)\n DEBUG > 0 && this.log_info('Mouse supported modes ' + mode.supported_modes + '; current ' + mode.current_mode)\n this.handle_mouse_mode(mode.current_mode, mode.supported_modes)\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MULTI_MEDIA_TIME) {\n this.known_unimplemented(msg.type, 'Main Multi Media Time')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_CHANNELS_LIST) {\n let i: number\n let chans: any\n DEBUG > 0 && console.log('channels')\n chans = new Messages.SpiceMsgChannels(msg.data)\n for (i = 0; i < chans.channels.length; i++) {\n const conn = {\n uri: this.ws.url,\n parent: this,\n connection_id: this.connection_id,\n type: chans.channels[i].type,\n chan_id: chans.channels[i].id\n }\n if (chans.channels[i].type == Constants.SPICE_CHANNEL_DISPLAY) {\n if (chans.channels[i].id == 0) {\n this.display = new SpiceDisplayConn(conn)\n } else {\n this.log_warn('The spice-html5 client does not handle multiple heads.')\n }\n } else if (chans.channels[i].type == Constants.SPICE_CHANNEL_INPUTS) {\n this.inputs = new SpiceInputsConn(conn)\n if (this.inputs) {\n this.inputs.mouse_mode = this.mouse_mode\n }\n } else if (chans.channels[i].type == Constants.SPICE_CHANNEL_CURSOR) { this.cursor = new SpiceCursorConn(conn) } else if (chans.channels[i].type == Constants.SPICE_CHANNEL_PLAYBACK) { this.cursor = new SpicePlaybackConn(conn) } else if (chans.channels[i].type == Constants.SPICE_CHANNEL_PORT) { this.ports.push(new SpicePortConn(conn)) } else {\n if (!('extra_channels' in this)) { this.extra_channels = [] }\n this.extra_channels[i] = new SpiceConn(conn)\n this.log_err('Channel type ' + this.extra_channels[i].channel_type() + ' not implemented')\n }\n }\n\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED) {\n this.connect_agent()\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS) {\n const connected_tokens = new Messages.SpiceMsgMainAgentTokens(msg.data)\n this.agent_tokens = connected_tokens.num_tokens\n this.connect_agent()\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_TOKEN) {\n let remaining_tokens; const tokens = new Messages.SpiceMsgMainAgentTokens(msg.data)\n this.agent_tokens += tokens.num_tokens\n this.send_agent_message_queue()\n\n remaining_tokens = this.agent_tokens\n while (remaining_tokens > 0 && this.file_xfer_read_queue.length > 0) {\n const xfer_task = this.file_xfer_read_queue.shift()\n if (xfer_task) {\n this.file_xfer_read(xfer_task, xfer_task.read_bytes)\n remaining_tokens--\n }\n }\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DISCONNECTED) {\n this.agent_connected = false\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DATA) {\n const agent_data = new Messages.SpiceMsgMainAgentData(msg.data)\n if (agent_data.type == Constants.VD_AGENT_ANNOUNCE_CAPABILITIES) {\n const agent_caps = new Messages.VDAgentAnnounceCapabilities(agent_data.data)\n this.agent_caps = [agent_caps.caps]\n if (agent_caps.request) { this.announce_agent_capabilities(0) }\n return true\n } else if (agent_data.type == Constants.VD_AGENT_FILE_XFER_STATUS) {\n this.handle_file_xfer_status(new Messages.VDAgentFileXferStatusMessage(agent_data.data))\n return true\n } else if (agent_data.type == Constants.VD_AGENT_CLIPBOARD_GRAB) {\n this.handle_clipboard_grab()\n return true\n } else if (agent_data.type == Constants.VD_AGENT_CLIPBOARD) {\n this.handle_clipboard_receive(agent_data)\n return true\n } else if (agent_data.type == Constants.VD_AGENT_CLIPBOARD_REQUEST) {\n this.handle_clipboard_send()\n return true\n } else if (agent_data.type == Constants.VD_AGENT_CLIPBOARD_RELEASE) {\n // Currently we don't need to do anything when the agent releases the clipboard\n return true\n }\n\n return false\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST) {\n this.known_unimplemented(msg.type, 'Main Migrate Switch Host')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_END) {\n this.known_unimplemented(msg.type, 'Main Migrate End')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_NAME) {\n this.known_unimplemented(msg.type, 'Main Name')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_UUID) {\n this.known_unimplemented(msg.type, 'Main UUID')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS) {\n this.known_unimplemented(msg.type, 'Main Migrate Begin Seamless')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK) {\n this.known_unimplemented(msg.type, 'Main Migrate Dst Seamless ACK')\n return true\n }\n\n if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK) {\n this.known_unimplemented(msg.type, 'Main Migrate Dst Seamless NACK')\n return true\n }\n\n return false\n }\n\n stop (msg?: any): void {\n this.state = 'closing'\n\n if (this.inputs) {\n this.inputs.cleanup()\n this.inputs = undefined\n }\n\n if (this.cursor) {\n this.cursor.cleanup()\n this.cursor = undefined\n }\n\n if (this.display) {\n this.display.cleanup()\n this.display.destroy_surfaces()\n this.display = undefined\n }\n\n this.cleanup()\n\n if ('extra_channels' in this) {\n for (const e in this.extra_channels) { this.extra_channels[e].cleanup() }\n }\n this.extra_channels = undefined\n }\n\n send_agent_message_queue (message?: any): void {\n if (!this.agent_connected) { return }\n\n if (message) { this.agent_msg_queue.push(message) }\n\n while (this.agent_tokens > 0 && this.agent_msg_queue.length > 0) {\n const mr = this.agent_msg_queue.shift()\n this.send_msg(mr)\n this.agent_tokens--\n }\n }\n\n send_agent_message (type: number, message: any): void {\n const agent_data = new Messages.SpiceMsgcMainAgentData(type, message)\n let sb = 0; const maxsize = Constants.VD_AGENT_MAX_DATA_SIZE - Messages.SpiceMiniData.prototype.buffer_size()\n const data = new ArrayBuffer(agent_data.buffer_size())\n agent_data.to_buffer(data)\n while (sb < agent_data.buffer_size()) {\n const eb = Math.min(sb + maxsize, agent_data.buffer_size())\n const mr = new Messages.SpiceMiniData()\n mr.type = Constants.SPICE_MSGC_MAIN_AGENT_DATA\n mr.size = eb - sb\n mr.data = data.slice(sb, eb)\n this.send_agent_message_queue(mr)\n sb = eb\n }\n }\n\n announce_agent_capabilities (request: number): void {\n const caps = new Messages.VDAgentAnnounceCapabilities(request, (1 << Constants.VD_AGENT_CAP_MOUSE_STATE) |\n (1 << Constants.VD_AGENT_CAP_MONITORS_CONFIG) |\n (1 << Constants.VD_AGENT_CAP_REPLY) |\n (1 << Constants.VD_AGENT_CAP_CLIPBOARD_SELECTION) |\n (1 << Constants.VD_AGENT_CAP_CLIPBOARD_BY_DEMAND))\n this.send_agent_message(Constants.VD_AGENT_ANNOUNCE_CAPABILITIES, caps)\n }\n\n resize_window (flags: number, width: number, height: number, depth: number, x: number, y: number): void {\n const monitors_config = new Messages.VDAgentMonitorsConfig(flags, width, height, depth, x, y)\n this.send_agent_message(Constants.VD_AGENT_MONITORS_CONFIG, monitors_config)\n }\n\n file_xfer_start (file: File): void {\n let task_id, xfer_start, task\n\n task_id = this.file_xfer_task_id++\n task = new SpiceFileXferTask(task_id, file)\n task.create_progressbar()\n this.file_xfer_tasks[task_id] = task\n xfer_start = new Messages.VDAgentFileXferStartMessage(task_id, file.name, file.size)\n this.send_agent_message(Constants.VD_AGENT_FILE_XFER_START, xfer_start)\n }\n\n handle_file_xfer_status (file_xfer_status: any): void {\n let xfer_error, xfer_task\n if (!this.file_xfer_tasks[file_xfer_status.id]) {\n return\n }\n xfer_task = this.file_xfer_tasks[file_xfer_status.id]\n switch (file_xfer_status.result) {\n case Constants.VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA:\n this.file_xfer_read(xfer_task)\n return\n case Constants.VD_AGENT_FILE_XFER_STATUS_CANCELLED:\n xfer_error = 'transfer is cancelled by spice agent'\n break\n case Constants.VD_AGENT_FILE_XFER_STATUS_ERROR:\n xfer_error = 'some errors occurred in the spice agent'\n break\n case Constants.VD_AGENT_FILE_XFER_STATUS_SUCCESS:\n break\n default:\n xfer_error = 'unhandled status type: ' + file_xfer_status.result\n break\n }\n\n this.file_xfer_completed(xfer_task, xfer_error)\n }\n\n file_xfer_read (file_xfer_task: SpiceFileXferTask, start_byte?: number): void {\n const FILE_XFER_CHUNK_SIZE = 32 * Constants.VD_AGENT_MAX_DATA_SIZE\n const _this = this\n let sb, eb\n let slice, reader\n\n if (!file_xfer_task ||\n !this.file_xfer_tasks[file_xfer_task.id] ||\n (start_byte !== undefined && start_byte > 0 && start_byte == file_xfer_task.file.size)) {\n return\n }\n\n if (file_xfer_task.cancelled) {\n const xfer_status = new Messages.VDAgentFileXferStatusMessage(file_xfer_task.id,\n Constants.VD_AGENT_FILE_XFER_STATUS_CANCELLED)\n this.send_agent_message(Constants.VD_AGENT_FILE_XFER_STATUS, xfer_status)\n delete this.file_xfer_tasks[file_xfer_task.id]\n return\n }\n\n sb = start_byte || 0\n eb = Math.min(sb + FILE_XFER_CHUNK_SIZE, file_xfer_task.file.size)\n\n if (!this.agent_tokens) {\n file_xfer_task.read_bytes = sb\n this.file_xfer_read_queue.push(file_xfer_task)\n return\n }\n\n reader = new FileReader()\n reader.onload = function (e: any) {\n const xfer_data = new Messages.VDAgentFileXferDataMessage(file_xfer_task.id,\n e.target.result.byteLength,\n e.target.result)\n _this.send_agent_message(Constants.VD_AGENT_FILE_XFER_DATA, xfer_data)\n _this.file_xfer_read(file_xfer_task, eb)\n file_xfer_task.update_progressbar(eb)\n }\n\n slice = file_xfer_task.file.slice(sb, eb)\n reader.readAsArrayBuffer(slice)\n }\n\n file_xfer_completed (file_xfer_task: SpiceFileXferTask, error?: string): void {\n if (error) { this.log_err(error) } else { this.log_info(\"transfer of '\" + file_xfer_task.file.name + \"' was successful\") }\n\n file_xfer_task.remove_progressbar()\n\n delete this.file_xfer_tasks[file_xfer_task.id]\n }\n\n handle_clipboard_grab (): void {\n DEBUG > 1 && console.log('handling clipboard grab from agent')\n\n // agent is requesting clipboard grab, so we send a message to request clipboard contents\n const type = Constants.VD_AGENT_CLIPBOARD_UTF8_TEXT\n const clipboard_request = new Messages.SpiceMsgClipboardRequest(type, this.agent_caps)\n this.send_agent_message(Constants.VD_AGENT_CLIPBOARD_REQUEST, clipboard_request)\n }\n\n handle_clipboard_receive (agent_data: any): void {\n DEBUG > 1 && console.log('received clipboard data from agent')\n\n // received clipboard data from agent, copy it to browser clipboard\n const received_clipboard = new Messages.SpiceMsgClipboardReceive(agent_data, this.agent_caps)\n if (received_clipboard.type === Constants.VD_AGENT_CLIPBOARD_UTF8_TEXT) {\n // write it to the browser clipboard\n if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.writeText) {\n const text = received_clipboard.get_text()\n navigator.clipboard.writeText(text).catch(err => {\n console.warn('Failed to write to navigator clipboard:', err)\n })\n }\n } else {\n console.log('Unsupported clipboard type:', received_clipboard.type)\n }\n }\n\n handle_clipboard_send (): void {\n DEBUG > 1 && console.log('sending clipboard data to agent')\n\n // agent is requesting clipboard data, read it from browser clipboard and send it.\n if (typeof navigator !== 'undefined' && navigator.clipboard && navigator.clipboard.readText) {\n navigator.clipboard.readText().then(text => {\n const type = Constants.VD_AGENT_CLIPBOARD_UTF8_TEXT\n const clipboard_msg = new Messages.SpiceMsgClipboardSend(type, text, this.agent_caps)\n this.send_agent_message(Constants.VD_AGENT_CLIPBOARD, clipboard_msg)\n }).catch(err => {\n console.log('Failed to read clipboard:', err)\n })\n }\n }\n\n send_clipboard_grab (): void {\n DEBUG > 1 && console.log('browser is asking agent to grab clipboard')\n\n // Send clipboard grab to agent. Agent will then ask for the host os clipboard contents in a dedicated message.\n const type = Constants.VD_AGENT_CLIPBOARD_UTF8_TEXT\n const grab_message = new Messages.SpiceMsgClipboardGrab(type, this.agent_caps)\n this.send_agent_message(Constants.VD_AGENT_CLIPBOARD_GRAB, grab_message)\n }\n\n connect_agent (): void {\n this.agent_connected = true\n\n const agent_start = new Messages.SpiceMsgcMainAgentStart(~0)\n const mr = new Messages.SpiceMiniData()\n mr.build_msg(Constants.SPICE_MSGC_MAIN_AGENT_START, agent_start)\n this.send_msg(mr)\n\n this.announce_agent_capabilities(1)\n\n if (this.onagent !== undefined) { this.onagent(this) }\n }\n\n handle_mouse_mode (current: number, supported: number): void {\n this.mouse_mode = current\n if (current != Constants.SPICE_MOUSE_MODE_CLIENT && (supported & Constants.SPICE_MOUSE_MODE_CLIENT)) {\n const mode_request = new Messages.SpiceMsgcMainMouseModeRequest(Constants.SPICE_MOUSE_MODE_CLIENT)\n const mr = new Messages.SpiceMiniData()\n mr.build_msg(Constants.SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST, mode_request)\n this.send_msg(mr)\n }\n\n if (this.inputs) { this.inputs.mouse_mode = current }\n }\n\n /* Shift current time to attempt to get a time matching that of the server */\n relative_now (): number {\n const ret = (Date.now() - this.our_mm_time) + this.mm_time\n return ret\n }\n}\n\nexport {\n SpiceMainConn,\n handle_file_dragover,\n handle_file_drop,\n resize_helper,\n handle_resize,\n sendCtrlAltDel\n}\n"],"names":["Constants","SpiceDataView","buffer","byteOffset","byteLength","_littleEndian","littleEndian","low","high","b","i","w","dbits","BigInteger","a","c","r","x","s","k","mi","sh","km","d","p","result","r2","j","r3","n","bs","cbs","bm","ds","m","y","q","pm","pt","ts","ms","nsh","ys","y0","yt","d1","d2","e","t","qd","z","g","Classic","Montgomery","isNegative","base","temp","digit","isNeg","num","charBuf","v","am1","am2","xl","xh","l","h","am3","BI_FP","rr","vv","nbi","nbv","u0","j2","Arcfour","key","prng_newstate","rng_psize","rng_state","rng_pool","rng_pptr","rng_seed_int","rng_seed_time","rng_get_byte","rng_get_bytes","ba","SecureRandom","parseBigInt","str","pkcs1pad2","rng","RSAKey","N","E","text","hexcase","hex_sha1","rstr2hex","rstr_sha1","str2rstr_utf8","binb2rstr","binb_sha1","rstr2binb","input","hex_tab","output","len","olda","oldb","oldc","oldd","olde","bit_rol","safe_add","sha1_ft","sha1_kt","lsw","cnt","SHA_DIGEST_LENGTH","MGF1","mask","seed","outlen","combo_buf","combo_hash","RSA_padding_add_PKCS1_OAEP","tolen","from","param","dblen","db","padlen","param_hash","dbmask","seedmask","ret","asn_get_length","u8","at","find_sequence","lenblock","create_rsa_from_mb","mb","seq","rsa_encrypt","rsa","oaep","bigint","encoder","DEFevol","DEFwmimax","DEFwminext","need_init","DEFmaxclen","evol","wmimax","wminext","family_5bpc","family_8bpc","bppmask","zeroLUT","besttrigtab","J","lzeroes","tabrand_chaos","rgb32_pixel_pad","rgb32_pixel_r","rgb32_pixel_g","rgb32_pixel_b","rgb32_pixel_size","ceil_log_2","val","family_init","family","bpc","limit","altprefixlen","altcodewords","pixelbitmask","pixelbitmaskshr","quic_image_bpc","type","cnt_l_zeroes","bits","golomb_decoding_8bpc","rc","cwlen","zeroprefix","golomb_code_len_8bpc","QuicModel","bstart","bend","repcntr","bsize","QuicBucket","bpp","state","curval","bestcode","bestcodelen","ithcodelen","QuicFamilyStat","model","bnumber","CommonState","wm","QuicChannel","model_8bpc","model_5bpc","QuicEncoder","io_ptr","delta","positiveDelta","magic","version","cur_row","end","waitmask","bpc_mask","stopidx","pos","width","prev_row","run_index","run_end","pixel","pixelm1","pixelm2","cc","cr","runlen","hits","channel","correlate_row","pbucket","buf","stride","row","prev","out","SpiceQuic","dv","convert_spice_quic_to_web","context","spice_quic","SpiceChannelId","SpiceRect","SpiceClipRects","SpiceClip","SpiceImageDescriptor","SpicePalette","SpiceBitmap","offset","SpiceImage","initial_at","header_size","SpiceQMask","SpicePoint","SpicePattern","SpiceBrush","SpiceFill","SpiceCopy","SpicePoint16","SpiceCursorHeader","SpiceCursor","SpiceSurface","KeyNames","codeToScanCodeArr","code_to_scancode","DEBUG","EMPTY_GIF_IMAGE","arraybuffer_to_str","common_scanmap","firefox_scanmap","DOM_scanmap","get_scancode","keyCode","code","keycode_to_start_scan","scancode","keycode_to_end_scan","dump_media_element","dump_timerange","tr","SpiceLinkHeader","SpiceLinkMess","orig_at","num_common_caps","num_channel_caps","caps_offset","SpiceLinkReply","SpiceLinkAuthTicket","SpiceLinkAuthReply","SpiceMiniData","u8arr","in_type","extra","SpiceMsgChannels","chan","hasClipboardSelection","caps","SpiceMsgClipboardGrab","SpiceMsgClipboardReceive","agent_data","SpiceMsgClipboardRequest","SpiceMsgClipboardSend","payload","payloadLength","SpiceMsgMainInit","SpiceMsgMainMouseMode","SpiceMsgMainAgentData","SpiceMsgMainAgentTokens","SpiceMsgSetAck","SpiceMsgcAckSync","ack","SpiceMsgcMainMouseModeRequest","mode","SpiceMsgcMainAgentStart","num_tokens","SpiceMsgcMainAgentData","data","VDAgentAnnounceCapabilities","request","VDAgentMonitorsConfig","flags","height","depth","VDAgentFileXferStatusMessage","VDAgentFileXferStartMessage","id","name","size","VDAgentFileXferDataMessage","SpiceMsgNotify","SpiceMsgcDisplayInit","SpiceMsgDisplayBase","SpiceMsgDisplayDrawCopy","SpiceMsgDisplayDrawFill","SpiceMsgDisplayCopyBits","SpiceMsgSurfaceCreate","SpiceMsgSurfaceDestroy","SpiceMsgInputsInit","SpiceMsgInputsKeyModifiers","SpiceMsgCursorInit","SpiceMsgPlaybackData","SpiceMsgPlaybackMode","SpiceMsgPlaybackStart","SpiceMsgCursorSet","SpiceMsgcMousePosition","sc","SpiceMsgcMouseMotion","SpiceMsgcMousePress","SpiceMsgcMouseRelease","SpiceMsgcKeyDown","SpiceMsgcKeyUp","SpiceMsgDisplayStreamCreate","SpiceStreamDataHeader","SpiceMsgDisplayStreamData","SpiceMsgDisplayStreamDataSized","SpiceMsgDisplayStreamClip","SpiceMsgDisplayStreamDestroy","SpiceMsgDisplayStreamActivateReport","SpiceMsgcDisplayStreamReport","stream_id","unique_id","SpiceMsgDisplayInvalList","SpiceMsgPortInit","namesize","rfc2083_crc_table","rfc2083_crc_table_computed","rfc2083_make_crc_table","rfc2083_update_crc","crc","u8buf","rfc2083_crc","crc32","PngIHDR","orig","adler","PngIDAT","zsum","PngIEND","create_rgba_png","bytes","ihdr","idat","iend","SpiceSimulateCursor","add_cursor","sha1","value","unknown_cursor","curdata","simulate_cursor","spicecursor","cursor","screen","pngstr","cursor_sha","curstr","create_icondir","_a","handle_sim_mousemove","_b","_c","f","duplicate_mouse_event","target","evt","ICONDIR","ICONDIRENTRY","hot_x","hot_y","header","entry","SpiceWireReader","callback","wire_blob_catcher","count","frame","view","uint8","step","EBML_HEADER","EBML_HEADER_VERSION","EBML_HEADER_READ_VERSION","EBML_HEADER_MAX_ID_LENGTH","EBML_HEADER_MAX_SIZE_LENGTH","EBML_HEADER_DOC_TYPE","EBML_HEADER_DOC_TYPE_VERSION","EBML_HEADER_DOC_TYPE_READ_VERSION","WEBM_SEGMENT_HEADER","WEBM_SEGMENT_INFORMATION","WEBM_TIMECODE_SCALE","WEBM_MUXING_APP","WEBM_WRITING_APP","WEBM_SEEK_HEAD","WEBM_SEEK","WEBM_SEEK_ID","WEBM_SEEK_POSITION","WEBM_TRACKS","WEBM_TRACK_ENTRY","WEBM_TRACK_NUMBER","WEBM_TRACK_UID","WEBM_TRACK_TYPE","WEBM_FLAG_ENABLED","WEBM_FLAG_DEFAULT","WEBM_FLAG_FORCED","WEBM_FLAG_LACING","WEBM_MIN_CACHE","WEBM_MAX_BLOCK_ADDITION_ID","WEBM_CODEC_DECODE_ALL","WEBM_SEEK_PRE_ROLL","WEBM_CODEC_DELAY","WEBM_CODEC_PRIVATE","WEBM_CODEC_ID","WEBM_VIDEO","WEBM_FLAG_INTERLACED","WEBM_PIXEL_WIDTH","WEBM_PIXEL_HEIGHT","WEBM_AUDIO","WEBM_SAMPLING_FREQUENCY","WEBM_CHANNELS","WEBM_CLUSTER","WEBM_TIME_CODE","WEBM_SIMPLE_BLOCK","EBML_write_u1_data_len","EBML_write_u8_value","EBML_write_array","EBML_write_u32_value","EBML_write_u16_value","EBML_write_float_value","EBML_write_u64_data_len","shift","arr","EBML_write_string","EBML_write_data","EBMLHeader","webm_Segment","webm_SegmentInformation","Audio","frequency","Video","webm_Seek","seekid","webm_SeekHead","info_pos","track_pos","AudioTrackEntry","VideoTrackEntry","Tracks","Cluster","timecode","SimpleBlock","keyframe","Header","SpiceConn","o","spiceconn_timeout","hdr","msg","Webm.Constants","ticket","saved_header","dinit","reply","ackack","pong","notify","start","elem","SpiceCursorConn","cursor_init","cursor_set","SpiceFileXferTask","file","_this","cancel","xferArea","handle_file_dragover","handle_file_drop","files","Shift_state","Ctrl_state","Alt_state","Meta_state","SpiceInputsConn","args","inputs_init","Messages.SpiceMsgInputsInit","Messages.SpiceMsgInputsKeyModifiers","handle_mousemove","Messages.SpiceMiniData","move","Messages.SpiceMsgcMousePosition","Messages.SpiceMsgcMouseMotion","handle_mousedown","press","Messages.SpiceMsgcMousePress","handle_contextmenu","handle_mouseup","release","Messages.SpiceMsgcMouseRelease","handle_mousewheel","handle_keydown","Messages.SpiceMsgcKeyDown","check_and_update_modifiers","handle_keyup","Messages.SpiceMsgcKeyUp","sendCtrlAltDel","update_modifier","lz_rgb32_decompress","in_buf","out_buf","default_alpha","op","ctrl","ref","ofs","flip_image_data","img","wb","temp_h","buff","lz4_decompress","ip","in_len","out_len","token","literal_len","match_len","convert_spice_lz_to_web","lz_image","compressed","decompressed","convert_spice_bitmap_to_web","spice_bitmap","src_offset","src_dec","putImageDataWithAlpha","stripAlpha","SpiceDisplayConn","draw_copy","Messages.SpiceMsgDisplayDrawCopy","canvas","source_img","Quic.convert_spice_quic_to_web","Quic.Constants","computed_src_area","tmpstr","qdv","handle_draw_jpeg_onload","draw_fill","Messages.SpiceMsgDisplayDrawFill","color","color_str","copy_bits","Messages.SpiceMsgDisplayCopyBits","source_canvas","source_context","Messages.SpiceMsgSurfaceCreate","Messages.SpiceMsgSurfaceDestroy","Messages.SpiceMsgDisplayStreamCreate","media","left","top","handle_video_source_open","handle_video_source_ended","handle_video_source_closed","Messages.SpiceMsgDisplayStreamDataSized","Messages.SpiceMsgDisplayStreamData","time_until_due","process_mjpeg_stream_data","process_video_stream_data","Messages.SpiceMsgDisplayStreamActivateReport","report","Messages.SpiceMsgcDisplayStreamReport","Messages.SpiceMsgDisplayStreamClip","Messages.SpiceMsgDisplayStreamDestroy","Messages.SpiceMsgDisplayInvalList","surface_id","prefix","draw","Inputs.handle_mousemove","Inputs.handle_mousedown","Inputs.handle_contextmenu","Inputs.handle_mouseup","Inputs.handle_keydown","Inputs.handle_keyup","handle_mouseout","handle_mouseover","Inputs.handle_mousewheel","temp_canvas","Utils.EMPTY_GIF_IMAGE","process_stream_data_report","strm_base","Messages.SpiceMsgDisplayBase","msg_mmtime","stream","listen_for_video_events","Webm.Header","te","Webm.VideoTrackEntry","Webm.Tracks","handle_video_buffer_error","handle_append_video_buffer_done","append_video_buffer","sb","push_or_queue","video_simple_block","simple","Webm.SimpleBlock","new_video_cluster","Webm.Cluster","video_handle_event_debug","Utils.dump_media_element","video_debug_listen_for_one_event","SpicePlaybackConn","Messages.SpiceMsgPlaybackStart","screenElement","handle_source_open","handle_source_ended","handle_source_closed","Messages.SpiceMsgPlaybackData","Messages.SpiceMsgPlaybackMode","Webm.AudioTrackEntry","handle_sourcebuffer_error","handle_append_buffer_done","playback_append_buffer","listen_for_audio_events","condense_playback_queue","queue","tmp","playback_handle_event_debug","playback_debug_listen_for_one_event","spiceconn","audio_0_events","SpicePortConn","event","resize_helper","mh","handle_resize","SpiceMainConn","options","Messages.SpiceMsgMainInit","attach","Messages.SpiceMsgMainMouseMode","chans","Messages.SpiceMsgChannels","conn","connected_tokens","Messages.SpiceMsgMainAgentTokens","remaining_tokens","tokens","xfer_task","Messages.SpiceMsgMainAgentData","agent_caps","Messages.VDAgentAnnounceCapabilities","Messages.VDAgentFileXferStatusMessage","message","mr","Messages.SpiceMsgcMainAgentData","maxsize","eb","monitors_config","Messages.VDAgentMonitorsConfig","task_id","xfer_start","task","Messages.VDAgentFileXferStartMessage","file_xfer_status","xfer_error","file_xfer_task","start_byte","FILE_XFER_CHUNK_SIZE","slice","reader","xfer_status","xfer_data","Messages.VDAgentFileXferDataMessage","error","clipboard_request","Messages.SpiceMsgClipboardRequest","received_clipboard","Messages.SpiceMsgClipboardReceive","err","clipboard_msg","Messages.SpiceMsgClipboardSend","grab_message","Messages.SpiceMsgClipboardGrab","agent_start","Messages.SpiceMsgcMainAgentStart","current","supported","mode_request","Messages.SpiceMsgcMainMouseModeRequest"],"mappings":"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AC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAE9BC,GAAU,CACd,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,E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"}