/**
* \file GraphicsConverter.C
- * Copyright 2002 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * \author Angus Leeming <leeming@lyx.org>
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS
*/
#include <config.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
#include "GraphicsConverter.h"
#include "converter.h"
+#include "format.h"
#include "debug.h"
#include "support/filetools.h"
#include "support/forkedcall.h"
+#include "support/forkedcallqueue.h"
+#include "support/tostr.h"
+#include "support/lstrings.h"
#include "support/lyxlib.h"
#include <boost/bind.hpp>
* Cleans-up the temporary files, emits the finishedConversion
* signal and removes the Converter from the list of all processes.
*/
- void converted(string const & cmd, pid_t pid, int retval);
+ void converted(pid_t pid, int retval);
/** At the end of the conversion process inform the outside world
* by emitting a signal.
<< "\n\tfrom_format: " << from_format
<< "\n\tto_format: " << to_format << endl;
- // The converted image is to be stored in this file
- to_file_ = ChangeExtension(to_file_base, formats.extension(to_format));
+ // The converted image is to be stored in this file (we do not
+ // use ChangeExtension because this is a basename which may
+ // nevertheless contain a '.')
+ to_file_ = to_file_base + '.' + formats.extension(to_format);
// The conversion commands are stored in a stringstream
ostringstream script;
} else {
lyxerr[Debug::GRAPHICS] << "\tConversion script:"
- << "\n--------------------------------------\n"
- << script.str().c_str()
- << "\n--------------------------------------\n";
+ << "\n--------------------------------------\n"
+ << STRCONV(script.str())
+ << "\n--------------------------------------\n";
// Output the script to file.
static int counter = 0;
if (!fs.good())
return;
- fs << script.str().c_str();
+ fs << STRCONV(script.str());
fs.close();
// The command needed to run the conversion process
// We create a dummy command for ease of understanding of the
// list of forked processes.
- // Note that 'sh ' is absolutely essential, or execvp will fail.
- script_command_ = "sh " + script_file_ + " " +
- OnlyFilename(from_file) + " " + to_format;
+ // Note: 'sh ' is absolutely essential, or execvp will fail.
+ script_command_ = "sh " + script_file_ + ' ' +
+ OnlyFilename(from_file) + ' ' + to_format;
}
// All is ready to go
valid_process_ = true;
void Converter::Impl::startConversion()
{
if (!valid_process_) {
- converted(string(), 0, 1);
+ converted(0, 1);
return;
}
- // Initiate the conversion
- Forkedcall::SignalTypePtr convert_ptr;
- convert_ptr.reset(new Forkedcall::SignalType);
+ Forkedcall::SignalTypePtr
+ ptr = ForkedCallQueue::get().add(script_command_);
- convert_ptr->connect(
- boost::bind(&Impl::converted, this, _1, _2, _3));
+ ptr->connect(boost::bind(&Impl::converted, this, _1, _2));
- Forkedcall call;
- int retval = call.startscript(script_command_, convert_ptr);
- if (retval > 0) {
- // Unable to even start the script, so clean-up the mess!
- converted(string(), 0, 1);
- }
}
-
-void Converter::Impl::converted(string const & /* cmd */,
- pid_t /* pid */, int retval)
+void Converter::Impl::converted(pid_t /* pid */, int retval)
{
if (finished_)
// We're done already!
ostringstream command;
command << "fromfile=" << from_file << "\n"
<< "tofile=" << to_file << "\n\n"
- << "'mv' -f ${fromfile} ${tofile}\n"
- << "if [ $? -ne 0 ]; then\n"
- << "\t'cp' -f ${fromfile} ${tofile}\n"
- << "\tif [ $? -ne 0 ]; then\n"
+ << "'mv' -f ${fromfile} ${tofile} ||\n"
+ << "{\n"
+ << "\t'cp' -f ${fromfile} ${tofile} ||\n"
+ << "\t{\n"
<< "\t\texit 1\n"
- << "\tfi\n"
+ << "\t}\n"
<< "\t'rm' -f ${fromfile}\n"
- << "fi\n";
+ << "}\n";
- return command.str().c_str();
+ return STRCONV(command.str());
}
lyxerr[Debug::GRAPHICS] << "build_script ... ";
typedef Converters::EdgePath EdgePath;
- string const to_file = ChangeExtension(to_file_base,
- formats.extension(to_format));
+ // we do not use ChangeExtension because this is a basename
+ // which may nevertheless contain a '.'
+ string const to_file = to_file_base + '.'
+ + formats.extension(to_format);
if (from_format == to_format) {
script << move_file(QuoteName(from_file), QuoteName(to_file));
command = LibScriptSearch(command);
// Store in the shell script
- script << "\n" << command << "\n\n";
+ script << "\n" << command << " ||\n";
// Test that this was successful. If not, remove
// ${outfile} and exit the shell script
- script << "if [ $? -ne 0 ]; then\n"
+ script << "{\n"
<< "\t'rm' -f ${outfile}\n"
<< "\texit 1\n"
- << "fi\n\n";
+ << "}\n\n";
// Test that the outfile exists.
// ImageMagick's convert will often create ${outfile}.0,