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