1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2025-05-23 11:34:06 +02:00
Nextcloud-Desktop/src/libsync/vfs/suffix/vfs_suffix.cpp
Christian Kamm 6c5fa1dadd
Vfs: dehydration is separate action
Allows for better attribute preservation.

Also add verifyFileUnchanged() call before dehydration to avoid data
loss when discovery takes a while.
2020-12-15 10:58:39 +01:00

104 lines
2.4 KiB
C++

/*
* Copyright (C) by Christian Kamm <mail@ckamm.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "vfs_suffix.h"
#include <QFile>
#include "syncfileitem.h"
#include "filesystem.h"
namespace OCC {
VfsSuffix::VfsSuffix(QObject *parent)
: VfsDefaults(parent)
{
}
VfsSuffix::~VfsSuffix()
{
}
Vfs::Mode VfsSuffix::mode() const
{
return WithSuffix;
}
QString VfsSuffix::fileSuffix() const
{
return QStringLiteral(APPLICATION_DOTVIRTUALFILE_SUFFIX);
}
void VfsSuffix::stop()
{
}
void VfsSuffix::unregisterFolder()
{
}
bool VfsSuffix::isHydrating() const
{
return false;
}
bool VfsSuffix::updateMetadata(const QString &filePath, time_t modtime, quint64, const QByteArray &, QString *)
{
FileSystem::setModTime(filePath, modtime);
return true;
}
void VfsSuffix::createPlaceholder(const SyncFileItem &item)
{
// The concrete shape of the placeholder is also used in isDehydratedPlaceholder() below
QString fn = _setupParams.filesystemPath + item._file;
QFile file(fn);
file.open(QFile::ReadWrite | QFile::Truncate);
file.write(" ");
file.close();
FileSystem::setModTime(fn, item._modtime);
}
void VfsSuffix::dehydratePlaceholder(const SyncFileItem &item)
{
QFile::remove(_setupParams.filesystemPath + item._file);
SyncFileItem virtualItem(item);
virtualItem._file.append(fileSuffix());
createPlaceholder(virtualItem);
}
void VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
{
// Nothing necessary
}
bool VfsSuffix::isDehydratedPlaceholder(const QString &filePath)
{
if (!filePath.endsWith(fileSuffix()))
return false;
QFileInfo fi(filePath);
return fi.exists() && fi.size() == 1;
}
bool VfsSuffix::statTypeVirtualFile(csync_file_stat_t *stat, void *)
{
if (stat->path.endsWith(fileSuffix().toUtf8())) {
stat->type = ItemTypeVirtualFile;
return true;
}
return false;
}
} // namespace OCC