]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsCacheItem.cpp
C++11 supports thread-safe initialization of statics
[lyx.git] / src / graphics / GraphicsCacheItem.cpp
index e4bfb019f94245d90701c66ecf7d357510d7e97a..ea59173eff79bc93588ed18373b7c167965f4a68 100644 (file)
 #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;
@@ -36,7 +38,7 @@ namespace lyx {
 
 namespace graphics {
 
-class CacheItem::Impl : public boost::signals::trackable {
+class CacheItem::Impl : public boost::signals2::trackable {
 public:
 
        ///
@@ -108,18 +110,18 @@ public:
        bool remove_loaded_file_;
 
        /// The image and its loading status.
-       shared_ptr<Image> image_;
+       std::shared_ptr<Image> image_;
        ///
        ImageStatus status_;
 
        /// This signal is emitted when the image loading status changes.
-       boost::signal<void()> statusChanged;
+       boost::signals2::signal<void()> statusChanged;
 
        /// The connection of the signal ConvProcess::finishedConversion,
-       boost::signals::connection cc_;
+       boost::signals2::connection cc_;
 
        ///
-       boost::scoped_ptr<Converter> converter_;
+       unique_ptr<Converter> converter_;
 };
 
 
@@ -191,7 +193,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);
 }
@@ -235,7 +237,7 @@ void CacheItem::Impl::reset()
        file_to_load_.erase();
        to_.erase();
 
-       if (image_.get())
+       if (image_)
                image_.reset();
 
        status_ = WaitingToLoad;
@@ -243,7 +245,7 @@ void CacheItem::Impl::reset()
        if (cc_.connected())
                cc_.disconnect();
 
-       if (converter_.get())
+       if (converter_)
                converter_.reset();
 }
 
@@ -263,8 +265,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();
 
@@ -316,7 +318,7 @@ static string const findTargetFormat(string const & from)
        FormatList const & formats = Cache::get().loadableFormats();
 
         // 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.
@@ -359,10 +361,16 @@ bool CacheItem::Impl::tryDisplayFormat(FileName & filename, string & from)
                return false;
        }
 
-       zipped_ = formats.isZippedFile(filename);
+       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.");
@@ -422,13 +430,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<Converter>(filename, to_file_base.absFileName(),
+                                           from, to_);
        converter_->connect(bind(&Impl::imageConverted, this, _1));
        converter_->startConversion();
 }