Fix Explorer integration re-save (fixes issue #1807)
authorMichael Schuster <michael@schuster.ms>
Sun, 1 Mar 2020 02:39:24 +0000 (03:39 +0100)
committerMichael Schuster <michael@schuster.ms>
Sun, 1 Mar 2020 02:39:24 +0000 (03:39 +0100)
Signed-off-by: Michael Schuster <michael@schuster.ms>
src/gui/navigationpanehelper.cpp

index d23b17463644daafb6028a3488ad022ff16be6b7..149e43eea9d72a57fcadcae1f82a16e9983ea7c2 100644 (file)
@@ -79,75 +79,78 @@ void NavigationPaneHelper::updateCloudStorageRegistry()
         });
 #endif
 
-    // Then re-save every folder that has a valid navigationPaneClsid to the registry.
-    // We currently don't distinguish between new and existing CLSIDs, if it's there we just
-    // save over it. We at least need to update the tile in case we are suddently using multiple accounts.
-    foreach (Folder *folder, _folderMan->map()) {
-        if (!folder->navigationPaneClsid().isNull()) {
-            // If it already exists, unmark it for removal, this is a valid sync root.
-            entriesToRemove.removeOne(folder->navigationPaneClsid());
-
-            QString clsidStr = folder->navigationPaneClsid().toString();
-            QString clsidPath = QString() % "Software\\Classes\\CLSID\\" % clsidStr;
-            QString clsidPathWow64 = QString() % "Software\\Classes\\Wow6432Node\\CLSID\\" % clsidStr;
-            QString namespacePath = QString() % "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\" % clsidStr;
-
-            QString title = folder->shortGuiRemotePathOrAppName();
-            // Write the account name in the sidebar only when using more than one account.
-            if (AccountManager::instance()->accounts().size() > 1)
-                title = title % " - " % folder->accountState()->account()->displayName();
-            QString iconPath = QDir::toNativeSeparators(qApp->applicationFilePath());
-            QString targetFolderPath = QDir::toNativeSeparators(folder->cleanPath());
-
-            qCInfo(lcNavPane) << "Explorer Cloud storage provider: saving path" << targetFolderPath << "to CLSID" << clsidStr;
+    // Only save folder entries if the option is enabled.
+    if (_showInExplorerNavigationPane) {
+        // Then re-save every folder that has a valid navigationPaneClsid to the registry.
+        // We currently don't distinguish between new and existing CLSIDs, if it's there we just
+        // save over it. We at least need to update the tile in case we are suddently using multiple accounts.
+        foreach (Folder *folder, _folderMan->map()) {
+            if (!folder->navigationPaneClsid().isNull()) {
+                // If it already exists, unmark it for removal, this is a valid sync root.
+                entriesToRemove.removeOne(folder->navigationPaneClsid());
+
+                QString clsidStr = folder->navigationPaneClsid().toString();
+                QString clsidPath = QString() % "Software\\Classes\\CLSID\\" % clsidStr;
+                QString clsidPathWow64 = QString() % "Software\\Classes\\Wow6432Node\\CLSID\\" % clsidStr;
+                QString namespacePath = QString() % "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\" % clsidStr;
+
+                QString title = folder->shortGuiRemotePathOrAppName();
+                // Write the account name in the sidebar only when using more than one account.
+                if (AccountManager::instance()->accounts().size() > 1)
+                    title = title % " - " % folder->accountState()->account()->displayName();
+                QString iconPath = QDir::toNativeSeparators(qApp->applicationFilePath());
+                QString targetFolderPath = QDir::toNativeSeparators(folder->cleanPath());
+
+                qCInfo(lcNavPane) << "Explorer Cloud storage provider: saving path" << targetFolderPath << "to CLSID" << clsidStr;
 #ifdef Q_OS_WIN
-            // Steps taken from: https://msdn.microsoft.com/en-us/library/windows/desktop/dn889934%28v=vs.85%29.aspx
-            // Step 1: Add your CLSID and name your extension
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QString(), REG_SZ, title);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QString(), REG_SZ, title);
-            // Step 2: Set the image for your icon
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\DefaultIcon"), QString(), REG_SZ, iconPath);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\DefaultIcon"), QString(), REG_SZ, iconPath);
-            // Step 3: Add your extension to the Navigation Pane and make it visible
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QStringLiteral("System.IsPinnedToNameSpaceTree"), REG_DWORD, 0x1);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QStringLiteral("System.IsPinnedToNameSpaceTree"), REG_DWORD, 0x1);
-            // Step 4: Set the location for your extension in the Navigation Pane
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QStringLiteral("SortOrderIndex"), REG_DWORD, 0x41);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QStringLiteral("SortOrderIndex"), REG_DWORD, 0x41);
-            // Step 5: Provide the dll that hosts your extension.
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\InProcServer32"), QString(), REG_EXPAND_SZ, QStringLiteral("%systemroot%\\system32\\shell32.dll"));
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\InProcServer32"), QString(), REG_EXPAND_SZ, QStringLiteral("%systemroot%\\system32\\shell32.dll"));
-            // Step 6: Define the instance object
-            // Indicate that your namespace extension should function like other file folder structures in File Explorer.
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance"), QStringLiteral("CLSID"), REG_SZ, QStringLiteral("{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"));
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance"), QStringLiteral("CLSID"), REG_SZ, QStringLiteral("{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"));
-            // Step 7: Provide the file system attributes of the target folder
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("Attributes"), REG_DWORD, 0x11);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("Attributes"), REG_DWORD, 0x11);
-            // Step 8: Set the path for the sync root
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("TargetFolderPath"), REG_SZ, targetFolderPath);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("TargetFolderPath"), REG_SZ, targetFolderPath);
-            // Step 9: Set appropriate shell flags
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\ShellFolder"), QStringLiteral("FolderValueFlags"), REG_DWORD, 0x28);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\ShellFolder"), QStringLiteral("FolderValueFlags"), REG_DWORD, 0x28);
-            // Step 10: Set the appropriate flags to control your shell behavior
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\ShellFolder"), QStringLiteral("Attributes"), REG_DWORD, 0xF080004D);
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\ShellFolder"), QStringLiteral("Attributes"), REG_DWORD, 0xF080004D);
-            // Step 11: Register your extension in the namespace root
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, namespacePath, QString(), REG_SZ, title);
-            // Step 12: Hide your extension from the Desktop
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, QStringLiteral("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel"), clsidStr, REG_DWORD, 0x1);
-
-            // For us, to later be able to iterate and find our own namespace entries and associated CLSID.
-            // Use the macro instead of the theme to make sure it matches with the uninstaller.
-            Utility::registrySetKeyValue(HKEY_CURRENT_USER, namespacePath, QStringLiteral("ApplicationName"), REG_SZ, QLatin1String(APPLICATION_NAME));
+                // Steps taken from: https://msdn.microsoft.com/en-us/library/windows/desktop/dn889934%28v=vs.85%29.aspx
+                // Step 1: Add your CLSID and name your extension
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QString(), REG_SZ, title);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QString(), REG_SZ, title);
+                // Step 2: Set the image for your icon
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\DefaultIcon"), QString(), REG_SZ, iconPath);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\DefaultIcon"), QString(), REG_SZ, iconPath);
+                // Step 3: Add your extension to the Navigation Pane and make it visible
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QStringLiteral("System.IsPinnedToNameSpaceTree"), REG_DWORD, 0x1);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QStringLiteral("System.IsPinnedToNameSpaceTree"), REG_DWORD, 0x1);
+                // Step 4: Set the location for your extension in the Navigation Pane
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath, QStringLiteral("SortOrderIndex"), REG_DWORD, 0x41);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64, QStringLiteral("SortOrderIndex"), REG_DWORD, 0x41);
+                // Step 5: Provide the dll that hosts your extension.
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\InProcServer32"), QString(), REG_EXPAND_SZ, QStringLiteral("%systemroot%\\system32\\shell32.dll"));
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\InProcServer32"), QString(), REG_EXPAND_SZ, QStringLiteral("%systemroot%\\system32\\shell32.dll"));
+                // Step 6: Define the instance object
+                // Indicate that your namespace extension should function like other file folder structures in File Explorer.
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance"), QStringLiteral("CLSID"), REG_SZ, QStringLiteral("{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"));
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance"), QStringLiteral("CLSID"), REG_SZ, QStringLiteral("{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"));
+                // Step 7: Provide the file system attributes of the target folder
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("Attributes"), REG_DWORD, 0x11);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("Attributes"), REG_DWORD, 0x11);
+                // Step 8: Set the path for the sync root
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("TargetFolderPath"), REG_SZ, targetFolderPath);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\Instance\\InitPropertyBag"), QStringLiteral("TargetFolderPath"), REG_SZ, targetFolderPath);
+                // Step 9: Set appropriate shell flags
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\ShellFolder"), QStringLiteral("FolderValueFlags"), REG_DWORD, 0x28);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\ShellFolder"), QStringLiteral("FolderValueFlags"), REG_DWORD, 0x28);
+                // Step 10: Set the appropriate flags to control your shell behavior
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPath + QStringLiteral("\\ShellFolder"), QStringLiteral("Attributes"), REG_DWORD, 0xF080004D);
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, clsidPathWow64 + QStringLiteral("\\ShellFolder"), QStringLiteral("Attributes"), REG_DWORD, 0xF080004D);
+                // Step 11: Register your extension in the namespace root
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, namespacePath, QString(), REG_SZ, title);
+                // Step 12: Hide your extension from the Desktop
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, QStringLiteral("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel"), clsidStr, REG_DWORD, 0x1);
+
+                // For us, to later be able to iterate and find our own namespace entries and associated CLSID.
+                // Use the macro instead of the theme to make sure it matches with the uninstaller.
+                Utility::registrySetKeyValue(HKEY_CURRENT_USER, namespacePath, QStringLiteral("ApplicationName"), REG_SZ, QLatin1String(APPLICATION_NAME));
 #else
-            // This code path should only occur on Windows (the config will be false, and the checkbox invisible on other platforms).
-            // Add runtime checks rather than #ifdefing out the whole code to help catch breakages when developing on other platforms.
+                // This code path should only occur on Windows (the config will be false, and the checkbox invisible on other platforms).
+                // Add runtime checks rather than #ifdefing out the whole code to help catch breakages when developing on other platforms.
 
-            // Don't crash, by any means!
-            // Q_ASSERT(false);
+                // Don't crash, by any means!
+                // Q_ASSERT(false);
 #endif
+            }
         }
     }