94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
|
/**
|
||
|
* Controls the communication with the Abiword application
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* 2011 Peter 'Pita' Martischka
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS-IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
var util = require('util');
|
||
|
var spawn = require('child_process').spawn;
|
||
|
var async = require("async");
|
||
|
var settings = require("./settings");
|
||
|
|
||
|
//Queue with the converts we have to do
|
||
|
var queue = async.queue(doConvertTask, 1);
|
||
|
|
||
|
//spawn the abiword process
|
||
|
var abiword = spawn(settings.abiword, ["--plugin", "AbiCommand"]);
|
||
|
|
||
|
//output error messages to stderr
|
||
|
abiword.stderr.on('data', function (data)
|
||
|
{
|
||
|
console.error("Abiword: " + data);
|
||
|
});
|
||
|
|
||
|
//throw exceptions if abiword is dieing
|
||
|
abiword.on('exit', function (code)
|
||
|
{
|
||
|
throw "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)
|
||
|
{
|
||
|
//add data to buffer
|
||
|
stdoutBuffer+=data.toString();
|
||
|
|
||
|
//we're searching for the prompt, cause this means everything we need is in the buffer
|
||
|
if(stdoutBuffer.search("AbiWord:>") != -1)
|
||
|
{
|
||
|
//filter the feedback message
|
||
|
var lines = stdoutBuffer.split("\n");
|
||
|
var err = lines [1] == "OK" ? null : lines[1];
|
||
|
|
||
|
//reset the buffer
|
||
|
stdoutBuffer = "";
|
||
|
|
||
|
//call the callback with the error message
|
||
|
//skip the first prompt
|
||
|
if(stdoutCallback != null && !firstPrompt)
|
||
|
{
|
||
|
stdoutCallback(err);
|
||
|
stdoutCallback = null;
|
||
|
}
|
||
|
|
||
|
firstPrompt = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function doConvertTask(task, callback)
|
||
|
{
|
||
|
abiword.stdin.write("convert " + task.srcFile + " " + task.destFile + " " + task.type + "\n");
|
||
|
|
||
|
//create a callback that calls the task callback and the caller callback
|
||
|
stdoutCallback = function (err)
|
||
|
{
|
||
|
callback();
|
||
|
task.callback(err);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
exports.convertFile = function(srcFile, destFile, type, callback)
|
||
|
{
|
||
|
queue.push({"srcFile": srcFile, "destFile": destFile, "type": type, "callback": callback});
|
||
|
};
|