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

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

232{
233 QHash<QString, StoredResource> &typedResources = d->resourcesNew[resourceType];
234
235 if (typedResources.contains(resource->filename())) {
239 return true;
240 };
241
242 StoredResource storedResource;
243 storedResource.timestamp = QDateTime::currentDateTime();
244 storedResource.data.reset(new QByteArray());
245 if (resource->isSerializable()) {
246 QBuffer buffer(storedResource.data.data());
247 buffer.open(QIODevice::WriteOnly);
248 if (!resource->saveToDevice(&buffer)) {
249 storedResource.resource = resource;
250 }
251 buffer.close();
252 } else {
253 storedResource.resource = resource;
254 }
255
256 typedResources.insert(resource->filename(), storedResource);
257
258 return true;
259}
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 348 of file KisMemoryStorage.cpp.

349{
350 QVariant r;
351 if (d->metadata.contains(key)) {
352 r = d->metadata[key];
353 }
354 return r;
355}

References d.

◆ metaDataKeys()

QStringList KisMemoryStorage::metaDataKeys ( ) const
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 337 of file KisMemoryStorage.cpp.

338{
339 QStringList keys = d->metadata.keys();
340
341 if (!keys.contains(KisResourceStorage::s_meta_name)) {
343 }
344
345 return keys;
346}
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 277 of file KisMemoryStorage.cpp.

278{
279 QStringList parts = url.split('/', Qt::SkipEmptyParts);
280
281 Q_ASSERT(parts.size() == 2);
282
283 const QString resourceType = parts[0];
284 const QString resourceFilename = parts[1];
285
286 QString result;
287
288 if (d->resourcesNew.contains(resourceType) &&
289 d->resourcesNew[resourceType].contains(resourceFilename)) {
290
291 const StoredResource &storedResource =
292 d->resourcesNew[resourceType][resourceFilename];
293
294 if (storedResource.data->size() > 0 || storedResource.resource.isNull()) {
295 result = KoMD5Generator::generateHash(*storedResource.data);
296 } else {
297 result = storedResource.resource->md5Sum();
298 }
299 }
300
301 return result;
302}
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 304 of file KisMemoryStorage.cpp.

305{
307
308
309 QHash<QString, StoredResource> &typedResources =
310 d->resourcesNew[resourceType];
311
312 for (auto it = typedResources.begin(); it != typedResources.end(); ++it) {
314 entry.filename = it.key();
315 entry.lastModified = it.value().timestamp;
316 entry.tagList = {}; // TODO
317 entry.resourceType = resourceType;
318 entries.append(entry);
319
320 }
321
323
324 return toQShared(new KisVersionedStorageIterator(entries, this));
325}
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 332 of file KisMemoryStorage.cpp.

333{
334 d->metadata[key] = value;
335}
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 327 of file KisMemoryStorage.cpp.

328{
329 return QSharedPointer<KisResourceStorage::TagIterator>(new MemoryTagIterator(d->tags[resourceType], resourceType));
330}

References d.

◆ testingRemoveResource()

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

Definition at line 261 of file KisMemoryStorage.cpp.

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

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: