You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.3 KiB
146 lines
3.3 KiB
/** File upload utility */
|
|
var TermUpl = (function() {
|
|
var lines, // array of lines without newlines
|
|
line_i, // current line index
|
|
fuTout, // timeout handle for line sending
|
|
send_delay_ms, // delay between lines (ms)
|
|
nl_str, // newline string to use
|
|
curLine, // current line (when using fuOil)
|
|
inline_pos; // Offset in line (for long lines)
|
|
|
|
// lines longer than this are split to chunks
|
|
// sending a super-ling string through the socket is not a good idea
|
|
var MAX_LINE_LEN = 128;
|
|
|
|
function fuOpen() {
|
|
fuStatus("Ready...");
|
|
Modal.show('#fu_modal', onClose);
|
|
$('#fu_form').toggleClass('busy', false);
|
|
Input.blockKeys(true);
|
|
}
|
|
|
|
function onClose() {
|
|
console.log("Upload modal closed.");
|
|
clearTimeout(fuTout);
|
|
line_i = 0;
|
|
Input.blockKeys(false);
|
|
}
|
|
|
|
function fuStatus(msg) {
|
|
qs('#fu_prog').textContent = msg;
|
|
}
|
|
|
|
function fuSend() {
|
|
var v = qs('#fu_text').value;
|
|
if (!v.length) {
|
|
fuClose();
|
|
return;
|
|
}
|
|
|
|
lines = v.split('\n');
|
|
line_i = 0;
|
|
inline_pos = 0; // offset in line
|
|
send_delay_ms = qs('#fu_delay').value;
|
|
|
|
// sanitize - 0 causes overflows
|
|
if (send_delay_ms < 0) {
|
|
send_delay_ms = 0;
|
|
qs('#fu_delay').value = send_delay_ms;
|
|
}
|
|
|
|
nl_str = {
|
|
'CR': '\r',
|
|
'LF': '\n',
|
|
'CRLF': '\r\n',
|
|
}[qs('#fu_crlf').value];
|
|
|
|
$('#fu_form').toggleClass('busy', true);
|
|
fuStatus("Starting...");
|
|
fuSendLine();
|
|
}
|
|
|
|
function fuSendLine() {
|
|
if (!$('#fu_modal').hasClass('visible')) {
|
|
// Modal is closed, cancel
|
|
return;
|
|
}
|
|
|
|
if (!Conn.canSend()) {
|
|
// postpone
|
|
fuTout = setTimeout(fuSendLine, 1);
|
|
return;
|
|
}
|
|
|
|
if (inline_pos == 0) {
|
|
curLine = lines[line_i++] + nl_str;
|
|
}
|
|
|
|
var chunk;
|
|
if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {
|
|
chunk = curLine.substr(inline_pos, MAX_LINE_LEN);
|
|
inline_pos = 0;
|
|
} else {
|
|
chunk = curLine.substr(inline_pos, MAX_LINE_LEN);
|
|
inline_pos += MAX_LINE_LEN;
|
|
}
|
|
|
|
if (!Input.sendString(chunk)) {
|
|
fuStatus("FAILED!");
|
|
return;
|
|
}
|
|
|
|
var all = lines.length;
|
|
|
|
fuStatus(line_i+" / "+all+ " ("+(Math.round((line_i/all)*1000)/10)+"%)");
|
|
|
|
if (lines.length > line_i || inline_pos > 0) {
|
|
fuTout = setTimeout(fuSendLine, send_delay_ms);
|
|
} else {
|
|
closeWhenReady();
|
|
}
|
|
}
|
|
|
|
function closeWhenReady() {
|
|
if (!Conn.canSend()) {
|
|
// stuck in XOFF still, wait to process...
|
|
fuStatus("Waiting for Tx buffer...");
|
|
setTimeout(closeWhenReady, 100);
|
|
} else {
|
|
fuStatus("Done.");
|
|
// delay to show it
|
|
setTimeout(function() {
|
|
fuClose();
|
|
}, 100);
|
|
}
|
|
}
|
|
|
|
function fuClose() {
|
|
Modal.hide('#fu_modal');
|
|
}
|
|
|
|
return {
|
|
init: function() {
|
|
qs('#fu_file').addEventListener('change', function (evt) {
|
|
var reader = new FileReader();
|
|
var file = evt.target.files[0];
|
|
console.log("Selected file type: "+file.type);
|
|
if (!file.type.match(/text\/.*|application\/(json|csv|.*xml.*|.*script.*)/)) {
|
|
// Deny load of blobs like img - can crash browser and will get corrupted anyway
|
|
if (!confirm("This does not look like a text file: "+file.type+"\nReally load?")) {
|
|
qs('#fu_file').value = '';
|
|
return;
|
|
}
|
|
}
|
|
reader.onload = function(e) {
|
|
var txt = e.target.result.replace(/[\r\n]+/,'\n');
|
|
qs('#fu_text').value = txt;
|
|
};
|
|
console.log("Loading file...");
|
|
reader.readAsText(file);
|
|
}, false);
|
|
},
|
|
close: fuClose,
|
|
start: fuSend,
|
|
open: fuOpen,
|
|
}
|
|
})();
|
|
|