Skip to content

Commit

Permalink
PropagateDownloadFile: Allow symlink to be larger than 8kB
Browse files Browse the repository at this point in the history
Signed-off-by: Tamino Bauknecht <[email protected]>
  • Loading branch information
taminob committed Dec 8, 2023
1 parent 9a445e0 commit 1c9112a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 5 deletions.
33 changes: 28 additions & 5 deletions src/libsync/propagatedownload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <QFileInfo>
#include <QDir>
#include <cmath>
#include <optional>

#ifdef Q_OS_UNIX
#include <unistd.h>
Expand Down Expand Up @@ -290,12 +291,29 @@ qint64 GETFileJob::writeToDevice(const QByteArray &data)
return _device->write(data);
}

bool GETFileJob::writeSymlink(const QString &symlinkTarget)
{
auto file_device = qobject_cast<QFile*>(_device);
if (!file_device) {
qCWarning(lcGetJob) << "Unable to create symlink on given device!";
return false;
}
file_device->close();
FileSystem::remove(file_device->fileName());
if (!QFile::link(symlinkTarget, file_device->fileName())) {
qCWarning(lcGetJob) << "Error creating symlink '" << file_device->fileName() << '\'';
return false;
}
return true;
}

void GETFileJob::slotReadyRead()
{
if (!reply())
return;
int bufferSize = qMin(1024 * 8ll, reply()->bytesAvailable());
QByteArray buffer(bufferSize, Qt::Uninitialized);
std::optional<QString> symlinkTarget;

while (reply()->bytesAvailable() > 0 && _saveBodyToFile) {
if (_bandwidthChoked) {
Expand Down Expand Up @@ -323,11 +341,11 @@ void GETFileJob::slotReadyRead()

if (reply()->hasRawHeader("OC-File-Type") &&
reply()->rawHeader("OC-File-Type").toInt() == ItemTypeSoftLink) {
// TODO: handle non-Unix OS
auto file_device = static_cast<QFile*>(_device);
file_device->close();
FileSystem::remove(file_device->fileName());
QFile::link(QString(buffer), file_device->fileName());
if (symlinkTarget) {
*symlinkTarget += buffer;
} else {
symlinkTarget = buffer;
}
} else {
const qint64 writtenBytes = writeToDevice(QByteArray::fromRawData(buffer.constData(), readBytes));
if (writtenBytes != readBytes) {
Expand All @@ -340,6 +358,11 @@ void GETFileJob::slotReadyRead()
}
}

if (symlinkTarget && !writeSymlink(*symlinkTarget)) {
reply()->abort();
return;
}

if (reply()->isFinished() && (reply()->bytesAvailable() == 0 || !_saveBodyToFile)) {
qCDebug(lcGetJob) << "Actually finished!";
if (_bandwidthManager) {
Expand Down
1 change: 1 addition & 0 deletions src/libsync/propagatedownload.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ class OWNCLOUDSYNC_EXPORT GETFileJob : public AbstractNetworkJob

protected:
virtual qint64 writeToDevice(const QByteArray &data);
virtual bool writeSymlink(const QString &symlinkTarget);

signals:
void finishedSignal();
Expand Down

0 comments on commit 1c9112a

Please sign in to comment.