playback.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * noVNC: HTML5 VNC client
  3. * Copyright (C) 2012 Joel Martin
  4. * Licensed under MPL 2.0 (see LICENSE.txt)
  5. */
  6. "use strict";
  7. /*jslint browser: true, white: false */
  8. /*global Util, VNC_frame_data, finish */
  9. var rfb, mode, test_state, frame_idx, frame_length,
  10. iteration, iterations, istart_time,
  11. // Pre-declarations for jslint
  12. send_array, next_iteration, queue_next_packet, do_packet, enable_test_mode;
  13. // Override send_array
  14. send_array = function (arr) {
  15. // Stub out send_array
  16. };
  17. enable_test_mode = function () {
  18. rfb._sock._mode = VNC_frame_encoding;
  19. rfb._sock.send = send_array;
  20. rfb._sock.close = function () {};
  21. rfb._sock.flush = function () {};
  22. rfb._checkEvents = function () {};
  23. rfb.connect = function (host, port, password, path) {
  24. this._rfb_host = host;
  25. this._rfb_port = port;
  26. this._rfb_password = (password !== undefined) ? password : "";
  27. this._rfb_path = (path !== undefined) ? path : "";
  28. this._sock.init('binary', 'ws');
  29. this._updateState('ProtocolVersion', "Starting VNC handshake");
  30. };
  31. };
  32. next_iteration = function () {
  33. rfb = new RFB({'target': $D('VNC_canvas'),
  34. 'onUpdateState': updateState});
  35. enable_test_mode();
  36. if (iteration === 0) {
  37. frame_length = VNC_frame_data.length;
  38. test_state = 'running';
  39. }
  40. if (test_state !== 'running') { return; }
  41. iteration += 1;
  42. if (iteration > iterations) {
  43. finish();
  44. return;
  45. }
  46. frame_idx = 0;
  47. istart_time = (new Date()).getTime();
  48. rfb.connect('test', 0, "bogus");
  49. queue_next_packet();
  50. };
  51. queue_next_packet = function () {
  52. var frame, foffset, toffset, delay;
  53. if (test_state !== 'running') { return; }
  54. frame = VNC_frame_data[frame_idx];
  55. while ((frame_idx < frame_length) && (frame.charAt(0) === "}")) {
  56. //Util.Debug("Send frame " + frame_idx);
  57. frame_idx += 1;
  58. frame = VNC_frame_data[frame_idx];
  59. }
  60. if (frame === 'EOF') {
  61. Util.Debug("Finished, found EOF");
  62. next_iteration();
  63. return;
  64. }
  65. if (frame_idx >= frame_length) {
  66. Util.Debug("Finished, no more frames");
  67. next_iteration();
  68. return;
  69. }
  70. if (mode === 'realtime') {
  71. foffset = frame.slice(1, frame.indexOf('{', 1));
  72. toffset = (new Date()).getTime() - istart_time;
  73. delay = foffset - toffset;
  74. if (delay < 1) {
  75. delay = 1;
  76. }
  77. setTimeout(do_packet, delay);
  78. } else {
  79. setTimeout(do_packet, 1);
  80. }
  81. };
  82. var bytes_processed = 0;
  83. do_packet = function () {
  84. //Util.Debug("Processing frame: " + frame_idx);
  85. var frame = VNC_frame_data[frame_idx],
  86. start = frame.indexOf('{', 1) + 1;
  87. bytes_processed += frame.length - start;
  88. if (VNC_frame_encoding === 'binary') {
  89. var u8 = new Uint8Array(frame.length - start);
  90. for (var i = 0; i < frame.length - start; i++) {
  91. u8[i] = frame.charCodeAt(start + i);
  92. }
  93. rfb._sock._recv_message({'data' : u8});
  94. } else {
  95. rfb._sock._recv_message({'data' : frame.slice(start)});
  96. }
  97. frame_idx += 1;
  98. queue_next_packet();
  99. };