File indexing completed on 2024-04-28 04:21:08

0001 // SPDX-FileCopyrightText: 2020 The KPhotoAlbum development team
0002 // SPDX-FileCopyrightText: 2021 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 //
0004 // SPDX-License-Identifier: LicenseRef-KDE-Accepted-GPL
0005 
0006 #include "ThumbnailCacheConverter.h"
0007 #include "Logging.h"
0008 
0009 #include <KLocalizedString>
0010 #include <QDataStream>
0011 #include <QFile>
0012 #include <QString>
0013 #include <QTemporaryFile>
0014 #include <QTextStream>
0015 
0016 int KPAThumbnailTool::convertV5ToV4Cache(const QString &indexFilename, QTextStream &err)
0017 {
0018     QFile fromFile { indexFilename };
0019     if (!fromFile.open(QIODevice::ReadOnly)) {
0020         err << i18nc("@info:shell", "Could not open file `thumbnailindex`!\n");
0021         err << i18nc("@info:shell", "Thumbnail index was not changed.\n");
0022         return 1;
0023     }
0024     QTemporaryFile toFile;
0025     if (!toFile.open()) {
0026         err << i18nc("@info:shell", "Could not open temporary file for writing!\n");
0027         err << i18nc("@info:shell", "Thumbnail index was not changed.\n");
0028         return 1;
0029     }
0030 
0031     if (!convertV5ToV4Cache(fromFile, toFile, err))
0032         return 1;
0033 
0034     if (!fromFile.rename(QString::fromUtf8("%1.bak").arg(indexFilename))) {
0035         err << i18nc("@info:shell", "Could not back up file `thumbnailindex`!\n");
0036         err << i18nc("@info:shell", "Thumbnail index was not changed.\n");
0037         return 1;
0038     }
0039     if (!toFile.copy(indexFilename)) {
0040         err << i18nc("@info:shell", "Could not copy temporary thumbnail index file to final location!\n");
0041         err << i18nc("@info:shell", "Error message was: %1\n", toFile.errorString());
0042         return 1;
0043     }
0044     return 0;
0045 }
0046 
0047 bool KPAThumbnailTool::convertV5ToV4Cache(QIODevice &fromFile, QIODevice &toFile, QTextStream &err)
0048 {
0049     Q_ASSERT(fromFile.isReadable());
0050     Q_ASSERT(toFile.isWritable());
0051     QDataStream fromStream { &fromFile };
0052     int version;
0053     fromStream >> version;
0054     if (version != 5) {
0055         err << i18nc("@info:shell", "Thumbnail index is not a version 5 file!\n");
0056         err << i18nc("@info:shell", "Thumbnail index was not changed.\n");
0057         return false;
0058     }
0059     // skip dimensions
0060     fromStream.skipRawData(sizeof(int));
0061 
0062     QDataStream toStream { &toFile };
0063     constexpr int v4FileVersion = 4;
0064     toStream << v4FileVersion;
0065     int numBytes = 0;
0066     char buf[256];
0067     do {
0068         numBytes = fromStream.readRawData(buf, 256);
0069         toStream.writeRawData(buf, numBytes);
0070     } while (numBytes != 0);
0071 
0072     return true;
0073 }
0074 
0075 // vi:expandtab:tabstop=4 shiftwidth=4: