Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMemoryStorage Class Reference

The KisMemoryStorage class stores the temporary resources that are not saved to disk or bundle. It is also used to stores transient per-document resources, such as the document-local palette list. More...

#include <KisMemoryStorage.h>

+ Inheritance diagram for KisMemoryStorage:

Classes

class  Private
 

Public Member Functions

bool addResource (const QString &resourceType, KoResourceSP resource) override
 
bool exportResource (const QString &url, QIODevice *device) override
 
bool importResource (const QString &url, QIODevice *device) override
 
 KisMemoryStorage (const KisMemoryStorage &rhs)
 Copying the memory storage clones all contained resources and tags.
 
 KisMemoryStorage (const QString &location=QString("memory"))
 
bool loadVersionedResource (KoResourceSP resource) override
 
QVariant metaData (const QString &key) const override
 
QStringList metaDataKeys () const override
 
KisMemoryStorageoperator= (const KisMemoryStorage &rhs)
 This clones all contained resources and tags from rhs.
 
KisResourceStorage::ResourceItem resourceItem (const QString &url) override
 
QString resourceMd5 (const QString &url) override
 
QSharedPointer< KisResourceStorage::ResourceIteratorresources (const QString &resourceType) override
 
bool saveAsNewVersion (const QString &resourceType, KoResourceSP resource) override
 
void setMetaData (const QString &key, const QVariant &value) override
 
QSharedPointer< KisResourceStorage::TagIteratortags (const QString &resourceType) override
 
virtual ~KisMemoryStorage ()
 
- Public Member Functions inherited from KisStoragePlugin
virtual bool isValid () const
 
 KisStoragePlugin (const QString &location)
 
virtual KoResourceSP resource (const QString &url)
 
virtual QString resourceFilePath (const QString &url)
 
virtual bool supportsVersioning () const
 
virtual QImage thumbnail () const
 
QDateTime timestamp ()
 
virtual ~KisStoragePlugin ()
 

Private Member Functions

bool testingRemoveResource (const QString &url)
 

Private Attributes

QScopedPointer< Privated
 

Friends

class TestResourceLocator
 

Additional Inherited Members

- Protected Member Functions inherited from KisStoragePlugin
QString location () const
 
void sanitizeResourceFileNameCase (KoResourceSP resource, const QDir &parentDir)
 

Detailed Description

The KisMemoryStorage class stores the temporary resources that are not saved to disk or bundle. It is also used to stores transient per-document resources, such as the document-local palette list.

Definition at line 20 of file KisMemoryStorage.h.

Constructor & Destructor Documentation

◆ KisMemoryStorage() [1/2]

KisMemoryStorage::KisMemoryStorage ( const QString & location = QString("memory"))

Definition at line 72 of file KisMemoryStorage.cpp.

74 , d(new Private)
75{
76}
QScopedPointer< Private > d
QString location() const
KisStoragePlugin(const QString &location)

◆ ~KisMemoryStorage()

KisMemoryStorage::~KisMemoryStorage ( )
virtual

Definition at line 78 of file KisMemoryStorage.cpp.

79{
80}

◆ KisMemoryStorage() [2/2]

KisMemoryStorage::KisMemoryStorage ( const KisMemoryStorage & rhs)

Copying the memory storage clones all contained resources and tags.

Definition at line 82 of file KisMemoryStorage.cpp.

84 , d(new Private)
85{
86 *this = rhs;
87 d->resourcesNew = rhs.d->resourcesNew;
88 d->tags = rhs.d->tags;
89 d->metadata = rhs.d->metadata;
90}

References d.

Member Function Documentation

◆ addResource()

bool KisMemoryStorage::addResource ( const QString & resourceType,
KoResourceSP resource )
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 231 of file KisMemoryStorage.cpp.

232{
233 QHash<QString, StoredResource> &typedResources = d->resourcesNew[resourceType];
234
235 if (typedResources.contains(resource->filename())) {
236 return true;
237 };
238
239 StoredResource storedResource;
240 storedResource.timestamp = QDateTime::currentDateTime();
241 storedResource.data.reset(new QByteArray());
242 if (resource->isSerializable()) {
243 QBuffer buffer(storedResource.data.data());
244 buffer.open(QIODevice::WriteOnly);
245 if (!resource->saveToDevice(&buffer)) {
246 storedResource.resource = resource;
247 }
248 buffer.close();
249 } else {
250 storedResource.resource = resource;
251 }
252
253 typedResources.insert(resource->filename(), storedResource);
254
255 return true;
256}
virtual KoResourceSP resource(const QString &url)
KoResourceSP resource
QSharedPointer< QByteArray > data

References d, StoredResource::data, StoredResource::resource, KisStoragePlugin::resource(), and StoredResource::timestamp.

◆ exportResource()

bool KisMemoryStorage::exportResource ( const QString & url,
QIODevice * device )
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 206 of file KisMemoryStorage.cpp.

207{
208 QStringList parts = url.split('/', Qt::SkipEmptyParts);
209 Q_ASSERT(parts.size() == 2);
210
211 const QString resourceType = parts[0];
212 const QString resourceFilename = parts[1];
213
214 if (!d->resourcesNew.contains(resourceType) ||
215 !d->resourcesNew[resourceType].contains(resourceFilename)) {
216 return false;
217 }
218
219 const StoredResource &storedResource =
220 d->resourcesNew[resourceType][resourceFilename];
221
222 if (!storedResource.data) {
223 qWarning() << "Stored resource doesn't have a serialized representation!";
224 return false;
225 }
226
227 device->write(*storedResource.data);
228 return true;
229}

References d, and StoredResource::data.

◆ importResource()

bool KisMemoryStorage::importResource ( const QString & url,
QIODevice * device )
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 179 of file KisMemoryStorage.cpp.

180{
181
182 QStringList parts = url.split('/', Qt::SkipEmptyParts);
183
184 Q_ASSERT(parts.size() == 2);
185
186 const QString resourceType = parts[0];
187 const QString resourceFilename = parts[1];
188
189 // we cannot overwrite existing file by API convention
190 if (d->resourcesNew.contains(resourceType) &&
191 d->resourcesNew[resourceType].contains(resourceFilename)) {
192 return false;
193 }
194
195 StoredResource storedResource;
196 storedResource.timestamp = QDateTime::currentDateTime();
197 storedResource.data.reset(new QByteArray(device->readAll()));
198
199 QHash<QString, StoredResource> &typedResources =
200 d->resourcesNew[resourceType];
201 typedResources.insert(resourceFilename, storedResource);
202
203 return true;
204}

References d, StoredResource::data, and StoredResource::timestamp.

◆ loadVersionedResource()

bool KisMemoryStorage::loadVersionedResource ( KoResourceSP resource)
overridevirtual

Implements KisStoragePlugin.

Definition at line 151 of file KisMemoryStorage.cpp.

152{
153 const QString resourceType = resource->resourceType().first;
154 const QString resourceFilename = resource->filename();
155
156 bool retval = false;
157
158 if (d->resourcesNew.contains(resourceType) &&
159 d->resourcesNew[resourceType].contains(resourceFilename)) {
160
161 const StoredResource &storedResource =
162 d->resourcesNew[resourceType][resourceFilename];
163
164 if (storedResource.data->size() > 0) {
165 QBuffer buffer(storedResource.data.data());
166 buffer.open(QIODevice::ReadOnly);
167 resource->loadFromDevice(&buffer, KisGlobalResourcesInterface::instance());
168 } else {
169 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(storedResource.data->size() > 0, false);
170 qWarning() << "Cannot load resource from device in KisMemoryStorage::loadVersionedResource";
171 return false;
172 }
173 retval = true;
174 }
175
176 return retval;
177}
static KisResourcesInterfaceSP instance()
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References d, StoredResource::data, KisGlobalResourcesInterface::instance(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, and KisStoragePlugin::resource().

◆ metaData()

QVariant KisMemoryStorage::metaData ( const QString & key) const
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 345 of file KisMemoryStorage.cpp.

346{
347 QVariant r;
348 if (d->metadata.contains(key)) {
349 r = d->metadata[key];
350 }
351 return r;
352}

References d.

◆ metaDataKeys()

QStringList KisMemoryStorage::metaDataKeys ( ) const
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 334 of file KisMemoryStorage.cpp.

335{
336 QStringList keys = d->metadata.keys();
337
338 if (!keys.contains(KisResourceStorage::s_meta_name)) {
340 }
341
342 return keys;
343}
static const QString s_meta_name

References d, and KisResourceStorage::s_meta_name.

◆ operator=()

KisMemoryStorage & KisMemoryStorage::operator= ( const KisMemoryStorage & rhs)

This clones all contained resources and tags from rhs.

Definition at line 92 of file KisMemoryStorage.cpp.

93{
94 if (this != &rhs) {
95 d->resourcesNew = rhs.d->resourcesNew;
96
97 Q_FOREACH(const QString &key, rhs.d->tags.keys()) {
98 Q_FOREACH(const KisTagSP tag, rhs.d->tags[key]) {
99 if (!d->tags.contains(key)) {
100 d->tags[key] = QVector<KisTagSP>();
101 }
102 d->tags[key] << tag->clone();
103 }
104 }
105 }
106 return *this;
107}

References d.

◆ resourceItem()

KisResourceStorage::ResourceItem KisMemoryStorage::resourceItem ( const QString & url)
overridevirtual

Implements KisStoragePlugin.

Definition at line 142 of file KisMemoryStorage.cpp.

143{
144 MemoryItem item;
145 item.url = url;
146 item.folder = QString();
147 item.lastModified = QDateTime::fromMSecsSinceEpoch(0);
148 return item;
149}

References KisResourceStorage::ResourceItem::folder, KisResourceStorage::ResourceItem::lastModified, and KisResourceStorage::ResourceItem::url.

◆ resourceMd5()

QString KisMemoryStorage::resourceMd5 ( const QString & url)
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 274 of file KisMemoryStorage.cpp.

275{
276 QStringList parts = url.split('/', Qt::SkipEmptyParts);
277
278 Q_ASSERT(parts.size() == 2);
279
280 const QString resourceType = parts[0];
281 const QString resourceFilename = parts[1];
282
283 QString result;
284
285 if (d->resourcesNew.contains(resourceType) &&
286 d->resourcesNew[resourceType].contains(resourceFilename)) {
287
288 const StoredResource &storedResource =
289 d->resourcesNew[resourceType][resourceFilename];
290
291 if (storedResource.data->size() > 0 || storedResource.resource.isNull()) {
292 result = KoMD5Generator::generateHash(*storedResource.data);
293 } else {
294 result = storedResource.resource->md5Sum();
295 }
296 }
297
298 return result;
299}
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.

References d, StoredResource::data, KoMD5Generator::generateHash(), and StoredResource::resource.

◆ resources()

QSharedPointer< KisResourceStorage::ResourceIterator > KisMemoryStorage::resources ( const QString & resourceType)
overridevirtual

Implements KisStoragePlugin.

Definition at line 301 of file KisMemoryStorage.cpp.

302{
304
305
306 QHash<QString, StoredResource> &typedResources =
307 d->resourcesNew[resourceType];
308
309 for (auto it = typedResources.begin(); it != typedResources.end(); ++it) {
311 entry.filename = it.key();
312 entry.lastModified = it.value().timestamp;
313 entry.tagList = {}; // TODO
314 entry.resourceType = resourceType;
315 entries.append(entry);
316
317 }
318
320
321 return toQShared(new KisVersionedStorageIterator(entries, this));
322}
static void detectFileVersions(QVector< VersionedResourceEntry > &allFiles)
QSharedPointer< T > toQShared(T *ptr)

References d, KisStorageVersioningHelper::detectFileVersions(), VersionedResourceEntry::filename, VersionedResourceEntry::lastModified, VersionedResourceEntry::resourceType, VersionedResourceEntry::tagList, and toQShared().

◆ saveAsNewVersion()

bool KisMemoryStorage::saveAsNewVersion ( const QString & resourceType,
KoResourceSP resource )
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 109 of file KisMemoryStorage.cpp.

110{
111 QHash<QString, StoredResource> &typedResources =
112 d->resourcesNew[resourceType];
113
114 auto checkExists =
115 [&typedResources] (const QString &filename) {
116 return typedResources.contains(filename);
117 };
118
119 const QString newFilename =
121
122 if (newFilename.isEmpty()) return false;
123
124 resource->setFilename(newFilename);
125
126 StoredResource storedResource;
127 storedResource.timestamp = QDateTime::currentDateTime();
128 storedResource.data.reset(new QByteArray());
129 QBuffer buffer(storedResource.data.data());
130 buffer.open(QIODevice::WriteOnly);
131 bool result = resource->saveToDevice(&buffer);
132 buffer.close();
133 if (!result) {
134 storedResource.resource = resource;
135 }
136
137 typedResources.insert(newFilename, storedResource);
138
139 return true;
140}
static QString chooseUniqueName(KoResourceSP resource, int minVersion, std::function< bool(QString)> checkExists)

References KisStorageVersioningHelper::chooseUniqueName(), d, StoredResource::data, StoredResource::resource, KisStoragePlugin::resource(), and StoredResource::timestamp.

◆ setMetaData()

void KisMemoryStorage::setMetaData ( const QString & key,
const QVariant & value )
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 329 of file KisMemoryStorage.cpp.

330{
331 d->metadata[key] = value;
332}
float value(const T *src, size_t ch)

References d, and value().

◆ tags()

QSharedPointer< KisResourceStorage::TagIterator > KisMemoryStorage::tags ( const QString & resourceType)
overridevirtual

Implements KisStoragePlugin.

Definition at line 324 of file KisMemoryStorage.cpp.

325{
326 return QSharedPointer<KisResourceStorage::TagIterator>(new MemoryTagIterator(d->tags[resourceType], resourceType));
327}

References d.

◆ testingRemoveResource()

bool KisMemoryStorage::testingRemoveResource ( const QString & url)
private

Definition at line 258 of file KisMemoryStorage.cpp.

259{
260 QStringList parts = url.split('/', Qt::SkipEmptyParts);
261
262 Q_ASSERT(parts.size() == 2);
263
264 const QString resourceType = parts[0];
265 const QString resourceFilename = parts[1];
266
267 if (d->resourcesNew.contains(resourceType)) {
268 return d->resourcesNew[resourceType].remove(resourceFilename) > 0;
269 }
270
271 return false;
272}

References d.

Friends And Related Symbol Documentation

◆ TestResourceLocator

friend class TestResourceLocator
friend

Definition at line 49 of file KisMemoryStorage.h.

Member Data Documentation

◆ d

QScopedPointer<Private> KisMemoryStorage::d
private

Definition at line 54 of file KisMemoryStorage.h.


The documentation for this class was generated from the following files: