Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mimetype to pclx files #1698

Merged
merged 2 commits into from
Mar 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions core_lib/src/qminiz.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ GNU General Public License for more details.
*/
#include "qminiz.h"

#include <sstream>
#include <QFileInfo>
#include <QDir>
#include <QDebug>
#include <QDirIterator>
#include "miniz.h"
#include "util.h"


Expand All @@ -38,8 +38,18 @@ bool MiniZ::isZip(const QString& sZipFilePath)
return (num > 0);
}

size_t MiniZ::istreamReadCallback(void *pOpaque, mz_uint64 file_ofs, void * pBuf, size_t n)
{
std::istream *stream = static_cast<std::istream*>(pOpaque);
mz_int64 cur_ofs = stream->tellg();
if ((mz_int64)file_ofs < 0 || (cur_ofs != (mz_int64)file_ofs && stream->seekg((mz_int64)file_ofs, std::ios_base::beg)))
return 0;
stream->read(static_cast<char*>(pBuf), n);
return stream->gcount();
}

// ReSharper disable once CppInconsistentNaming
Status MiniZ::compressFolder(QString zipFilePath, QString srcFolderPath, const QStringList& fileList)
Status MiniZ::compressFolder(QString zipFilePath, QString srcFolderPath, const QStringList& fileList, QString mimetype)
{
DebugDetails dd;
dd << QString("Creating Zip %1 from folder %2").arg(zipFilePath, srcFolderPath);
Expand All @@ -65,11 +75,26 @@ Status MiniZ::compressFolder(QString zipFilePath, QString srcFolderPath, const Q
dd << QString("Miniz writer init failed: error %1, %2").arg(static_cast<int>(err)).arg(mz_zip_get_error_string(err));;
}

// Add special uncompressed mimetype file to help with the identification of projects
{
QByteArray mimeData = mimetype.toUtf8();
std::stringstream mimeStream(mimeData.toStdString());
ok = mz_zip_writer_add_read_buf_callback(mz, "mimetype", MiniZ::istreamReadCallback, &mimeStream, mimeData.length(),
0, "", 0, MZ_NO_COMPRESSION, 0, 0,
0, 0);
if (!ok)
{
mz_zip_error err = mz_zip_get_last_error(mz);
dd << QString("Cannot add mimetype: error %1").arg(static_cast<int>(err)).arg(mz_zip_get_error_string(err));
}
}

//qDebug() << "SrcFolder=" << srcFolderPath;
for (const QString& filePath : fileList)
{
QString sRelativePath = filePath;
sRelativePath.remove(srcFolderPath);
if (sRelativePath == "mimetype") continue;

dd << QString("Add file to zip: ").append(sRelativePath);

Expand Down Expand Up @@ -166,6 +191,7 @@ Status MiniZ::uncompressFolder(QString zipFilePath, QString destPath)

if (!stat->m_is_directory)
{
if (QString(stat->m_filename) == "mimetype") continue;
QString sFullPath = baseDir.filePath(QString::fromUtf8(stat->m_filename));
dd << QString("Unzip file: ").append(sFullPath);
bool b = QFileInfo(sFullPath).absoluteDir().mkpath(".");
Expand Down
4 changes: 3 additions & 1 deletion core_lib/src/qminiz.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ GNU General Public License for more details.
#define QMINIZ_H

#include <QString>
#include "miniz.h"
#include "pencilerror.h"

namespace MiniZ
{
bool isZip(const QString& sZipFilePath);
Status compressFolder(QString zipFilePath, QString srcFolderPath, const QStringList& fileList);
size_t istreamReadCallback(void *pOpaque, mz_uint64 file_ofs, void * pBuf, size_t n);
Status compressFolder(QString zipFilePath, QString srcFolderPath, const QStringList& fileList, QString mimetype);
Status uncompressFolder(QString zipFilePath, QString destPath);
}
#endif
2 changes: 1 addition & 1 deletion core_lib/src/structure/filemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ Status FileManager::save(const Object* object, const QString& sFileName)

QString sBackupFile = backupPreviousFile(sFileName);

Status stMiniz = MiniZ::compressFolder(sFileName, sTempWorkingFolder, filesToZip);
Status stMiniz = MiniZ::compressFolder(sFileName, sTempWorkingFolder, filesToZip, "application/x-pencil2d-pclx");
if (!stMiniz.ok())
{
dd.collect(stMiniz.details());
Expand Down