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 testingAddTag (const QString &resourceType, KisTagSP tag)
 
bool testingRemoveResource (const QString &url)
 
bool testingRemoveTag (const QString &resourceType, const QString &tagUrl)
 

Private Attributes

QScopedPointer< Privated
 

Friends

class TestMemoryStorage
 
class TestResourceLocator
 
class TestStorageWrapper
 

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 96 of file KisMemoryStorage.cpp.

98 , d(new Private)
99{
100}
QScopedPointer< Private > d
QString location() const
KisStoragePlugin(const QString &location)

◆ ~KisMemoryStorage()

KisMemoryStorage::~KisMemoryStorage ( )
virtual

Definition at line 102 of file KisMemoryStorage.cpp.

103{
104}

◆ KisMemoryStorage() [2/2]

KisMemoryStorage::KisMemoryStorage ( const KisMemoryStorage & rhs)

Copying the memory storage clones all contained resources and tags.

Definition at line 106 of file KisMemoryStorage.cpp.

108 , d(new Private)
109{
110 *this = rhs;
111 d->resourcesNew = rhs.d->resourcesNew;
112 d->tags = rhs.d->tags;
113 d->metadata = rhs.d->metadata;
114}

References d.

Member Function Documentation

◆ addResource()

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

here we silently overwrite the resource if the filename is the same; it is the job of higher-level code to actually resolve file name clashes

Reimplemented from KisStoragePlugin.

Definition at line 249 of file KisMemoryStorage.cpp.

250{
251 QHash<QString, StoredResource> &typedResources = d->resourcesNew[resourceType];
252
253 if (typedResources.contains(resource->filename())) {
257 return true;
258 };
259
260 StoredResource storedResource;
261 storedResource.timestamp = QDateTime::currentDateTime();
262 storedResource.data.reset(new QByteArray());
263 if (resource->isSerializable()) {
264 QBuffer buffer(storedResource.data.data());
265 buffer.open(QIODevice::WriteOnly);
266 if (!resource->saveToDevice(&buffer)) {
267 storedResource.resource = resource;
268 }
269 buffer.close();
270 } else {
271 storedResource.resource = resource;
272 }
273
274 typedResources.insert(resource->filename(), storedResource);
275
276 return true;
277}
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 226 of file KisMemoryStorage.cpp.

227{
228 auto parsedUrl = detail::splitResourceUrl(url);
229 if (!parsedUrl) return false;
230 auto [resourceType, resourceFilename] = *parsedUrl;
231
232 if (!d->resourcesNew.contains(resourceType) ||
233 !d->resourcesNew[resourceType].contains(resourceFilename)) {
234 return false;
235 }
236
237 const StoredResource &storedResource =
238 d->resourcesNew[resourceType][resourceFilename];
239
240 if (!storedResource.data) {
241 qWarning() << "Stored resource doesn't have a serialized representation!";
242 return false;
243 }
244
245 device->write(*storedResource.data);
246 return true;
247}
std::optional< std::pair< QString, QString > > splitResourceUrl(const QString &url)

References d, StoredResource::data, and detail::splitResourceUrl().

◆ importResource()

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

Reimplemented from KisStoragePlugin.

Definition at line 203 of file KisMemoryStorage.cpp.

204{
205 auto parsedUrl = detail::splitResourceUrl(url);
206 if (!parsedUrl) return false;
207 auto [resourceType, resourceFilename] = *parsedUrl;
208
209 // we cannot overwrite existing file by API convention
210 if (d->resourcesNew.contains(resourceType) &&
211 d->resourcesNew[resourceType].contains(resourceFilename)) {
212 return false;
213 }
214
215 StoredResource storedResource;
216 storedResource.timestamp = QDateTime::currentDateTime();
217 storedResource.data.reset(new QByteArray(device->readAll()));
218
219 QHash<QString, StoredResource> &typedResources =
220 d->resourcesNew[resourceType];
221 typedResources.insert(resourceFilename, storedResource);
222
223 return true;
224}

References d, StoredResource::data, detail::splitResourceUrl(), and StoredResource::timestamp.

◆ loadVersionedResource()

bool KisMemoryStorage::loadVersionedResource ( KoResourceSP resource)
overridevirtual

Implements KisStoragePlugin.

Definition at line 175 of file KisMemoryStorage.cpp.

176{
177 const QString resourceType = resource->resourceType().first;
178 const QString resourceFilename = resource->filename();
179
180 bool retval = false;
181
182 if (d->resourcesNew.contains(resourceType) &&
183 d->resourcesNew[resourceType].contains(resourceFilename)) {
184
185 const StoredResource &storedResource =
186 d->resourcesNew[resourceType][resourceFilename];
187
188 if (storedResource.data->size() > 0) {
189 QBuffer buffer(storedResource.data.data());
190 buffer.open(QIODevice::ReadOnly);
191 resource->loadFromDevice(&buffer, KisGlobalResourcesInterface::instance());
192 } else {
193 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(storedResource.data->size() > 0, false);
194 qWarning() << "Cannot load resource from device in KisMemoryStorage::loadVersionedResource";
195 return false;
196 }
197 retval = true;
198 }
199
200 return retval;
201}
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 389 of file KisMemoryStorage.cpp.

390{
391 QVariant r;
392 if (d->metadata.contains(key)) {
393 r = d->metadata[key];
394 }
395 return r;
396}

References d.

◆ metaDataKeys()

QStringList KisMemoryStorage::metaDataKeys ( ) const
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 378 of file KisMemoryStorage.cpp.

379{
380 QStringList keys = d->metadata.keys();
381
382 if (!keys.contains(KisResourceStorage::s_meta_name)) {
384 }
385
386 return keys;
387}
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 116 of file KisMemoryStorage.cpp.

117{
118 if (this != &rhs) {
119 d->resourcesNew = rhs.d->resourcesNew;
120
121 Q_FOREACH(const QString &key, rhs.d->tags.keys()) {
122 Q_FOREACH(const KisTagSP tag, rhs.d->tags[key]) {
123 if (!d->tags.contains(key)) {
124 d->tags[key] = QVector<KisTagSP>();
125 }
126 d->tags[key] << tag->clone();
127 }
128 }
129 }
130 return *this;
131}

References d.

◆ resourceItem()

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

◆ resourceMd5()

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

Reimplemented from KisStoragePlugin.

Definition at line 321 of file KisMemoryStorage.cpp.

322{
323 auto parsedUrl = detail::splitResourceUrl(url);
324 if (!parsedUrl) return QString();
325 auto [resourceType, resourceFilename] = *parsedUrl;
326
327 QString result;
328
329 if (d->resourcesNew.contains(resourceType) &&
330 d->resourcesNew[resourceType].contains(resourceFilename)) {
331
332 const StoredResource &storedResource =
333 d->resourcesNew[resourceType][resourceFilename];
334
335 if (storedResource.data->size() > 0 || storedResource.resource.isNull()) {
336 result = KoMD5Generator::generateHash(*storedResource.data);
337 } else {
338 result = storedResource.resource->md5Sum();
339 }
340 }
341
342 return result;
343}
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(), StoredResource::resource, and detail::splitResourceUrl().

◆ resources()

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

Implements KisStoragePlugin.

Definition at line 345 of file KisMemoryStorage.cpp.

346{
348
349
350 QHash<QString, StoredResource> &typedResources =
351 d->resourcesNew[resourceType];
352
353 for (auto it = typedResources.begin(); it != typedResources.end(); ++it) {
355 entry.filename = it.key();
356 entry.lastModified = it.value().timestamp;
357 entry.tagList = {}; // TODO
358 entry.resourceType = resourceType;
359 entries.append(entry);
360
361 }
362
364
365 return toQShared(new KisVersionedStorageIterator(entries, this));
366}
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 133 of file KisMemoryStorage.cpp.

134{
135 QHash<QString, StoredResource> &typedResources =
136 d->resourcesNew[resourceType];
137
138 auto checkExists =
139 [&typedResources] (const QString &filename) {
140 return typedResources.contains(filename);
141 };
142
143 const QString newFilename =
145
146 if (newFilename.isEmpty()) return false;
147
148 resource->setFilename(newFilename);
149
150 StoredResource storedResource;
151 storedResource.timestamp = QDateTime::currentDateTime();
152 storedResource.data.reset(new QByteArray());
153 QBuffer buffer(storedResource.data.data());
154 buffer.open(QIODevice::WriteOnly);
155 bool result = resource->saveToDevice(&buffer);
156 buffer.close();
157 if (!result) {
158 storedResource.resource = resource;
159 }
160
161 typedResources.insert(newFilename, storedResource);
162
163 return true;
164}
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 373 of file KisMemoryStorage.cpp.

374{
375 d->metadata[key] = value;
376}
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 368 of file KisMemoryStorage.cpp.

References d.

◆ testingAddTag()

bool KisMemoryStorage::testingAddTag ( const QString & resourceType,
KisTagSP tag )
private

Definition at line 292 of file KisMemoryStorage.cpp.

293{
294 KIS_SAFE_ASSERT_RECOVER_NOOP(resourceType == tag->resourceType());
295
296 QVector<KisTagSP> &typedTags = d->tags[resourceType];
297
298 auto existingIt = std::find_if(typedTags.begin(), typedTags.end(), kismpl::mem_equal_to(&KisTag::url, tag->url()));
299 if (existingIt != typedTags.end()) {
300 typedTags.erase(existingIt);
301 }
302
303 typedTags.append(tag);
304
305 return true;
306}
QString url() const
The unique identifier for the tag. Since tag urls are compared COLLATE NOCASE, tag urls must be ASCII...
Definition KisTag.cpp:159
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
auto mem_equal_to(MemTypeNoRef Class::*ptr, MemType &&value)
mem_equal_to is an unary functor that compares a member of the object to a given value
Definition KisMpl.h:233

References d, KIS_SAFE_ASSERT_RECOVER_NOOP, kismpl::mem_equal_to(), and KisTag::url().

◆ testingRemoveResource()

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

Definition at line 279 of file KisMemoryStorage.cpp.

280{
281 auto parsedUrl = detail::splitResourceUrl(url);
282 if (!parsedUrl) return false;
283 auto [resourceType, resourceFilename] = *parsedUrl;
284
285 if (d->resourcesNew.contains(resourceType)) {
286 return d->resourcesNew[resourceType].remove(resourceFilename) > 0;
287 }
288
289 return false;
290}

References d, and detail::splitResourceUrl().

◆ testingRemoveTag()

bool KisMemoryStorage::testingRemoveTag ( const QString & resourceType,
const QString & tagUrl )
private

Definition at line 308 of file KisMemoryStorage.cpp.

309{
310 QVector<KisTagSP> &typedTags = d->tags[resourceType];
311
312 auto existingIt = std::find_if(typedTags.begin(), typedTags.end(), kismpl::mem_equal_to(&KisTag::url, tagUrl));
313 if (existingIt != typedTags.end()) {
314 typedTags.erase(existingIt);
315 return true;
316 }
317
318 return false;
319}

References d, kismpl::mem_equal_to(), and KisTag::url().

Friends And Related Symbol Documentation

◆ TestMemoryStorage

friend class TestMemoryStorage
friend

Definition at line 49 of file KisMemoryStorage.h.

◆ TestResourceLocator

friend class TestResourceLocator
friend

Definition at line 50 of file KisMemoryStorage.h.

◆ TestStorageWrapper

friend class TestStorageWrapper
friend

Definition at line 51 of file KisMemoryStorage.h.

Member Data Documentation

◆ d

QScopedPointer<Private> KisMemoryStorage::d
private

Definition at line 58 of file KisMemoryStorage.h.


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