* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#define LYX_FILETOOL_H
#include "support/docstring.h"
-#include "support/FileName.h"
-#include <vector>
#include <utility>
#include <string>
+#include <set>
namespace lyx {
namespace support {
-/// remove directory and all contents, returns true on success
-bool destroyDir(FileName const & tmpdir);
+class FileName;
-/// Creates the per buffer temporary directory
-std::string const createBufferTmpDir();
+/// Record used temp file names
+static std::set<std::string> tmp_names_;
-/// Creates directory. Returns true on success
-bool createDirectory(FileName const & name, int permissions);
+/// Get a temporary file name.
+/**
+* The actual temp file (QTemporaryFile object) is immediately
+* destroyed after the name has been generated, so a new file
+* has to be created manually from the name.
+* This is needed if the temp file has to be manually removed
+* (e.g., when temp files are used as conversion target, and the initial
+* file only serves as a placeholder), since QTemporaryFile objects
+* cannot be manually removed at least on Windows (they are always
+* kept open internally even after close()).
+* In order to avoid race conditions due to duplicate names, we record
+* all used temp file names.
+* If you don't have to remove the temp file manually, use TempFile instead!
+*/
+FileName const tempFileName(FileName, bool const dir = false);
+/// Get temporary file name with custom path
+FileName const tempFileName(FileName const &, std::string const &, bool const dir = false);
+/// Get temporary file name with default path
+FileName const tempFileName(std::string const &, bool const dir = false);
+
+/// Remove and unregister a temporary file.
+void removeTempFile(FileName const &);
/** Creates the global LyX temp dir.
\p deflt can be an existing directory name. In this case a new directory
/// How to search files
enum search_mode {
- // The file must exist (return an empty file name otherwise)
- standard_mode,
+ /// The file must exist (return an empty file name otherwise)
+ must_exist,
/// Only do file name expansion, return the complete name even if
/// the file does not exist
- allow_unreadable
+ may_not_exist,
+ /// The (image) file may be present with hi-dpi resolution -
+ /// the lookup checks for a file named "image" + "@2x" + ".ext" first.
+ /// If found it will return e.g. "image@2x.png" instead of "image.png".
+ /// Otherwise it will work as must_exist.
+ check_hidpi
};
/** Returns the real name of file name in directory path, with optional
FileName const fileSearch(std::string const & path,
std::string const & name,
std::string const & ext = std::string(),
- search_mode mode = standard_mode);
-
-/// Returns a vector of all files in directory dir having extension ext.
-std::vector<FileName> const dirList(FileName const & dir,
- std::string const & ext = std::string());
-
-/** Is directory read only?
- returns
- true: dir writeable
- false: not writeable
-*/
-bool isDirWriteable(FileName const & path);
-
-/** Is a file readable ?
- Returns true if the file `path' is readable.
- */
-bool isFileReadable(FileName const & path);
+ search_mode mode = must_exist);
///
-bool isLyXFilename(std::string const & filename);
+bool isLyXFileName(std::string const & filename);
///
-bool isSGMLFilename(std::string const & filename);
+bool isSGMLFileName(std::string const & filename);
-///
-bool isValidLaTeXFilename(std::string const & filename);
+/// check for characters in filenames not allowed by LaTeX
+bool isValidLaTeXFileName(std::string const & filename);
+
+/** check for characters in filenames that might lead to
+ problems when manually compiling the LaTeX export of LyX
+ and opening the result with some older DVI-viewers
+*/
+bool isValidDVIFileName(std::string const & filename);
+
+/// check whether the file has binary contents
+bool isBinaryFile(FileName const & filename);
/** Returns the path of a library data file.
Search the file name.ext in the subdirectory dir of
-# user_lyxdir
-# build_lyxdir (if not empty)
-# system_lyxdir
- The third parameter `ext' is optional.
+ \p onlyglobal determines whether user_lyxdir should be included.
+ ext, search_mode and onlyglobal are optional.
*/
FileName const libFileSearch(std::string const & dir,
std::string const & name,
- std::string const & ext = std::string());
+ std::string const & ext = std::string(),
+ search_mode mode = must_exist,
+ bool const onlyglobal = false);
/** Same as libFileSearch(), but tries first to find an
internationalized version of the file by prepending $LANG_ to the
std::string const & name,
std::string const & ext = std::string());
+/** Same as libFileSearch(), but tries first to find a preferred
+ version of the file by appending the icon set name to the dir
+ */
+FileName const
+imageLibFileSearch(std::string & dir, std::string const & name,
+ std::string const & ext = std::string(),
+ search_mode mode = must_exist);
+
/// How to quote a filename
enum quote_style {
- /** Quote for the (OS dependant) shell. This is needed for command
+ /** Quote for the (OS dependent) shell. This is needed for command
line arguments of subprocesses. */
quote_shell,
+ /** Quote a file name for the (OS dependent) shell. This is needed
+ for file names as command line arguments of subprocesses. */
+ quote_shell_filename,
/** Quote for python. Use this if you want to store a filename in a
python script. Example: \code
os << "infile = " << quoteName(filename) << '\\n';
* command will still fail, but the error message will make some sort of
* sense ;-)
*/
-std::string const libScriptSearch(std::string const & command,
- quote_style style = quote_shell);
+std::string const commandPrep(std::string const & command);
enum latex_path_extension {
PROTECT_EXTENSION,
* If @c path contains LaTeX special characters, these are escaped.
* Eg, '~' -> '\\string~'
* If @c path contains spaces, then the returned path is enclosed in
- * "-quotes. This last fix will lead to successful compiliation of the
+ * "-quotes. This last fix will lead to successful compilation of the
* LaTeX file only if a sufficiently modern LaTeX compiler is used.
* If @c ext == EXCLUDE_EXTENSION the extension is left outside the quotes.
* This is needed for pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4)
latex_path_dots dots = LEAVE_DOTS);
/// Substitutes active latex characters with underscores in filename
-std::string const makeLatexName(std::string const & file);
+FileName const makeLatexName(FileName const & file);
/** Put the name in quotes suitable for the current shell or python,
depending on \p style. */
/// Add a filename to a path. Any path from filename is stripped first.
std::string const addName(std::string const & path, std::string const & fname);
-/// Append sub-directory(ies) to path in an intelligent way
+/// Add a relative path to a path. Does not strip the pathname
+std::string const addPathName(std::string const & path, std::string const & fname);
+
+/// Append sub-directory(ies) to path in an intelligent way. Will append the
+/// trailing directory separator if that is not provided.
std::string const addPath(std::string const & path, std::string const & path2);
/** Change extension of oldname to extension.
/// Return the extension of the file (not including the .)
std::string const getExtension(std::string const & name);
-/** Guess the file format name (as in Format::name()) from contents.
- Normally you don't want to use this directly, but rather
- Formats::getFormatFromFile().
- */
-std::string const getFormatFromContents(FileName const & name);
-
-/// check for zipped file
-bool zippedFile(FileName const & name);
-
/** \return the name that LyX will give to the unzipped file \p zipped_file
if the second argument of unzipFile() is empty.
*/
FileName const unzipFile(FileName const & zipped_file,
std::string const & unzipped_file = std::string());
-/// Returns true is path is absolute
-bool absolutePath(std::string const & path);
-
-/// Create absolute path. If impossible, don't do anything
-std::string const expandPath(std::string const & path);
-
/** Convert relative path into absolute path based on a basepath.
If relpath is absolute, just use that.
If basepath doesn't exist use CWD.
/// Strip filename from path name
std::string const onlyPath(std::string const & fname);
-/** Normalize a path. Constracts path/../path
- * Also converts paths like /foo//bar ==> /foo/bar
- */
-std::string const normalizePath(std::string const & path);
-
/// Strips path from filename
-std::string const onlyFilename(std::string const & fname);
-
-/// Get the contents of a file as a huge std::string
-std::string const getFileContents(FileName const & fname);
+std::string const onlyFileName(std::string const & fname);
/** Check and Replace Environmentvariables ${NAME} in Path.
- Replaces all occurences of these, if they are found in the
+ Replaces all occurrences of these, if they are found in the
environment.
Variables are defined by Var := '${' [a-zA-Z_][a-zA-Z_0-9]* '}'
*/
std::string const replaceEnvironmentPath(std::string const & path);
+/**
+ Return a string to be used as a prefix to a command for setting the
+ environment of the TeX engine with respect to the paths \p path and \p lpath.
+ */
+std::string latexEnvCmdPrefix(std::string const &path, std::string const & lpath);
+
+/** Replace all references to a current directory (a lonely '.' or
+ the prefix "./") in \c pathlist with \c path. Also prefixes
+ all non-absolute paths with \c path.
+*/
+std::string const replaceCurdirPath(std::string const & path, std::string const & pathlist);
+
/** Set \c link to the path \c file points to as a symbolic link.
\return true if successful.
*/
* \param format The file format as used by kpsewhich, e.g. "bib", "bst" etc.
*/
FileName const findtexfile(std::string const & fil,
- std::string const & format);
-
-/// remove the autosave-file and give a Message if it can't be done
-void removeAutosaveFile(std::string const & filename);
-
-/// read the BoundingBox entry from a ps/eps/pdf-file
-std::string const readBB_from_PSFile(FileName const & file);
+ std::string const & format,
+ bool const onlykpse = false);
/** \param file1, file2 the two files to be compared. Must have absolute paths.
* \returns 1 if \c file1 has a more recent timestamp than \c file2,
*/
int compare_timestamps(FileName const & file1, FileName const & file2);
-typedef std::pair<int, std::string> cmd_ret;
+/// \param lfuns: true if we're converting lfuns, false if prefs
+bool prefs2prefs(FileName const & filename, FileName const & tempfile,
+ bool lfuns);
+
+/// Does file \p file need to be updated by configure.py?
+bool configFileNeedsUpdate(std::string const & file);
+
+struct cmd_ret {
+ bool valid;
+ std::string result;
+};
cmd_ret const runCommand(std::string const & cmd);
-} // namespace support
-} // namespace lyx
+int fileLock(const char * lock_file);
+void fileUnlock(int fd, const char * lock_file);
+
+/** Return the hex-encoded cryptographic hash of a string.
+ * The hash algorithm is not fixed, but it is determined at compile time.
+ * This function is typically used to create relatively stable file names,
+ * because cryptographic hash functions ensure that very small changes in the
+ * input result in large changes in the output.
+ * There is no limit in the length of the input string: it can be a file name
+ * or the contents of a file, for instance.
+ */
+std::string toHexHash(const std::string & str);
-/// The following functions are implemented in minizip/zipunzip.cpp, and are not in
-/// the lyx::support namespace
+/// Replace non-ASCII characters to ensure that the string can be used as a
+/// file name on all platforms and as a LaTeX name.
+std::string sanitizeFileName(const std::string & str);
-/// zip several files to a zipfile. In-zip filenames are also specified
-bool zipFiles(std::string const & zipfile, std::vector<std::pair<std::string, std::string> > const & files);
+} // namespace support
+} // namespace lyx
-/// Unzip a zip file to a directory
-bool unzipToDir(std::string const & zipfile, std::string const & path);
#endif