Blame view

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