restart abiword on crash and give the user feedback about bad import files

pull/503/merge
Peter 'Pita' Martischka 2012-02-27 00:22:53 +01:00
parent 00c3281a02
commit ed8aff22d4
3 changed files with 75 additions and 95 deletions

View File

@ -115,7 +115,15 @@ exports.doImport = function(req, res, padId)
{
var randNum = Math.floor(Math.random()*0xFFFFFFFF);
destFile = tempDirectory + "eplite_import_" + randNum + ".txt";
abiword.convertFile(srcFile, destFile, "txt", callback);
abiword.convertFile(srcFile, destFile, "txt", function(err){
//catch convert errors
if(err){
console.warn("Converting Error:", err);
return callback("convertFailed");
} else {
callback();
}
});
},
//get the pad object
@ -176,16 +184,18 @@ exports.doImport = function(req, res, padId)
}
], function(err)
{
//the upload failed, there is nothing we can do, send a 500
if(err == "uploadFailed")
var status = "ok";
//check for known errors and replace the status
if(err == "uploadFailed" || err == "convertFailed")
{
res.send(500);
return;
status = err;
err = null;
}
ERR(err);
//close the connection
res.send("ok");
res.send("<script>document.domain = document.domain; var impexp = window.top.require('/pad_impexp').padimpexp.handleFrameCall('" + status + "'); </script>", 200);
});
}

View File

@ -53,7 +53,7 @@ if(os.type().indexOf("Windows") > -1)
abiword.on('exit', function (code)
{
if(code != 0) {
throw "Abiword died with exit code " + code;
return callback("Abiword died with exit code " + code);
}
if(stdoutBuffer != "")
@ -75,7 +75,12 @@ if(os.type().indexOf("Windows") > -1)
else
{
//spawn the abiword process
var abiword = spawn(settings.abiword, ["--plugin", "AbiCommand"]);
var abiword;
var stdoutCallback = null;
var spawnAbiword = function (){
abiword = spawn(settings.abiword, ["--plugin", "AbiCommand"]);
var stdoutBuffer = "";
var firstPrompt = true;
//append error messages to the buffer
abiword.stderr.on('data', function (data)
@ -83,20 +88,15 @@ else
stdoutBuffer += data.toString();
});
//throw exceptions if abiword is dieing
//abiword died, let's restart abiword and return an error with the callback
abiword.on('exit', function (code)
{
throw "Abiword died with exit code " + code;
spawnAbiword();
stdoutCallback("Abiword died with exit code " + code);
});
//delegate the processing of stdout to a other function
abiword.stdout.on('data',onAbiwordStdout);
var stdoutCallback = null;
var stdoutBuffer = "";
var firstPrompt = true;
function onAbiwordStdout(data)
abiword.stdout.on('data',function (data)
{
//add data to buffer
stdoutBuffer+=data.toString();
@ -120,7 +120,9 @@ else
firstPrompt = false;
}
});
}
spawnAbiword();
doConvertTask = function(task, callback)
{
@ -130,6 +132,7 @@ else
stdoutCallback = function (err)
{
callback();
console.log("queue continue");
task.callback(err);
};
}

View File

@ -95,11 +95,6 @@ var padimpexp = (function()
}, 0);
$('#importarrow').stop(true, true).hide();
$('#importstatusball').show();
$("#import .importframe").load(function()
{
importDone();
});
}
return ret;
}
@ -107,8 +102,6 @@ var padimpexp = (function()
function importFailed(msg)
{
importErrorMessage(msg);
importDone();
addImportFrames();
}
function importDone()
@ -120,6 +113,7 @@ var padimpexp = (function()
}, 0);
$('#importstatusball').hide();
importClearTimeout();
addImportFrames();
}
function importClearTimeout()
@ -131,11 +125,19 @@ var padimpexp = (function()
}
}
function importErrorMessage(msg)
function importErrorMessage(status)
{
var msg="";
if(status === "convertFailed"){
msg = "We were not able to import this file. Please use a different document format or copy paste manually";
} else if(status === "uploadFailed"){
msg = "The upload failed, please try again";
}
function showError(fade)
{
$('#importmessagefail').html('<strong style="color: red">Import failed:</strong> ' + (msg || 'Please try a different file.'))[(fade ? "fadeIn" : "show")]();
$('#importmessagefail').html('<strong style="color: red">Import failed:</strong> ' + (msg || 'Please copy paste'))[(fade ? "fadeIn" : "show")]();
}
if ($('#importexport .importmessage').is(':visible'))
@ -175,39 +177,6 @@ var padimpexp = (function()
importDone();
}
function importApplicationSuccessful(data, textStatus)
{
if (data.substr(0, 2) == "ok")
{
if ($('#importexport .importmessage').is(':visible'))
{
$('#importexport .importmessage').hide();
}
$('#importmessagesuccess').html('<strong style="color: green">Import successful!</strong>').show();
$('#importformfilediv').hide();
window.setTimeout(function()
{
$('#importmessagesuccess').fadeOut("slow", function()
{
$('#importformfilediv').show();
});
if (hidePanelCall)
{
hidePanelCall();
}
}, 3000);
}
else if (data.substr(0, 4) == "fail")
{
importErrorMessage("Couldn't update pad contents. This can happen if your web browser has \"cookies\" disabled.");
}
else if (data.substr(0, 4) == "msg:")
{
importErrorMessage(data.substr(4));
}
importDone();
}
///// export
function cantExport()
@ -290,16 +259,14 @@ var padimpexp = (function()
$('#importform').submit(fileInputSubmit);
$('.disabledexport').click(cantExport);
},
handleFrameCall: function(callName, argsArray)
handleFrameCall: function(status)
{
if (callName == 'importFailed')
if (status !== "ok")
{
importFailed(argsArray[0]);
}
else if (callName == 'importSuccessful')
{
importSuccessful(argsArray[0]);
importFailed(status);
}
importDone();
},
disable: function()
{