Fix path separators in archives created by QZipWriter

It was not possible to extract data from the archive on OSX
which was created on Windows platform because of wrong
separators. Archive was created on Windows via QZipWriter and
opened on OSX with QZipReader. It consisted of a lots directories
and subdirectories with files. The solution is to use '/' separator
for internal representation.

Change-Id: Ic0837ca184bb6188129d53b587a5df2ec61e4e05
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
This commit is contained in:
Pavel Mogylevskiy 2013-02-19 02:45:44 +02:00 committed by The Qt Project
parent af27b37b08
commit eff6dbb306

View File

@ -1302,7 +1302,7 @@ QFile::Permissions QZipWriter::creationPermissions() const
*/
void QZipWriter::addFile(const QString &fileName, const QByteArray &data)
{
d->addEntry(QZipWriterPrivate::File, fileName, data);
d->addEntry(QZipWriterPrivate::File, QDir::fromNativeSeparators(fileName), data);
}
/*!
@ -1324,7 +1324,7 @@ void QZipWriter::addFile(const QString &fileName, QIODevice *device)
return;
}
}
d->addEntry(QZipWriterPrivate::File, fileName, device->readAll());
d->addEntry(QZipWriterPrivate::File, QDir::fromNativeSeparators(fileName), device->readAll());
if (opened)
device->close();
}
@ -1335,10 +1335,10 @@ void QZipWriter::addFile(const QString &fileName, QIODevice *device)
*/
void QZipWriter::addDirectory(const QString &dirName)
{
QString name = dirName;
QString name(QDir::fromNativeSeparators(dirName));
// separator is mandatory
if (!name.endsWith(QDir::separator()))
name.append(QDir::separator());
if (!name.endsWith(QLatin1Char('/')))
name.append(QLatin1Char('/'));
d->addEntry(QZipWriterPrivate::Directory, name, QByteArray());
}
@ -1349,7 +1349,7 @@ void QZipWriter::addDirectory(const QString &dirName)
*/
void QZipWriter::addSymLink(const QString &fileName, const QString &destination)
{
d->addEntry(QZipWriterPrivate::Symlink, fileName, QFile::encodeName(destination));
d->addEntry(QZipWriterPrivate::Symlink, QDir::fromNativeSeparators(fileName), QFile::encodeName(destination));
}
/*!