]> git.lyx.org Git - lyx.git/blob - src/graphics/GraphicsCache.cpp
Prevent the PreviewLoader from orphaning children
[lyx.git] / src / graphics / GraphicsCache.cpp
1 /**
2  * \file GraphicsCache.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Baruch Even
7  * \author Angus Leeming
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "GraphicsCache.h"
15 #include "GraphicsCacheItem.h"
16 #include "GraphicsImage.h"
17
18 #include "Format.h"
19
20 #include "frontends/Application.h"
21
22 #include "support/debug.h"
23 #include "support/FileName.h"
24 #include "support/filetools.h"
25
26 #include <map>
27
28 using namespace std;
29 using namespace lyx::support;
30
31 namespace lyx {
32
33 namespace graphics {
34
35 /** The cache contains one item per file, so use a map to find the
36  *  cache item quickly by filename.
37  */
38 typedef map<FileName, Cache::ItemPtr> CacheType;
39
40 class Cache::Impl {
41 public:
42         ///
43         CacheType cache;
44 };
45
46
47 Cache & Cache::get()
48 {
49         // Now return the cache
50         static Cache singleton;
51         return singleton;
52 }
53
54
55 Cache::Cache()
56         : pimpl_(new Impl)
57 {}
58
59
60 Cache::~Cache()
61 {
62         delete pimpl_;
63 }
64
65
66 vector<string> const & Cache::loadableFormats() const
67 {
68         static vector<string> fmts;
69
70         if (!fmts.empty())
71                 return fmts;
72
73         // The formats recognised by LyX
74         Formats::const_iterator begin = formats.begin();
75         Formats::const_iterator end   = formats.end();
76
77         // The formats natively loadable.
78         vector<string> nformat = frontend::loadableImageFormats();
79         
80         vector<string>::const_iterator it = nformat.begin();
81         for (; it != nformat.end(); ++it) {
82                 for (Formats::const_iterator fit = begin; fit != end; ++fit) {
83                         if (fit->extension() == *it) {
84                                 fmts.push_back(fit->name());
85                                 break;
86                         }
87                 }
88         }
89
90         if (lyxerr.debugging()) {
91                 LYXERR(Debug::GRAPHICS, "LyX recognises the following image formats:");
92
93                 vector<string>::const_iterator fbegin = fmts.begin();
94                 vector<string>::const_iterator fend = fmts.end();
95                 for (vector<string>::const_iterator fit = fbegin; fit != fend; ++fit) {
96                         if (fit != fbegin)
97                                 LYXERR(Debug::GRAPHICS, ", ");
98                         LYXERR(Debug::GRAPHICS, *fit);
99                 }
100                 LYXERR(Debug::GRAPHICS, '\n');
101         }
102
103         return fmts;
104 }
105
106
107 void Cache::add(FileName const & file) const
108 {
109         // Is the file in the cache already?
110         if (inCache(file)) {
111                 LYXERR(Debug::GRAPHICS, "Cache::add(" << file << "):\n"
112                                         << "The file is already in the cache.");
113                 return;
114         }
115
116         pimpl_->cache[file] = ItemPtr(new CacheItem(file));
117 }
118
119
120 void Cache::remove(FileName const & file) const
121 {
122         CacheType::iterator it = pimpl_->cache.find(file);
123         if (it == pimpl_->cache.end())
124                 return;
125
126         ItemPtr & item = it->second;
127
128         if (item.use_count() == 1) {
129                 // The graphics file is in the cache, but nothing else
130                 // references it.
131                 pimpl_->cache.erase(it);
132         }
133 }
134
135
136 bool Cache::inCache(FileName const & file) const
137 {
138         return pimpl_->cache.find(file) != pimpl_->cache.end();
139 }
140
141
142 Cache::ItemPtr const Cache::item(FileName const & file) const
143 {
144         CacheType::const_iterator it = pimpl_->cache.find(file);
145         if (it == pimpl_->cache.end())
146                 return ItemPtr();
147
148         return it->second;
149 }
150
151 } // namespace graphics
152 } // namespace lyx