X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FGraphicsCacheItem.cpp;h=c698168dee0c22a67e47eb7528e07b0f02d9a12f;hb=425c190d623daeb6d05bce1aa2244b548225305a;hp=8331718218cf3fe75c635685492e97bd9099a773;hpb=c9b9748cee687e709e9e48dd2c78e054d8ea29a3;p=lyx.git diff --git a/src/graphics/GraphicsCacheItem.cpp b/src/graphics/GraphicsCacheItem.cpp index 8331718218..c698168dee 100644 --- a/src/graphics/GraphicsCacheItem.cpp +++ b/src/graphics/GraphicsCacheItem.cpp @@ -14,6 +14,7 @@ #include "GraphicsCacheItem.h" +#include "Buffer.h" #include "GraphicsCache.h" #include "GraphicsConverter.h" #include "GraphicsImage.h" @@ -25,8 +26,11 @@ #include "support/FileName.h" #include "support/filetools.h" #include "support/FileMonitor.h" +#include "support/lassert.h" +#include "support/unique_ptr.h" #include "support/bind.h" +#include "support/TempFile.h" using namespace std; using namespace lyx::support; @@ -35,11 +39,11 @@ namespace lyx { namespace graphics { -class CacheItem::Impl : public boost::signals::trackable { +class CacheItem::Impl : public boost::signals2::trackable { public: /// - Impl(FileName const & file); + Impl(FileName const & file, FileName const & doc_file); /** * If no file conversion is needed, then tryDisplayFormat() calls @@ -90,6 +94,8 @@ public: /// The filename we refer too. FileName const filename_; + /// The document filename this graphic item belongs to + FileName const & doc_file_; /// FileMonitor const monitor_; @@ -107,23 +113,23 @@ public: bool remove_loaded_file_; /// The image and its loading status. - shared_ptr image_; + std::shared_ptr image_; /// ImageStatus status_; /// This signal is emitted when the image loading status changes. - boost::signal statusChanged; + boost::signals2::signal statusChanged; /// The connection of the signal ConvProcess::finishedConversion, - boost::signals::connection cc_; + boost::signals2::connection cc_; /// - boost::scoped_ptr converter_; + unique_ptr converter_; }; -CacheItem::CacheItem(FileName const & file) - : pimpl_(new Impl(file)) +CacheItem::CacheItem(FileName const & file, FileName const & doc_file) + : pimpl_(new Impl(file,doc_file)) {} @@ -190,7 +196,7 @@ ImageStatus CacheItem::status() const } -boost::signals::connection CacheItem::connect(slot_type const & slot) const +boost::signals2::connection CacheItem::connect(slot_type const & slot) const { return pimpl_->statusChanged.connect(slot); } @@ -201,8 +207,8 @@ boost::signals::connection CacheItem::connect(slot_type const & slot) const //------------------------------ -CacheItem::Impl::Impl(FileName const & file) - : filename_(file), +CacheItem::Impl::Impl(FileName const & file, FileName const & doc_file) + : filename_(file), doc_file_(doc_file), monitor_(file, 2000), zipped_(false), remove_loaded_file_(false), @@ -234,7 +240,7 @@ void CacheItem::Impl::reset() file_to_load_.erase(); to_.erase(); - if (image_.get()) + if (image_) image_.reset(); status_ = WaitingToLoad; @@ -242,7 +248,7 @@ void CacheItem::Impl::reset() if (cc_.connected()) cc_.disconnect(); - if (converter_.get()) + if (converter_) converter_.reset(); } @@ -262,8 +268,8 @@ void CacheItem::Impl::imageConverted(bool success) string const text = success ? "succeeded" : "failed"; LYXERR(Debug::GRAPHICS, "Image conversion " << text << '.'); - file_to_load_ = converter_.get() ? - FileName(converter_->convertedFile()) : FileName(); + file_to_load_ = converter_ ? FileName(converter_->convertedFile()) + : FileName(); converter_.reset(); cc_.disconnect(); @@ -309,13 +315,12 @@ bool CacheItem::Impl::loadImage() } -static string const findTargetFormat(string const & from) -{ - typedef vector FormatList; - FormatList const & formats = Cache::get().loadableFormats(); +typedef vector FormatList; +static string const findTargetFormat(FormatList const & formats, string const & from) +{ // There must be a format to load from. - LASSERT(!formats.empty(), /**/); + LASSERT(!formats.empty(), return string()); // Use the standard converter if we don't know the format to load // from. @@ -358,10 +363,16 @@ bool CacheItem::Impl::tryDisplayFormat(FileName & filename, string & from) return false; } - zipped_ = filename_.isZippedFile(); + zipped_ = formats.isZippedFile(filename_); if (zipped_) { - unzipped_filename_ = FileName::tempName( - filename_.toFilesystemEncoding()); + string tempname = unzippedFileName(filename_.toFilesystemEncoding()); + string const ext = getExtension(tempname); + tempname = changeExtension(tempname, "") + "-XXXXXX"; + if (!ext.empty()) + tempname = addExtension(tempname, ext); + TempFile tempfile(tempname); + tempfile.setAutoRemove(false); + unzipped_filename_ = tempfile.name(); if (unzipped_filename_.empty()) { status_ = ErrorConverting; LYXERR(Debug::GRAPHICS, "\tCould not create temporary file."); @@ -383,7 +394,7 @@ bool CacheItem::Impl::tryDisplayFormat(FileName & filename, string & from) LYXERR(Debug::GRAPHICS, "\tCould not determine file format."); } LYXERR(Debug::GRAPHICS, "\n\tThe file contains " << from << " format data."); - to_ = findTargetFormat(from); + to_ = findTargetFormat(Cache::get().loadableFormats(), from); if (from == to_) { // No conversion needed! @@ -421,13 +432,16 @@ void CacheItem::Impl::convertToDisplayFormat() // Add some stuff to create a uniquely named temporary file. // This file is deleted in loadImage after it is loaded into memory. - FileName const to_file_base = FileName::tempName("CacheItem"); + TempFile tempfile("CacheItem"); + tempfile.setAutoRemove(false); + FileName const to_file_base = tempfile.name(); remove_loaded_file_ = true; // Connect a signal to this->imageConverted and pass this signal to // the graphics converter so that we can load the modified file // on completion of the conversion process. - converter_.reset(new Converter(filename, to_file_base.absFileName(), from, to_)); + converter_ = make_unique(doc_file_, filename, to_file_base.absFileName(), + from, to_); converter_->connect(bind(&Impl::imageConverted, this, _1)); converter_->startConversion(); }