mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-28 19:58:56 +03:00
Merge pull request #4191 from nextcloud/bugfix/cfapiDehydrateProperly
use proper API to dehydrate a placeholder file
This commit is contained in:
commit
fbc89a3149
3 changed files with 43 additions and 17 deletions
|
@ -740,6 +740,38 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> OCC::CfApiWrapper::up
|
||||||
return OCC::Vfs::ConvertToPlaceholderResult::Ok;
|
return OCC::Vfs::ConvertToPlaceholderResult::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> OCC::CfApiWrapper::dehydratePlaceholder(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId)
|
||||||
|
{
|
||||||
|
Q_ASSERT(handle);
|
||||||
|
|
||||||
|
if (modtime <= 0) {
|
||||||
|
return {QString{"Could not update metadata due to invalid modification time for %1: %2"}.arg(pathForHandle(handle)).arg(modtime)};
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto info = findPlaceholderInfo(handle);
|
||||||
|
if (!info) {
|
||||||
|
return { "Can't update non existing placeholder info" };
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto fileIdentity = QString::fromUtf8(fileId).toStdWString();
|
||||||
|
const auto fileIdentitySize = (fileIdentity.length() + 1) * sizeof(wchar_t);
|
||||||
|
|
||||||
|
CF_FILE_RANGE dehydrationRange;
|
||||||
|
dehydrationRange.StartingOffset.QuadPart = 0;
|
||||||
|
dehydrationRange.Length.QuadPart = size;
|
||||||
|
|
||||||
|
const qint64 result = CfUpdatePlaceholder(handle.get(), nullptr,
|
||||||
|
fileIdentity.data(), sizeToDWORD(fileIdentitySize),
|
||||||
|
&dehydrationRange, 1, CF_UPDATE_FLAG_MARK_IN_SYNC, nullptr, nullptr);
|
||||||
|
|
||||||
|
if (result != S_OK) {
|
||||||
|
qCWarning(lcCfApiWrapper) << "Couldn't update placeholder info for" << pathForHandle(handle) << ":" << QString::fromWCharArray(_com_error(result).ErrorMessage());
|
||||||
|
return { "Couldn't update placeholder info" };
|
||||||
|
}
|
||||||
|
|
||||||
|
return OCC::Vfs::ConvertToPlaceholderResult::Ok;
|
||||||
|
}
|
||||||
|
|
||||||
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> OCC::CfApiWrapper::convertToPlaceholder(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId, const QString &replacesPath)
|
OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> OCC::CfApiWrapper::convertToPlaceholder(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId, const QString &replacesPath)
|
||||||
{
|
{
|
||||||
Q_UNUSED(modtime);
|
Q_UNUSED(modtime);
|
||||||
|
|
|
@ -94,6 +94,7 @@ NEXTCLOUD_CFAPI_EXPORT Result<OCC::Vfs::ConvertToPlaceholderResult, QString> set
|
||||||
NEXTCLOUD_CFAPI_EXPORT Result<void, QString> createPlaceholderInfo(const QString &path, time_t modtime, qint64 size, const QByteArray &fileId);
|
NEXTCLOUD_CFAPI_EXPORT Result<void, QString> createPlaceholderInfo(const QString &path, time_t modtime, qint64 size, const QByteArray &fileId);
|
||||||
NEXTCLOUD_CFAPI_EXPORT Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderInfo(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId, const QString &replacesPath = QString());
|
NEXTCLOUD_CFAPI_EXPORT Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderInfo(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId, const QString &replacesPath = QString());
|
||||||
NEXTCLOUD_CFAPI_EXPORT Result<OCC::Vfs::ConvertToPlaceholderResult, QString> convertToPlaceholder(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId, const QString &replacesPath);
|
NEXTCLOUD_CFAPI_EXPORT Result<OCC::Vfs::ConvertToPlaceholderResult, QString> convertToPlaceholder(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId, const QString &replacesPath);
|
||||||
|
NEXTCLOUD_CFAPI_EXPORT Result<OCC::Vfs::ConvertToPlaceholderResult, QString> dehydratePlaceholder(const FileHandle &handle, time_t modtime, qint64 size, const QByteArray &fileId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,26 +132,19 @@ Result<void, QString> VfsCfApi::createPlaceholder(const SyncFileItem &item)
|
||||||
|
|
||||||
Result<void, QString> VfsCfApi::dehydratePlaceholder(const SyncFileItem &item)
|
Result<void, QString> VfsCfApi::dehydratePlaceholder(const SyncFileItem &item)
|
||||||
{
|
{
|
||||||
const auto previousPin = pinState(item._file);
|
const auto localPath = QDir::toNativeSeparators(_setupParams.filesystemPath + item._file);
|
||||||
|
const auto handle = cfapi::handleForPath(localPath);
|
||||||
if (!FileSystem::remove(_setupParams.filesystemPath + item._file)) {
|
if (handle) {
|
||||||
return QStringLiteral("Couldn't remove %1 to fulfill dehydration").arg(item._file);
|
auto result = cfapi::dehydratePlaceholder(handle, item._modtime, item._size, item._fileId);
|
||||||
}
|
if (result) {
|
||||||
|
|
||||||
const auto r = createPlaceholder(item);
|
|
||||||
if (!r) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (previousPin) {
|
|
||||||
if (*previousPin == PinState::AlwaysLocal) {
|
|
||||||
setPinState(item._file, PinState::Unspecified);
|
|
||||||
} else {
|
|
||||||
setPinState(item._file, *previousPin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
} else {
|
||||||
|
return result.error();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qCWarning(lcCfApi) << "Couldn't update metadata for non existing file" << localPath;
|
||||||
|
return {QStringLiteral("Couldn't update metadata")};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<Vfs::ConvertToPlaceholderResult, QString> VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
|
Result<Vfs::ConvertToPlaceholderResult, QString> VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
|
||||||
|
|
Loading…
Reference in a new issue