X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Ffiletools.h;h=1ac0edf15b45cf40a93f53bc5c27ca0d4467e5a9;hb=62af7ee772f16f154225d2d0b65d77f4376b6001;hp=25445a47bb491b5660f0ad24cbc0dddaf37541b8;hpb=22ce34e5d5d39a0fd64b9a821ef2c3f0be09a4a8;p=lyx.git diff --git a/src/support/filetools.h b/src/support/filetools.h index 25445a47bb..1ac0edf15b 100644 --- a/src/support/filetools.h +++ b/src/support/filetools.h @@ -4,7 +4,7 @@ * 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. */ @@ -13,23 +13,41 @@ #define LYX_FILETOOL_H #include "support/docstring.h" -#include "support/FileName.h" -#include #include #include +#include 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 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, 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 @@ -55,11 +73,16 @@ FileName const fileOpenSearch(std::string const & path, /// 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 @@ -70,32 +93,25 @@ enum search_mode { 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 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 @@ -106,7 +122,8 @@ bool isValidLaTeXFilename(std::string const & filename); */ 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); /** Same as libFileSearch(), but tries first to find an internationalized version of the file by prepending $LANG_ to the @@ -117,11 +134,22 @@ i18nLibFileSearch(std::string const & dir, 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 line arguments of subprocesses. */ quote_shell, + /** Quote a file name for the (OS dependant) 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'; @@ -137,8 +165,7 @@ enum quote_style { * 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, @@ -174,7 +201,7 @@ std::string const latex_path(std::string const & path, 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. */ @@ -207,15 +234,6 @@ addExtension(std::string const & name, std::string const & 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. */ @@ -229,12 +247,6 @@ std::string const unzippedFileName(std::string const & zipped_file); 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. @@ -261,24 +273,28 @@ makeRelPath(docstring const & abspath, docstring const & basepath); /// 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. */ @@ -293,13 +309,8 @@ bool readLink(FileName const & file, FileName & link); * \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, @@ -310,21 +321,23 @@ std::string const readBB_from_PSFile(FileName const & file); */ int compare_timestamps(FileName const & file1, FileName const & file2); +/// \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); + typedef std::pair cmd_ret; cmd_ret const runCommand(std::string const & cmd); +int fileLock(const char * lock_file); +void fileUnlock(int fd, const char * lock_file); + } // namespace support } // namespace lyx -/// The following functions are implemented in minizip/zipunzip.cpp, and are not in -/// the lyx::support namespace - -/// zip several files to a zipfile. In-zip filenames are also specified -bool zipFiles(std::string const & zipfile, std::vector > const & files); - -/// Unzip a zip file to a directory -bool unzipToDir(std::string const & zipfile, std::string const & path); #endif