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

#include <KisBundleStorage.h>

+ Inheritance diagram for KisBundleStorage:

Classes

class  Private
 

Public Member Functions

bool exportResource (const QString &url, QIODevice *device) override
 
 KisBundleStorage (const QString &location)
 
bool loadVersionedResource (KoResourceSP resource) override
 Note: this should find resources in a folder that override a resource in the bundle first.
 
QVariant metaData (const QString &key) const override
 
QStringList metaDataKeys () const override
 
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
 
QSharedPointer< KisResourceStorage::TagIteratortags (const QString &resourceType) override
 
QImage thumbnail () const override
 
virtual ~KisBundleStorage ()
 
- Public Member Functions inherited from KisStoragePlugin
virtual bool addResource (const QString &resourceType, KoResourceSP resource)
 
virtual bool importResource (const QString &url, QIODevice *device)
 
virtual bool isValid () const
 
 KisStoragePlugin (const QString &location)
 
virtual KoResourceSP resource (const QString &url)
 
virtual QString resourceFilePath (const QString &url)
 
virtual void setMetaData (const QString &key, const QVariant &value)
 
virtual bool supportsVersioning () const
 
QDateTime timestamp ()
 
virtual ~KisStoragePlugin ()
 

Private Attributes

QScopedPointer< Privated
 

Friends

class BundleIterator
 

Additional Inherited Members

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

Detailed Description

KisBundleStorage is KisStoragePlugin that can load resources from bundles. It can also manage overridden resources from bundles, which are not stored in the bundles themselves.

Definition at line 18 of file KisBundleStorage.h.

Constructor & Destructor Documentation

◆ KisBundleStorage()

KisBundleStorage::KisBundleStorage ( const QString & location)

Definition at line 82 of file KisBundleStorage.cpp.

84 , d(new Private(this))
85{
86 d->bundle.reset(new KoResourceBundle(location));
87 if (!d->bundle->load()) {
88 qWarning() << "Could not load bundle" << location;
89 }
90}
QScopedPointer< Private > d
QString location() const
KisStoragePlugin(const QString &location)
A KoResourceBundle is a zip file that contains resources, some metadata about the creator of the bund...

References d, and KisStoragePlugin::location().

◆ ~KisBundleStorage()

KisBundleStorage::~KisBundleStorage ( )
virtual

Definition at line 92 of file KisBundleStorage.cpp.

93{
94}

Member Function Documentation

◆ exportResource()

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

Reimplemented from KisStoragePlugin.

Definition at line 258 of file KisBundleStorage.cpp.

259{
260 QStringList parts = url.split('/', Qt::SkipEmptyParts);
261 Q_ASSERT(parts.size() == 2);
262
263 const QString resourceType = parts[0];
264 const QString resourceFileName = parts[1];
265
266 bool foundVersionedFile = false;
267
268 const QString bundleSaveLocation = location() + "_modified" + "/" + resourceType;
269
270 if (QDir(bundleSaveLocation).exists()) {
271 const QString fn = bundleSaveLocation + "/" + resourceFileName;
272 if (QFileInfo(fn).exists()) {
273 foundVersionedFile = true;
274
275 QFile f(fn);
276 if (!f.open(QFile::ReadOnly)) {
277 qWarning() << "Could not open resource file for reading" << fn;
278 return false;
279 }
280
281 device->write(f.readAll());
282 }
283 }
284
285 if (!foundVersionedFile) {
286 d->bundle->exportResource(resourceType, resourceFileName, device);
287 }
288
289 return true;
290}

References d, and KisStoragePlugin::location().

◆ loadVersionedResource()

bool KisBundleStorage::loadVersionedResource ( KoResourceSP resource)
overridevirtual

Note: this should find resources in a folder that override a resource in the bundle first.

Implements KisStoragePlugin.

Definition at line 108 of file KisBundleStorage.cpp.

109{
110 bool foundVersionedFile = false;
111
112 const QString resourceType = resource->resourceType().first;
113 const QString resourceUrl = resourceType + "/" + resource->filename();
114
115 const QString bundleSaveLocation = location() + "_modified" + "/" + resourceType;
116
117 if (QDir(bundleSaveLocation).exists()) {
118 const QString fn = bundleSaveLocation + "/" + resource->filename();
119 const QFileInfo fi(fn);
120 if (fi.exists()) {
121 foundVersionedFile = true;
122
123 QFile f(fn);
124 if (!f.open(QFile::ReadOnly)) {
125 qWarning() << "Could not open resource file for reading" << fn;
126 return false;
127 }
128 if (!resource->loadFromDevice(&f, KisGlobalResourcesInterface::instance())) {
129 qWarning() << "Could not reload resource file" << fn;
130 return false;
131 }
132
134
135 // Check for the thumbnail
136 if ((resource->image().isNull() || resource->thumbnail().isNull()) && !resource->thumbnailPath().isNull()) {
137 QImage img(bundleSaveLocation + "/" + '/' + resource->thumbnailPath());
138 resource->setImage(img);
139 resource->updateThumbnail();
140 }
141 f.close();
142 }
143 }
144
145 if (!foundVersionedFile) {
146 d->bundle->loadResource(resource);
147 }
148
149 return true;
150}
static KisResourcesInterfaceSP instance()
virtual KoResourceSP resource(const QString &url)
void sanitizeResourceFileNameCase(KoResourceSP resource, const QDir &parentDir)

References d, KisGlobalResourcesInterface::instance(), KisStoragePlugin::location(), KisStoragePlugin::resource(), and KisStoragePlugin::sanitizeResourceFileNameCase().

◆ metaData()

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

Reimplemented from KisStoragePlugin.

Definition at line 242 of file KisBundleStorage.cpp.

243{
244 return d->bundle->metaData(key);
245}

References d.

◆ metaDataKeys()

QStringList KisBundleStorage::metaDataKeys ( ) const
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 224 of file KisBundleStorage.cpp.

225{
226
239
240}
QList< QString > QStringList
static const QString s_meta_author
static const QString s_meta_title
static const QString s_meta_user_defined
static const QString s_meta_creation_date
static const QString s_meta_value
static const QString s_meta_description
static const QString s_meta_dc_date
static const QString s_meta_generator
static const QString s_meta_version
static const QString s_meta_name
static const QString s_meta_initial_creator
static const QString s_meta_creator

References KisResourceStorage::s_meta_author, KisResourceStorage::s_meta_creation_date, KisResourceStorage::s_meta_creator, KisResourceStorage::s_meta_dc_date, KisResourceStorage::s_meta_description, KisResourceStorage::s_meta_generator, KisResourceStorage::s_meta_initial_creator, KisResourceStorage::s_meta_name, KisResourceStorage::s_meta_title, KisResourceStorage::s_meta_user_defined, KisResourceStorage::s_meta_value, and KisResourceStorage::s_meta_version.

◆ resourceItem()

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

Implements KisStoragePlugin.

Definition at line 96 of file KisBundleStorage.cpp.

97{
99 item.url = url;
100 QStringList parts = url.split('/', Qt::SkipEmptyParts);
101 Q_ASSERT(parts.size() == 2);
102 item.folder = parts[0];
103 item.resourceType = parts[0];
104 item.lastModified = QFileInfo(d->bundle->filename()).lastModified();
105 return item;
106}
A resource item is simply an entry in the storage,.

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

◆ resourceMd5()

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

Reimplemented from KisStoragePlugin.

Definition at line 152 of file KisBundleStorage.cpp.

153{
154 QString result;
155
156 QFile modifiedFile(location() + "_modified" + "/" + url);
157 if (modifiedFile.exists() && modifiedFile.open(QIODevice::ReadOnly)) {
158 result = KoMD5Generator::generateHash(modifiedFile.readAll());
159 } else {
160 result = d->bundle->resourceMd5(url);
161 }
162
163 return result;
164}
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.

References d, KoMD5Generator::generateHash(), and KisStoragePlugin::location().

◆ resources()

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

Implements KisStoragePlugin.

Definition at line 166 of file KisBundleStorage.cpp.

167{
169
171 d->bundle->manifest().files(resourceType);
172
173 for (auto it = references.begin(); it != references.end(); ++it) {
175 // it->resourcePath() contains paths like "brushes/ink.png" or "brushes/subfolder/splash.png".
176 // we need to cut off the first part and get "ink.png" in the first case,
177 // but "subfolder/splash.png" in the second case in order for subfolders to work
178 // so it cannot just use QFileInfo(verIt->url()).fileName() here.
179 QString path = QDir::fromNativeSeparators(it->resourcePath); // make sure it uses Unix separators
180 int folderEndIdx = path.indexOf("/");
181 QString properFilenameWithSubfolders = path.right(path.length() - folderEndIdx - 1);
182
183 entry.filename = properFilenameWithSubfolders;
184 entry.lastModified = QFileInfo(location()).lastModified();
185 entry.tagList = it->tagList;
186 entry.resourceType = resourceType;
187 entries.append(entry);
188 }
189
190 const QString bundleSaveLocation = location() + "_modified" + "/" + resourceType;
191
192 QDirIterator it(bundleSaveLocation,
193 KisResourceLoaderRegistry::instance()->filters(resourceType),
194 QDir::Files | QDir::Readable,
195 QDirIterator::Subdirectories);;
196
197 while (it.hasNext()) {
198 it.next();
199 QFileInfo info(it.fileInfo());
200
202 entry.filename = info.fileName();
203 entry.lastModified = info.lastModified();
204 entry.tagList = {}; // TODO
205 entry.resourceType = resourceType;
206 entries.append(entry);
207 }
208
210
211 return toQShared(new KisVersionedStorageIterator(entries, this));
212}
static KisResourceLoaderRegistry * instance()
static void detectFileVersions(QVector< VersionedResourceEntry > &allFiles)
QSharedPointer< T > toQShared(T *ptr)

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

◆ saveAsNewVersion()

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

Add a resource to this bundle: note, the bundle itself should NOT be rewritten, but we need to put these tags in a place in the file system

Reimplemented from KisStoragePlugin.

Definition at line 247 of file KisBundleStorage.cpp.

248{
249 QString bundleSaveLocation = location() + "_modified" + "/" + resourceType;
250
251 if (!QDir(bundleSaveLocation).exists()) {
252 QDir().mkpath(bundleSaveLocation);
253 }
254
255 return KisStorageVersioningHelper::addVersionedResource(bundleSaveLocation, resource, 1);
256}
static bool addVersionedResource(const QString &saveLocation, KoResourceSP resource, int minVersion)

References KisStorageVersioningHelper::addVersionedResource(), KisStoragePlugin::location(), and KisStoragePlugin::resource().

◆ tags()

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

Implements KisStoragePlugin.

Definition at line 214 of file KisBundleStorage.cpp.

References d.

◆ thumbnail()

QImage KisBundleStorage::thumbnail ( ) const
overridevirtual

Reimplemented from KisStoragePlugin.

Definition at line 219 of file KisBundleStorage.cpp.

220{
221 return d->bundle->image();
222}

References d.

Friends And Related Symbol Documentation

◆ BundleIterator

friend class BundleIterator
friend

Definition at line 42 of file KisBundleStorage.h.

Member Data Documentation

◆ d

QScopedPointer<Private> KisBundleStorage::d
private

Definition at line 46 of file KisBundleStorage.h.


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