File indexing completed on 2024-05-05 05:50:39

0001 /*
0002     SPDX-FileCopyrightText: 2016 Elvis Angelaccio <elvis.angelaccio@kde.org>
0003 
0004     SPDX-License-Identifier: BSD-2-Clause
0005 */
0006 
0007 #include "archiveformat.h"
0008 #include "ark_debug.h"
0009 
0010 #include <QJsonArray>
0011 
0012 namespace Kerfuffle
0013 {
0014 ArchiveFormat::ArchiveFormat()
0015 {
0016 }
0017 
0018 ArchiveFormat::ArchiveFormat(const QMimeType &mimeType,
0019                              Archive::EncryptionType encryptionType,
0020                              int minCompLevel,
0021                              int maxCompLevel,
0022                              int defaultCompLevel,
0023                              bool supportsWriteComment,
0024                              bool supportsTesting,
0025                              bool supportsMultiVolume,
0026                              const QVariantMap &compressionMethods,
0027                              const QString &defaultCompressionMethod,
0028                              const QStringList &encryptionMethods,
0029                              const QString &defaultEncryptionMethod)
0030     : m_mimeType(mimeType)
0031     , m_encryptionType(encryptionType)
0032     , m_minCompressionLevel(minCompLevel)
0033     , m_maxCompressionLevel(maxCompLevel)
0034     , m_defaultCompressionLevel(defaultCompLevel)
0035     , m_supportsWriteComment(supportsWriteComment)
0036     , m_supportsTesting(supportsTesting)
0037     , m_supportsMultiVolume(supportsMultiVolume)
0038     , m_compressionMethods(compressionMethods)
0039     , m_defaultCompressionMethod(defaultCompressionMethod)
0040     , m_encryptionMethods(encryptionMethods)
0041     , m_defaultEncryptionMethod(defaultEncryptionMethod)
0042 {
0043 }
0044 
0045 ArchiveFormat ArchiveFormat::fromMetadata(const QMimeType &mimeType, const KPluginMetaData &metadata)
0046 {
0047     const QJsonObject json = metadata.rawData();
0048     const QStringList mimeTypes = metadata.mimeTypes();
0049     for (const QString &mime : mimeTypes) {
0050         if (mimeType.name() != mime) {
0051             continue;
0052         }
0053 
0054         const QJsonObject formatProps = json[mime].toObject();
0055 
0056         int minCompLevel = formatProps[QStringLiteral("CompressionLevelMin")].toInt();
0057         int maxCompLevel = formatProps[QStringLiteral("CompressionLevelMax")].toInt();
0058         int defaultCompLevel = formatProps[QStringLiteral("CompressionLevelDefault")].toInt();
0059 
0060         bool supportsWriteComment = formatProps[QStringLiteral("SupportsWriteComment")].toBool();
0061         bool supportsTesting = formatProps[QStringLiteral("SupportsTesting")].toBool();
0062         bool supportsMultiVolume = formatProps[QStringLiteral("SupportsMultiVolume")].toBool();
0063 
0064         QVariantMap compressionMethods = formatProps[QStringLiteral("CompressionMethods")].toObject().toVariantMap();
0065         QString defaultCompMethod = formatProps[QStringLiteral("CompressionMethodDefault")].toString();
0066 
0067         // We use a QStringList instead of QVariantMap for encryption methods, to
0068         // allow arbitrary ordering of the items.
0069         QStringList encryptionMethods;
0070         const QJsonArray array = formatProps[QStringLiteral("EncryptionMethods")].toArray();
0071         for (const QJsonValue &value : array) {
0072             encryptionMethods.append(value.toString());
0073         }
0074         QString defaultEncMethod = formatProps[QStringLiteral("EncryptionMethodDefault")].toString();
0075 
0076         Archive::EncryptionType encType = Archive::Unencrypted;
0077         if (formatProps[QStringLiteral("HeaderEncryption")].toBool()) {
0078             encType = Archive::HeaderEncrypted;
0079         } else if (formatProps[QStringLiteral("Encryption")].toBool()) {
0080             encType = Archive::Encrypted;
0081         }
0082 
0083         return ArchiveFormat(mimeType,
0084                              encType,
0085                              minCompLevel,
0086                              maxCompLevel,
0087                              defaultCompLevel,
0088                              supportsWriteComment,
0089                              supportsTesting,
0090                              supportsMultiVolume,
0091                              compressionMethods,
0092                              defaultCompMethod,
0093                              encryptionMethods,
0094                              defaultEncMethod);
0095     }
0096 
0097     return ArchiveFormat();
0098 }
0099 
0100 bool ArchiveFormat::isValid() const
0101 {
0102     return m_mimeType.isValid();
0103 }
0104 
0105 Archive::EncryptionType ArchiveFormat::encryptionType() const
0106 {
0107     return m_encryptionType;
0108 }
0109 
0110 int ArchiveFormat::minCompressionLevel() const
0111 {
0112     return m_minCompressionLevel;
0113 }
0114 
0115 int ArchiveFormat::maxCompressionLevel() const
0116 {
0117     return m_maxCompressionLevel;
0118 }
0119 
0120 int ArchiveFormat::defaultCompressionLevel() const
0121 {
0122     return m_defaultCompressionLevel;
0123 }
0124 
0125 bool ArchiveFormat::supportsWriteComment() const
0126 {
0127     return m_supportsWriteComment;
0128 }
0129 
0130 bool ArchiveFormat::supportsTesting() const
0131 {
0132     return m_supportsTesting;
0133 }
0134 
0135 bool ArchiveFormat::supportsMultiVolume() const
0136 {
0137     return m_supportsMultiVolume;
0138 }
0139 
0140 QVariantMap ArchiveFormat::compressionMethods() const
0141 {
0142     return m_compressionMethods;
0143 }
0144 
0145 QString ArchiveFormat::defaultCompressionMethod() const
0146 {
0147     return m_defaultCompressionMethod;
0148 }
0149 
0150 QStringList ArchiveFormat::encryptionMethods() const
0151 {
0152     return m_encryptionMethods;
0153 }
0154 
0155 QString ArchiveFormat::defaultEncryptionMethod() const
0156 {
0157     return m_defaultEncryptionMethod;
0158 }
0159 
0160 }