X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FConverterCache.cpp;h=c601c3f708d8c997018121a5c05da77c2d881eb6;hb=b536759c0769dab641993347baeb62400455be04;hp=76721835e61f271c181082ad7e3e04f0bf3c193f;hpb=72a6c77a510de0651056ea7f0cb58e25d80a8b53;p=lyx.git diff --git a/src/ConverterCache.cpp b/src/ConverterCache.cpp index 76721835e6..c601c3f708 100644 --- a/src/ConverterCache.cpp +++ b/src/ConverterCache.cpp @@ -49,12 +49,14 @@ unsigned long do_crc(string const & s) } +// FIXME THREAD +// This should be OK because it is only assigned during init() static FileName cache_dir; class CacheItem { public: - CacheItem() {} + CacheItem() : timestamp(0), checksum(0) {} CacheItem(FileName const & orig_from, string const & to_format, time_t t, unsigned long c) : timestamp(t), checksum(c) @@ -67,13 +69,14 @@ public: << ' ' << to_format << ' ' << cache_name << ' ' << long(timestamp) << ' ' << checksum << '.'); } - ~CacheItem() {} + ~CacheItem() + {} FileName cache_name; time_t timestamp; unsigned long checksum; }; -} +} // namespace /** The cache contains one item per orig file and target format, so use a @@ -156,7 +159,11 @@ void ConverterCache::Impl::readIndex() FormatCache & format_cache = cache[orig_from_name]; if (format_cache.from_format.empty()) format_cache.from_format = - formats.getFormatFromFile(orig_from_name); + // FIXME perf: This very expensive function is called on all + // cached files on opening. This slows LyX startup a lot. It + // would be better if this information was retrieved in a + // delayed fashion. + theFormats().getFormatFromFile(orig_from_name); format_cache.cache[to_format] = item; } is.close(); @@ -191,14 +198,14 @@ CacheItem * ConverterCache::Impl::find(FileName const & from, string const & format) { if (!lyxrc.use_converter_cache) - return 0; + return nullptr; CacheType::iterator const it1 = cache.find(from); if (it1 == cache.end()) - return 0; + return nullptr; FormatCacheType & format_cache = it1->second.cache; FormatCacheType::iterator const it2 = format_cache.find(format); if (it2 == format_cache.end()) - return 0; + return nullptr; return &(it2->second); } @@ -247,7 +254,7 @@ void ConverterCache::init() void ConverterCache::writeIndex() const { - if (!lyxrc.use_converter_cache + if (!lyxrc.use_converter_cache || cache_dir.empty()) return; pimpl_->writeIndex(); @@ -269,7 +276,7 @@ void ConverterCache::add(FileName const & orig_from, string const & to_format, 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); + add(orig_from, "pdf6", converted_pdf); } // Is the file in the cache already? @@ -313,7 +320,7 @@ void ConverterCache::add(FileName const & orig_from, string const & to_format, FormatCache & format_cache = pimpl_->cache[orig_from]; if (format_cache.from_format.empty()) format_cache.from_format = - formats.getFormatFromFile(orig_from); + theFormats().getFormatFromFile(orig_from); format_cache.cache[to_format] = new_item; } else LYXERR(Debug::FILES, "ConverterCache::add(" << orig_from << "):\n" @@ -394,6 +401,20 @@ bool ConverterCache::inCache(FileName const & orig_from, LYXERR(Debug::FILES, "not in cache."); return false; } + + // Special handling of pstex and pdftex formats: These are only + // considered to be in the cache if the corresponding graphics + // fiels are there as well. Otherwise copy() of the graphics below + // would fail. + // FIXME: Should not hardcode this (see bug 3819 for details) + if (to_format == "pstex") { + if (!inCache(orig_from, "eps")) + return false; + } else if (to_format == "pdftex") { + if (!inCache(orig_from, "pdf6")) + return false; + } + time_t const timestamp = orig_from.lastModified(); if (item->timestamp == timestamp) { LYXERR(Debug::FILES, "identical timestamp."); @@ -415,7 +436,7 @@ FileName const & ConverterCache::cacheName(FileName const & orig_from, LYXERR(Debug::FILES, orig_from << ' ' << to_format); CacheItem * const item = pimpl_->find(orig_from, to_format); - LASSERT(item, /**/); + LASSERT(item, { static const FileName fn; return fn; }); return item->cache_name; } @@ -434,12 +455,12 @@ bool ConverterCache::copy(FileName const & orig_from, string const & to_format, return false; } else if (to_format == "pdftex") { FileName const dest_pdf(changeExtension(dest.absFileName(), "pdf")); - if (!copy(orig_from, "pdf", dest_pdf)) + if (!copy(orig_from, "pdf6", dest_pdf)) return false; } CacheItem * const item = pimpl_->find(orig_from, to_format); - LASSERT(item, /**/); + LASSERT(item, return false); Mover const & mover = getMover(to_format); return mover.copy(item->cache_name, dest, onlyFileName(dest.absFileName()));