2004-10-26 18:39:13 +00:00
|
|
|
// -*- C++ -*-
|
|
|
|
/**
|
|
|
|
* \file mover.h
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
|
|
|
* \author Angus Leeming
|
|
|
|
*
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef MOVER_H
|
|
|
|
#define MOVER_H
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
|
2006-11-26 21:30:39 +00:00
|
|
|
namespace support { class FileName; }
|
|
|
|
|
2004-10-26 18:39:13 +00:00
|
|
|
/**
|
|
|
|
* Utility to copy a file of a specified format from one place to another.
|
|
|
|
* This base class simply invokes the command support::copy().
|
|
|
|
*/
|
|
|
|
class Mover
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~Mover() {}
|
|
|
|
|
|
|
|
/** Copy file @c from to @c to.
|
2004-11-01 08:50:42 +00:00
|
|
|
* This version should be used to copy files from the original
|
|
|
|
* location to the temporary directory, since @c to and @c latex
|
|
|
|
* would be equal in this case.
|
2004-10-26 18:39:13 +00:00
|
|
|
* \returns true if successful.
|
|
|
|
*/
|
|
|
|
bool
|
2006-11-26 21:30:39 +00:00
|
|
|
copy(support::FileName const & from, support::FileName const & to,
|
|
|
|
unsigned long int mode = (unsigned long int)-1) const;
|
2004-11-01 08:50:42 +00:00
|
|
|
|
|
|
|
/** Copy file @c from to @c to.
|
|
|
|
* \see SpecialisedMover::SpecialisedMover() for an explanation of
|
|
|
|
* @c latex.
|
|
|
|
* This version should be used to copy files from the temporary
|
|
|
|
* directory to the export location, since @c to and @c latex may
|
|
|
|
* not be equal in this case.
|
|
|
|
* \returns true if successful.
|
|
|
|
*/
|
|
|
|
bool
|
2006-11-26 21:30:39 +00:00
|
|
|
copy(support::FileName const & from, support::FileName const & to,
|
2006-11-13 10:27:57 +00:00
|
|
|
std::string const & latex,
|
|
|
|
unsigned long int mode = (unsigned long int)-1) const
|
2004-11-01 08:50:42 +00:00
|
|
|
{
|
2006-11-13 10:27:57 +00:00
|
|
|
return do_copy(from, to, latex, mode);
|
2004-10-26 18:39:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Rename file @c from as @c to.
|
2004-11-01 08:50:42 +00:00
|
|
|
* This version should be used to move files from the original
|
|
|
|
* location to the temporary directory, since @c to and @c latex
|
|
|
|
* would be equal in this case.
|
2004-10-26 18:39:13 +00:00
|
|
|
* \returns true if successful.
|
|
|
|
*/
|
|
|
|
bool
|
2006-11-26 21:30:39 +00:00
|
|
|
rename(support::FileName const & from, support::FileName const & to) const;
|
2004-11-01 08:50:42 +00:00
|
|
|
|
|
|
|
/** Rename file @c from as @c to.
|
|
|
|
* \see SpecialisedMover::SpecialisedMover() for an explanation of
|
|
|
|
* @c latex.
|
|
|
|
* This version should be used to move files from the temporary
|
|
|
|
* directory to the export location, since @c to and @c latex may
|
|
|
|
* not be equal in this case.
|
|
|
|
* \returns true if successful.
|
|
|
|
*/
|
|
|
|
bool
|
2006-11-26 21:30:39 +00:00
|
|
|
rename(support::FileName const & from, support::FileName const & to,
|
2004-11-01 08:50:42 +00:00
|
|
|
std::string const & latex) const
|
|
|
|
{
|
|
|
|
return do_rename(from, to, latex);
|
2004-10-26 18:39:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual bool
|
2006-11-26 21:30:39 +00:00
|
|
|
do_copy(support::FileName const & from, support::FileName const & to,
|
2006-11-13 10:27:57 +00:00
|
|
|
std::string const &, unsigned long int mode) const;
|
2004-10-26 18:39:13 +00:00
|
|
|
|
|
|
|
virtual bool
|
2006-11-26 21:30:39 +00:00
|
|
|
do_rename(support::FileName const & from, support::FileName const & to,
|
2006-04-05 23:56:29 +00:00
|
|
|
std::string const &) const;
|
2004-10-26 18:39:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Specialisation of the Mover concept that uses an external command
|
|
|
|
* to copy a file.
|
|
|
|
*
|
|
|
|
* For example, an XFig .fig file can contain references to external
|
|
|
|
* picture files. If such a reference has a relative path, then the
|
|
|
|
* copied .fig file will require a transformation of the picture file
|
|
|
|
* reference if it is to be found by XFig.
|
|
|
|
*/
|
2005-01-19 15:03:31 +00:00
|
|
|
class SpecialisedMover : public Mover
|
2004-10-26 18:39:13 +00:00
|
|
|
{
|
2005-01-19 15:03:31 +00:00
|
|
|
public:
|
2004-10-26 18:39:13 +00:00
|
|
|
SpecialisedMover() {}
|
|
|
|
|
2007-01-18 08:42:53 +00:00
|
|
|
virtual ~SpecialisedMover() {}
|
|
|
|
|
2004-10-26 18:39:13 +00:00
|
|
|
/** @c command should be of the form
|
|
|
|
* <code>
|
2006-08-08 21:12:50 +00:00
|
|
|
* python $$s/scripts/fig_copy.py $$i $$o $$l
|
2004-10-26 18:39:13 +00:00
|
|
|
* </code>
|
2005-01-20 15:02:16 +00:00
|
|
|
* where $$s is a placeholder for the lyx support directory,
|
2004-10-26 18:39:13 +00:00
|
|
|
* $$i is a placeholder for the name of the file to be moved,
|
2004-11-01 08:50:42 +00:00
|
|
|
* $$o is a placeholder for the name of the file after moving,
|
|
|
|
* $$l is a placeholder for the name of the file after moving,
|
|
|
|
* suitable as argument to a latex include command. This is
|
|
|
|
* either an absolute filename or relative to the master
|
|
|
|
* document.
|
|
|
|
* $$o and $$l can only differ if the file is copied from the
|
|
|
|
* temporary directory to the export location. If it is copied
|
|
|
|
* from the original location to the temporary directory, they
|
|
|
|
* are the same, so $$l may be ommitted in this case.
|
2004-10-26 18:39:13 +00:00
|
|
|
*/
|
|
|
|
SpecialisedMover(std::string const & command)
|
|
|
|
: command_(command) {}
|
|
|
|
|
|
|
|
/// The template used to launch the external command.
|
|
|
|
std::string const & command() const { return command_; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
virtual bool
|
2006-11-26 21:30:39 +00:00
|
|
|
do_copy(support::FileName const & from, support::FileName const & to,
|
2006-11-13 10:27:57 +00:00
|
|
|
std::string const & latex, unsigned long int mode) const;
|
2004-10-26 18:39:13 +00:00
|
|
|
|
|
|
|
virtual bool
|
2006-11-26 21:30:39 +00:00
|
|
|
do_rename(support::FileName const & from, support::FileName const & to,
|
2006-04-05 23:56:29 +00:00
|
|
|
std::string const & latex) const;
|
2004-10-26 18:39:13 +00:00
|
|
|
|
|
|
|
std::string command_;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Manage the store of (Mover)s.
|
|
|
|
*/
|
|
|
|
class Movers
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** Register a specialised @c command to be used to copy a file
|
|
|
|
* of format @c fmt.
|
|
|
|
*/
|
|
|
|
void set(std::string const & fmt, std::string const & command);
|
|
|
|
|
|
|
|
/// @c returns the Mover registered for format @c fmt.
|
|
|
|
Mover const & operator()(std::string const & fmt) const;
|
|
|
|
|
|
|
|
/** @returns the command template if @c fmt 'finds' a
|
|
|
|
* SpecialisedMover. Otherwise, returns an empty string.
|
|
|
|
*/
|
|
|
|
std::string const command(std::string const & fmt) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
typedef std::map<std::string, SpecialisedMover> SpecialsMap;
|
|
|
|
|
|
|
|
public:
|
2007-01-18 08:42:53 +00:00
|
|
|
typedef SpecialsMap::const_iterator const_iterator;
|
|
|
|
const_iterator begin() const { return specials_.begin(); }
|
|
|
|
const_iterator end() const { return specials_.end(); }
|
2004-10-26 18:39:13 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
Mover default_;
|
|
|
|
SpecialsMap specials_;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2007-01-18 08:42:53 +00:00
|
|
|
extern Movers & theMovers();
|
|
|
|
/// @c returns the Mover registered for format @c fmt.
|
|
|
|
extern Mover const & getMover(std::string const & fmt);
|
|
|
|
/** Register a specialised @c command to be used to copy a file
|
|
|
|
* of format @c fmt.
|
|
|
|
*/
|
|
|
|
extern void setMover(std::string const & fmt, std::string const & command);
|
|
|
|
extern Movers & theSystemMovers();
|
2004-10-26 18:39:13 +00:00
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
} // namespace lyx
|
|
|
|
|
2004-10-26 18:39:13 +00:00
|
|
|
#endif // MOVER_H
|