67 QHash<QString, QVector<KisTagSP>>
tags;
87 d->resourcesNew = rhs.
d->resourcesNew;
88 d->tags = rhs.
d->tags;
89 d->metadata = rhs.
d->metadata;
95 d->resourcesNew = rhs.
d->resourcesNew;
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)) {
102 d->tags[key] << tag->clone();
111 QHash<QString, StoredResource> &typedResources =
112 d->resourcesNew[resourceType];
115 [&typedResources] (
const QString &filename) {
116 return typedResources.contains(filename);
119 const QString newFilename =
122 if (newFilename.isEmpty())
return false;
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);
137 typedResources.insert(newFilename, storedResource);
153 const QString resourceType =
resource->resourceType().first;
154 const QString resourceFilename =
resource->filename();
158 if (
d->resourcesNew.contains(resourceType) &&
159 d->resourcesNew[resourceType].contains(resourceFilename)) {
162 d->resourcesNew[resourceType][resourceFilename];
164 if (storedResource.
data->size() > 0) {
165 QBuffer buffer(storedResource.
data.data());
166 buffer.open(QIODevice::ReadOnly);
170 qWarning() <<
"Cannot load resource from device in KisMemoryStorage::loadVersionedResource";
182 QStringList parts = url.split(
'/', Qt::SkipEmptyParts);
184 Q_ASSERT(parts.size() == 2);
186 const QString resourceType = parts[0];
187 const QString resourceFilename = parts[1];
190 if (
d->resourcesNew.contains(resourceType) &&
191 d->resourcesNew[resourceType].contains(resourceFilename)) {
196 storedResource.
timestamp = QDateTime::currentDateTime();
197 storedResource.
data.reset(
new QByteArray(device->readAll()));
199 QHash<QString, StoredResource> &typedResources =
200 d->resourcesNew[resourceType];
201 typedResources.insert(resourceFilename, storedResource);
208 QStringList parts = url.split(
'/', Qt::SkipEmptyParts);
209 Q_ASSERT(parts.size() == 2);
211 const QString resourceType = parts[0];
212 const QString resourceFilename = parts[1];
214 if (!
d->resourcesNew.contains(resourceType) ||
215 !
d->resourcesNew[resourceType].contains(resourceFilename)) {
220 d->resourcesNew[resourceType][resourceFilename];
222 if (!storedResource.
data) {
223 qWarning() <<
"Stored resource doesn't have a serialized representation!";
227 device->write(*storedResource.
data);
233 QHash<QString, StoredResource> &typedResources =
d->resourcesNew[resourceType];
235 if (typedResources.contains(
resource->filename())) {
240 storedResource.
timestamp = QDateTime::currentDateTime();
241 storedResource.
data.reset(
new QByteArray());
243 QBuffer buffer(storedResource.
data.data());
244 buffer.open(QIODevice::WriteOnly);
245 if (!
resource->saveToDevice(&buffer)) {
253 typedResources.insert(
resource->filename(), storedResource);
260 QStringList parts = url.split(
'/', Qt::SkipEmptyParts);
262 Q_ASSERT(parts.size() == 2);
264 const QString resourceType = parts[0];
265 const QString resourceFilename = parts[1];
267 if (
d->resourcesNew.contains(resourceType)) {
268 return d->resourcesNew[resourceType].remove(resourceFilename) > 0;
276 QStringList parts = url.split(
'/', Qt::SkipEmptyParts);
278 Q_ASSERT(parts.size() == 2);
280 const QString resourceType = parts[0];
281 const QString resourceFilename = parts[1];
285 if (
d->resourcesNew.contains(resourceType) &&
286 d->resourcesNew[resourceType].contains(resourceFilename)) {
289 d->resourcesNew[resourceType][resourceFilename];
291 if (storedResource.
data->size() > 0 || storedResource.
resource.isNull()) {
294 result = storedResource.
resource->md5Sum();
306 QHash<QString, StoredResource> &typedResources =
307 d->resourcesNew[resourceType];
309 for (
auto it = typedResources.begin(); it != typedResources.end(); ++it) {
315 entries.append(entry);
348 if (
d->metadata.contains(key)) {
349 r =
d->metadata[key];
float value(const T *src, size_t ch)
static KisResourcesInterfaceSP instance()
QHash< QString, QHash< QString, StoredResource > > resourcesNew
QMap< QString, QVariant > metadata
QHash< QString, QVector< KisTagSP > > tags
The KisMemoryStorage class stores the temporary resources that are not saved to disk or bundle....
virtual ~KisMemoryStorage()
QSharedPointer< KisResourceStorage::TagIterator > tags(const QString &resourceType) override
bool saveAsNewVersion(const QString &resourceType, KoResourceSP resource) override
bool exportResource(const QString &url, QIODevice *device) override
bool importResource(const QString &url, QIODevice *device) override
void setMetaData(const QString &key, const QVariant &value) override
KisMemoryStorage & operator=(const KisMemoryStorage &rhs)
This clones all contained resources and tags from rhs.
KisMemoryStorage(const QString &location=QString("memory"))
bool loadVersionedResource(KoResourceSP resource) override
bool testingRemoveResource(const QString &url)
KisResourceStorage::ResourceItem resourceItem(const QString &url) override
QSharedPointer< KisResourceStorage::ResourceIterator > resources(const QString &resourceType) override
bool addResource(const QString &resourceType, KoResourceSP resource) override
QStringList metaDataKeys() const override
QString resourceMd5(const QString &url) override
QVariant metaData(const QString &key) const override
QScopedPointer< Private > d
static const QString s_meta_name
virtual KoResourceSP resource(const QString &url)
static void detectFileVersions(QVector< VersionedResourceEntry > &allFiles)
static QString chooseUniqueName(KoResourceSP resource, int minVersion, std::function< bool(QString)> checkExists)
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.
bool hasNext() const override
MemoryTagIterator(QVector< KisTagSP >, const QString &resourceType)
void next() override
The iterator is only valid if next() has been called at least once.
KisTagSP tag() const override
A tag object on which we can set properties and which we can save.
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
QSharedPointer< T > toQShared(T *ptr)
A resource item is simply an entry in the storage,.
QSharedPointer< QByteArray > data