]> git.lyx.org Git - lyx.git/blobdiff - src/ConverterCache.cpp
Account for old versions of Pygments
[lyx.git] / src / ConverterCache.cpp
index 4cf1821df5f927761a640eeef8b142c7ca536ca6..3842ebb419d23075580abf37e62d7b3a418571e7 100644 (file)
@@ -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,7 +69,8 @@ public:
                                     << ' ' << to_format << ' ' << cache_name
                                     << ' ' << long(timestamp) << ' ' << checksum << '.');
        }
-       ~CacheItem() {}
+       ~CacheItem()
+       {}
        FileName cache_name;
        time_t timestamp;
        unsigned long checksum;
@@ -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();
@@ -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?
@@ -294,7 +301,7 @@ void ConverterCache::add(FileName const & orig_from, string const & to_format,
                }
                item->checksum = checksum;
                if (!mover.copy(converted_file, item->cache_name,
-                             onlyFilename(item->cache_name.absFileName()))) {
+                             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)) {
@@ -305,7 +312,7 @@ void ConverterCache::add(FileName const & orig_from, string const & to_format,
                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()))) {
+                             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);
@@ -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,15 +455,15 @@ 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()));
+                         onlyFileName(dest.absFileName()));
 }
 
 } // namespace lyx