bool ConverterCache::inCache(FileName const & orig_from, string const & to_format) const { if (!lyxrc.use_converter_cache || orig_from.empty()) return false; LYXERR(Debug::FILES, orig_from << ' ' << to_format); CacheItem * const item = pimpl_->find(orig_from, to_format); if (!item) { LYXERR(Debug::FILES, "not in cache."); return false; } time_t const timestamp = orig_from.lastModified(); if (item->timestamp == timestamp) { LYXERR(Debug::FILES, "identical timestamp."); return true; } if (item->checksum == orig_from.checksum()) { item->timestamp = timestamp; LYXERR(Debug::FILES, "identical checksum."); return true; } LYXERR(Debug::FILES, "in cache, but too old."); return false; }
/** copy file \p sourceFile to \p destFile. If \p force is false, the user * will be asked before existing files are overwritten. If \p only_tmp * is true, then only copy files that are in our tmp dir (to avoid other files * overwriting themselves). * \return * - SUCCESS if this file got copied * - FORCE if subsequent calls should not ask for confirmation before * overwriting files anymore. * - CANCEL if the export should be cancelled */ CopyStatus copyFile(string const & format, FileName const & sourceFile, FileName const & destFile, string const & latexFile, bool force, bool only_tmp) { CopyStatus ret = force ? FORCE : SUCCESS; // This check could be changed to // boost::filesystem::equivalent(sourceFile, destFile) if export to // other directories than the document directory is desired. // Also don't overwrite files that already exist and are identical // to the source files. if ((only_tmp && !prefixIs(onlyPath(sourceFile.absFileName()), package().temp_dir().absFileName())) || sourceFile.checksum() == destFile.checksum()) return ret; if (!force) { switch(checkOverwrite(destFile)) { case 0: return SUCCESS; case 1: ret = SUCCESS; break; case 2: ret = FORCE; break; default: return CANCEL; } } Mover const & mover = getMover(format); if (!mover.copy(sourceFile, destFile, latexFile)) Alert::error(_("Couldn't copy file"), bformat(_("Copying %1$s to %2$s failed."), makeDisplayPath(sourceFile.absFileName()), makeDisplayPath(destFile.absFileName()))); return ret; }
void ConverterCache::add(FileName const & orig_from, string const & to_format, FileName const & converted_file) const { if (!lyxrc.use_converter_cache || orig_from.empty() || converted_file.empty()) return; LYXERR(Debug::FILES, ' ' << orig_from << ' ' << to_format << ' ' << converted_file); // FIXME: Should not hardcode this (see bug 3819 for details) if (to_format == "pstex") { FileName const converted_eps(changeExtension(converted_file.absFileName(), "eps")); add(orig_from, "eps", converted_eps); } else if (to_format == "pdftex") { FileName const converted_pdf(changeExtension(converted_file.absFileName(), "pdf")); add(orig_from, "pdf", converted_pdf); } // Is the file in the cache already? CacheItem * item = pimpl_->find(orig_from, to_format); time_t const timestamp = orig_from.lastModified(); Mover const & mover = getMover(to_format); if (item) { LYXERR(Debug::FILES, "ConverterCache::add(" << orig_from << "):\n" "The file is already in the cache."); // First test for timestamp if (timestamp == item->timestamp) { LYXERR(Debug::FILES, "Same timestamp."); return; } // Maybe the contents is still the same? item->timestamp = timestamp; unsigned long const checksum = orig_from.checksum(); if (checksum == item->checksum) { LYXERR(Debug::FILES, "Same checksum."); return; } item->checksum = checksum; if (!mover.copy(converted_file, item->cache_name, onlyFileName(item->cache_name.absFileName()))) { LYXERR(Debug::FILES, "Could not copy file " << orig_from << " to " << item->cache_name); } else if (!item->cache_name.changePermission(0600)) { LYXERR(Debug::FILES, "Could not change file mode" << item->cache_name); } } else { CacheItem new_item(orig_from, to_format, timestamp, orig_from.checksum()); if (mover.copy(converted_file, new_item.cache_name, onlyFileName(new_item.cache_name.absFileName()))) { if (!new_item.cache_name.changePermission(0600)) { LYXERR(Debug::FILES, "Could not change file mode" << new_item.cache_name); } FormatCache & format_cache = pimpl_->cache[orig_from]; if (format_cache.from_format.empty()) format_cache.from_format = formats.getFormatFromFile(orig_from); format_cache.cache[to_format] = new_item; } else LYXERR(Debug::FILES, "ConverterCache::add(" << orig_from << "):\n" "Could not copy file."); } }