Skip to content

Commit

Permalink
Merge pull request #7670 from nextcloud/bugfix/lnkFolderVirtualFiles
Browse files Browse the repository at this point in the history
Bugfix/lnk folder virtual files
  • Loading branch information
mgallien authored Dec 16, 2024
2 parents fbce101 + 5d2ee18 commit 045bc72
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 13 deletions.
31 changes: 19 additions & 12 deletions src/libsync/vfs/cfapi/cfapiwrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,8 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderStat
OCC::Utility::UnixTimeToLargeIntegerFiletime(modtime, &metadata.BasicInfo.ChangeTime);
metadata.BasicInfo.FileAttributes = 0;

OCC::CfApiWrapper::setPinState(path, OCC::PinState::Unspecified, OCC::CfApiWrapper::SetPinRecurseMode::NoRecurse);

qCInfo(lcCfApiWrapper) << "updatePlaceholderState" << path << modtime;
const qint64 result = CfUpdatePlaceholder(OCC::CfApiWrapper::handleForPath(path).get(), updateType == CfApiUpdateMetadataType::AllMetadata ? &metadata : nullptr,
fileIdentity.data(), sizeToDWORD(fileIdentitySize),
Expand All @@ -345,7 +347,7 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> updatePlaceholderStat
return errorMessage;
}

// Pin state tends to be lost on updates, so restore it every time
// Pin state tends to be lost on updates, so restore it every time
if (!setPinState(path, previousPinState, OCC::CfApiWrapper::NoRecurse)) {
return { "Couldn't restore pin state" };
}
Expand Down Expand Up @@ -591,7 +593,7 @@ bool createSyncRootRegistryKeys(const QString &providerName, const QString &fold
{ providerSyncRootIdRegistryKey, QStringLiteral("NamespaceCLSID"), REG_SZ, QString(navigationPaneClsid)}
};

for (const auto &registryKeyToSet : qAsConst(registryKeysToSet)) {
for (const auto &registryKeyToSet : std::as_const(registryKeysToSet)) {
if (!OCC::Utility::registrySetKeyValue(HKEY_LOCAL_MACHINE, registryKeyToSet.subKey, registryKeyToSet.valueName, registryKeyToSet.type, registryKeyToSet.value)) {
qCWarning(lcCfApiWrapper) << "Failed to set Registry keys for shell integration. Progress bar will not work.";
const auto deleteKeyResult = OCC::Utility::registryDeleteKeyTree(HKEY_LOCAL_MACHINE, providerSyncRootIdRegistryKey);
Expand Down Expand Up @@ -906,16 +908,21 @@ OCC::Result<OCC::Vfs::ConvertToPlaceholderResult, QString> OCC::CfApiWrapper::de

const auto info = findPlaceholderInfo(path);
if (info) {
LARGE_INTEGER largeStart, largeSize;
largeStart.QuadPart = 0;
largeSize.QuadPart = size;

const qint64 result = CfDehydratePlaceholder(handleForPath(path).get(),
largeStart,
largeSize,
CF_DEHYDRATE_FLAG_NONE,
0);

setPinState(path, OCC::PinState::OnlineOnly, OCC::CfApiWrapper::NoRecurse);

CF_FILE_RANGE dehydrationRange;
dehydrationRange.StartingOffset.QuadPart = 0;
dehydrationRange.Length.QuadPart = size;

const qint64 result = CfUpdatePlaceholder(handleForPath(path).get(),
nullptr,
fileIdentity.data(),
sizeToDWORD(fileIdentitySize),
&dehydrationRange,
1,
CF_UPDATE_FLAG_MARK_IN_SYNC | CF_UPDATE_FLAG_DEHYDRATE,
nullptr,
nullptr);
if (result != S_OK) {
const auto errorMessage = createErrorMessageForPlaceholderUpdateAndCreate(path, "Couldn't update placeholder info");
qCWarning(lcCfApiWrapper) << errorMessage << path << ":" << QString::fromWCharArray(_com_error(result).ErrorMessage());
Expand Down
2 changes: 1 addition & 1 deletion test/testsynccfapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1210,7 +1210,7 @@ private slots:
CFVERIFY_VIRTUAL(fakeFolder, "local/file1");

QCOMPARE(*vfs->pinState("online/file1"), PinState::Unspecified);
QCOMPARE(*vfs->pinState("local/file1"), PinState::Unspecified);
QCOMPARE(*vfs->pinState("local/file1"), PinState::OnlineOnly);

// no change on another sync
QVERIFY(fakeFolder.syncOnce());
Expand Down

0 comments on commit 045bc72

Please sign in to comment.