]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsConverter.C
Fix InsetInclude properly. Data is now stored in an InsetCommandParams
[lyx.git] / src / graphics / GraphicsConverter.C
index 548a524fd18860f407050900190b4adc08296a6f..b75095ecd0fca4d1514d0be53f2f3638d6183334 100644 (file)
@@ -1,38 +1,53 @@
 /**
- *  \file GraphicsConverter.C
- *  Copyright 2002 the LyX Team
- *  Read the file COPYING
+ * \file GraphicsConverter.C
+ * 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 "debug.h"
+#include "format.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>
-#include <boost/signals/trackable.hpp>
 
-#include "Lsstream.h"
-#include "support/LOstream.h"
+#include "support/std_sstream.h"
 #include <fstream>
-#include <sys/types.h> // needed for pid_t
+
+namespace support = lyx::support;
+
+using support::ChangeExtension;
+using support::Forkedcall;
+using support::ForkedCallQueue;
+using support::LibFileSearch;
+using support::LibScriptSearch;
+using support::OnlyPath;
+using support::OnlyFilename;
+using support::QuoteName;
+using support::subst;
+using support::tempName;
+using support::unlink;
 
 using std::endl;
 using std::ostream;
+using std::ostringstream;
 
-namespace grfx {
+
+namespace lyx {
+namespace graphics {
 
 struct Converter::Impl : public boost::signals::trackable {
        ///
@@ -46,7 +61,7 @@ struct Converter::Impl : public boost::signals::trackable {
         *  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.
@@ -81,6 +96,7 @@ Converter::Converter(string const & from_file,   string const & to_file_base,
 {}
 
 
+// Empty d-tor out-of-line to keep boost::scoped_ptr happy.
 Converter::~Converter()
 {}
 
@@ -103,7 +119,9 @@ string const & Converter::convertedFile() const
        return pimpl_->finished_ ? pimpl_->to_file_ : empty;
 }
 
-} // namespace grfx
+} // namespace graphics
+} // namespace lyx
+
 
 //------------------------------
 // Implementation details follow
@@ -121,7 +139,8 @@ bool build_script(string const & from_file, string const & to_file_base,
 } // namespace anon
 
 
-namespace grfx {
+namespace lyx {
+namespace graphics {
 
 Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
                      string const & from_format, string const & to_format)
@@ -133,39 +152,33 @@ Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
                << "\n\tfrom_format:  " << from_format
                << "\n\tto_format:    " << to_format << endl;
 
+       // 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;
        script << "#!/bin/sh\n";
        bool const success = build_script(from_file, to_file_base,
                                          from_format, to_format, script);
 
-       // The converted image is to be stored in this file
-       to_file_ = ChangeExtension(to_file_base, formats.extension(to_format));
-
        if (!success) {
-               script_file_ = string();
-               if (from_format == "lyxpreview") {
-                       script_command_ =
-                               LibFileSearch("scripts", "lyxpreview2xpm.sh")
-                                       + " " +from_file + " " + to_file_;
-                       lyxerr[Debug::GRAPHICS]
-                               << "\tI use lyxpreview2xpm for the conversion\n\t"
-                               << script_command_ << endl;
-               } else {
-                       script_command_ =
-                               LibFileSearch("scripts", "convertDefault.sh") +
-                                       ' ' + from_format + ':' + from_file + ' ' +
-                                       to_format + ':' + to_file_;
-                       lyxerr[Debug::GRAPHICS]
-                               << "\tNo converter defined! I use convertDefault.sh\n\t"
-                               << script_command_ << endl;
-               }
+               script_command_ =
+                       "sh " + LibFileSearch("scripts", "convertDefault.sh") +
+                       ' ' + from_format + ':' + from_file + ' ' +
+                       to_format + ':' + to_file_;
+
+               lyxerr[Debug::GRAPHICS]
+                       << "\tNo converter defined! I use convertDefault.sh\n\t"
+                       << script_command_ << endl;
+
        } else {
 
                lyxerr[Debug::GRAPHICS] << "\tConversion script:"
-                               << "\n--------------------------------------\n"
-                               << script.str().c_str()
-                               << "\n--------------------------------------\n";
+                       << "\n--------------------------------------\n"
+                       << script.str()
+                       << "\n--------------------------------------\n";
 
                // Output the script to file.
                static int counter = 0;
@@ -176,15 +189,15 @@ Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
                if (!fs.good())
                        return;
 
-               fs << script.str().c_str();
+               fs << 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;
@@ -194,28 +207,18 @@ Converter::Impl::Impl(string const & from_file,   string const & to_file_base,
 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!
@@ -223,10 +226,10 @@ void Converter::Impl::converted(string const & /* cmd */,
 
        finished_ = true;
        // Clean-up behind ourselves
-       lyx::unlink(script_file_);
+       unlink(script_file_);
 
        if (retval > 0) {
-               lyx::unlink(to_file_);
+               unlink(to_file_);
                to_file_.erase();
                finishedConversion(false);
        } else {
@@ -234,7 +237,8 @@ void Converter::Impl::converted(string const & /* cmd */,
        }
 }
 
-} // namespace grfx
+} // namespace graphics
+} // namespace lyx
 
 namespace {
 
@@ -246,16 +250,16 @@ string const move_file(string const & from_file, string const & to_file)
        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 command.str();
 }
 
 
@@ -268,8 +272,10 @@ bool build_script(string const & from_file,
        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));
@@ -288,8 +294,8 @@ bool build_script(string const & from_file,
        // Remember to remove the temp file because we only want the name...
        static int counter = 0;
        string const tmp = "gconvert" + tostr(counter++);
-       string const to_base = lyx::tempName(string(), tmp);
-       lyx::unlink(to_base);
+       string const to_base = tempName(string(), tmp);
+       unlink(to_base);
 
        string outfile = from_file;
 
@@ -322,14 +328,14 @@ bool build_script(string const & from_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,