From 4b7e4af1331b733c47bf08a85fe91cbe7d772542 Mon Sep 17 00:00:00 2001 From: IT Hit Date: Wed, 23 Mar 2022 01:49:19 +0200 Subject: [PATCH] v4.2.12691.0-Beta2 --- Common/Common.csproj | 2 +- Common/Settings.cs | 5 + .../Common/Core/Common.Windows.Core.csproj | 2 +- .../Common.Windows.ShellExtension.csproj | 2 +- .../Common.Windows.VirtualDrive.csproj | 3 +- .../VirtualDrive/FullSync/FullSyncService.cs | 2 +- .../VirtualDrive/Rpc/GprcServerServiceImpl.cs | 4 +- .../Common/VirtualDrive/VirtualEngineBase.cs | 8 +- .../CustomStateProviderProxy.cs | 14 +- Windows/UserFileSystemSamples.sln | 112 +++++++++++-- .../VirtualDrive.Package/Package.appxmanifest | 2 +- .../VirtualDrive.Package.wapproj | 2 +- ...ndows.WinRT.ShellExtension.vcxproj.filters | 0 ...dows.WinRT.ShellExtension_TemporaryKey.pfx | Bin .../Common_Windows_WinRT_ShellExtension.aps | Bin ..._Windows_WinRT_ShellExtension.exe.manifest | 0 .../Common_Windows_WinRT_ShellExtension.rc | Bin .../CustomStateProvider.cpp | 10 +- .../CustomStateProvider.h | 24 +++ .../PropertySheet.props | 0 .../ShellExtensionModule.cpp | 28 ++++ ...VirtualDrive.WinRT.ShellExtension.vcxproj} | 18 +-- .../WinMain.cpp | 2 +- .../pch.cpp | 0 .../VirtualDrive.WinRT.ShellExtension}/pch.h | 0 .../readme.txt | 0 .../resource.h | 0 Windows/VirtualDrive/VirtualDrive/Program.cs | 1 + .../VirtualDrive/RemoteStorage/General.docx | Bin 11586 -> 11841 bytes .../VirtualDrive/RemoteStorage/Notes.txt | 2 +- .../VirtualDrive/VirtualEngine.cs | 12 +- .../VirtualDrive/VirtualDrive/VirtualFile.cs | 20 +-- .../VirtualDrive/VirtualFolder.cs | 16 +- .../VirtualDrive/appsettings.json | 5 +- Windows/VirtualFileSystem/Program.cs | 3 +- Windows/VirtualFileSystem/VirtualEngine.cs | 6 +- Windows/VirtualFileSystem/appsettings.json | 5 +- .../WebDAVDrive.Package/Package.appxmanifest | 10 +- .../WebDAVDrive.Package.wapproj | 1 + ...ndows.WinRT.ShellExtension.vcxproj.filters | 64 ++++++++ ...dows.WinRT.ShellExtension_TemporaryKey.pfx | Bin 0 -> 2520 bytes .../Common_Windows_WinRT_ShellExtension.aps | Bin 0 -> 1476 bytes ..._Windows_WinRT_ShellExtension.exe.manifest | 16 ++ .../Common_Windows_WinRT_ShellExtension.rc | Bin 0 -> 2664 bytes .../CustomStateProvider.cpp | 40 +++++ .../CustomStateProvider.h | 3 +- .../PropertySheet.props | 16 ++ .../ShellExtensionModule.cpp | 13 +- .../WebDAVDrive.WinRT.ShellExtension.vcxproj | 148 ++++++++++++++++++ .../WinMain.cpp | 69 ++++++++ .../WebDAVDrive.WinRT.ShellExtension/pch.cpp | 1 + .../WebDAVDrive.WinRT.ShellExtension/pch.h | 24 +++ .../resource.h | 13 ++ .../WebDAVDrive/WebDAVDrive/Images/Empty.ico | Bin 0 -> 293207 bytes Windows/WebDAVDrive/WebDAVDrive/Program.cs | 1 + .../WebDAVDrive/WebDAVDrive/VirtualEngine.cs | 10 +- .../WebDAVDrive/WebDAVDrive/VirtualFolder.cs | 2 +- .../WebDAVDrive/WebDAVDrive.csproj | 3 + .../WebDAVDrive/WebDAVDrive/appsettings.json | 5 +- 59 files changed, 661 insertions(+), 88 deletions(-) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/Common.Windows.WinRT.ShellExtension.vcxproj.filters (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/Common_Windows_WinRT_ShellExtension.aps (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/Common_Windows_WinRT_ShellExtension.exe.manifest (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/Common_Windows_WinRT_ShellExtension.rc (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/CustomStateProvider.cpp (76%) create mode 100644 Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.h rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/PropertySheet.props (100%) create mode 100644 Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/ShellExtensionModule.cpp rename Windows/{Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj => VirtualDrive/VirtualDrive.WinRT.ShellExtension/VirtualDrive.WinRT.ShellExtension.vcxproj} (92%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/WinMain.cpp (95%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/pch.cpp (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/pch.h (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/readme.txt (100%) rename Windows/{Common/WinRT.ShellExtension => VirtualDrive/VirtualDrive.WinRT.ShellExtension}/resource.h (100%) create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.cpp rename Windows/{Common/WinRT.ShellExtension => WebDAVDrive/WebDAVDrive.WinRT.ShellExtension}/CustomStateProvider.h (80%) create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/PropertySheet.props rename Windows/{Common/WinRT.ShellExtension => WebDAVDrive/WebDAVDrive.WinRT.ShellExtension}/ShellExtensionModule.cpp (51%) create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WebDAVDrive.WinRT.ShellExtension.vcxproj create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WinMain.cpp create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.cpp create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.h create mode 100644 Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/resource.h create mode 100644 Windows/WebDAVDrive/WebDAVDrive/Images/Empty.ico diff --git a/Common/Common.csproj b/Common/Common.csproj index 398eef2..0797f49 100644 --- a/Common/Common.csproj +++ b/Common/Common.csproj @@ -9,6 +9,6 @@ ITHit.FileSystem.Samples.Common - + \ No newline at end of file diff --git a/Common/Settings.cs b/Common/Settings.cs index 8bfc451..3130a78 100644 --- a/Common/Settings.cs +++ b/Common/Settings.cs @@ -58,5 +58,10 @@ public class Settings /// Communication channel name is used by RPC to establish connection over named pipes. /// public string RpcCommunicationChannelName { get; set; } + + /// + /// Gets or sets the maximum number of concurrent tasks + /// + public int MaxDegreeOfParallelism { get; set; } } } diff --git a/Windows/Common/Core/Common.Windows.Core.csproj b/Windows/Common/Core/Common.Windows.Core.csproj index 4e736a8..65a3c80 100644 --- a/Windows/Common/Core/Common.Windows.Core.csproj +++ b/Windows/Common/Core/Common.Windows.Core.csproj @@ -14,7 +14,7 @@ - + \ No newline at end of file diff --git a/Windows/Common/ShellExtension/Common.Windows.ShellExtension.csproj b/Windows/Common/ShellExtension/Common.Windows.ShellExtension.csproj index 868994f..bf933aa 100644 --- a/Windows/Common/ShellExtension/Common.Windows.ShellExtension.csproj +++ b/Windows/Common/ShellExtension/Common.Windows.ShellExtension.csproj @@ -20,7 +20,7 @@ - + diff --git a/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj b/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj index 40e33b2..23f8cd3 100644 --- a/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj +++ b/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj @@ -13,6 +13,7 @@ + @@ -22,7 +23,7 @@ - + diff --git a/Windows/Common/VirtualDrive/FullSync/FullSyncService.cs b/Windows/Common/VirtualDrive/FullSync/FullSyncService.cs index eecaa0f..415516b 100644 --- a/Windows/Common/VirtualDrive/FullSync/FullSyncService.cs +++ b/Windows/Common/VirtualDrive/FullSync/FullSyncService.cs @@ -117,7 +117,7 @@ private async void Timer_ElapsedAsync(object sender, System.Timers.ElapsedEventA InvokeSyncEvent(SynchronizationState.Synchronizing); // UFS -> RS. Recursivery synchronize all updated/created file and folders present in the user file system. - await new ClientToServerSync(engine, Log).SyncronizeFolderAsync(userFileSystemRootPath); + //await new ClientToServerSync(engine, Log).SyncronizeFolderAsync(userFileSystemRootPath); // UFS <- RS. Recursivery synchronize all updated/created/deleted file and folders present in the user file system. //await new ServerToClientSync(engine, Log).SyncronizeFolderAsync(userFileSystemRootPath); diff --git a/Windows/Common/VirtualDrive/Rpc/GprcServerServiceImpl.cs b/Windows/Common/VirtualDrive/Rpc/GprcServerServiceImpl.cs index b67eeeb..0ea9281 100644 --- a/Windows/Common/VirtualDrive/Rpc/GprcServerServiceImpl.cs +++ b/Windows/Common/VirtualDrive/Rpc/GprcServerServiceImpl.cs @@ -40,7 +40,7 @@ public override async Task SetLockStatus(ItemsStatusList request, string filePath = pair.Key; bool fileStatus = pair.Value; - IClientNotificationsWindows clientNotifications = engine.ClientNotifications(filePath); + IClientNotifications clientNotifications = engine.ClientNotifications(filePath); if (fileStatus) await clientNotifications.LockAsync(); else @@ -71,7 +71,7 @@ public override async Task GetLockStatus(ItemsPathList request, foreach (string filePath in request.Files) { - IClientNotificationsWindows clientNotifications = engine.ClientNotifications(filePath); + IClientNotifications clientNotifications = engine.ClientNotifications(filePath); LockMode lockMode = await clientNotifications.GetLockModeAsync(); bool lockStatus = lockMode != LockMode.None; diff --git a/Windows/Common/VirtualDrive/VirtualEngineBase.cs b/Windows/Common/VirtualDrive/VirtualEngineBase.cs index f2fb4e8..172ef00 100644 --- a/Windows/Common/VirtualDrive/VirtualEngineBase.cs +++ b/Windows/Common/VirtualDrive/VirtualEngineBase.cs @@ -53,6 +53,7 @@ public abstract class VirtualEngineBase : EngineWindows /// Path to the icons folder. /// Channel name to communicate with Windows Explorer context menu and other components on this machine. /// Full synchronization interval in milliseconds. + /// A maximum number of concurrent tasks. /// Log4net logger. public VirtualEngineBase( string license, @@ -61,8 +62,9 @@ public VirtualEngineBase( string iconsFolderPath, string rpcCommunicationChannelName, double syncIntervalMs, + int maxDegreeOfParallelism, ILog log4net) - : base(license, userFileSystemRootPath) + : base(license, userFileSystemRootPath, maxDegreeOfParallelism) { logger = new Logger("File System Engine", log4net) ?? throw new NullReferenceException(nameof(log4net)); this.iconsFolderPath = iconsFolderPath ?? throw new NullReferenceException(nameof(iconsFolderPath)); @@ -120,9 +122,9 @@ public override async Task FilterAsync(OperationType operationType, string } /// - public override async Task StartAsync() + public override async Task StartAsync(bool processModified = true) { - await base.StartAsync(); + await base.StartAsync(processModified); //RemoteStorageMonitor.Start(); //await SyncService.StartAsync(); grpcServer.Start(); diff --git a/Windows/Common/WinRT.ShellExtension.Rpc/CustomStateProviderProxy.cs b/Windows/Common/WinRT.ShellExtension.Rpc/CustomStateProviderProxy.cs index 6de5b47..a14f1bc 100644 --- a/Windows/Common/WinRT.ShellExtension.Rpc/CustomStateProviderProxy.cs +++ b/Windows/Common/WinRT.ShellExtension.Rpc/CustomStateProviderProxy.cs @@ -13,13 +13,14 @@ namespace CommonShellExtensionRpc { public sealed class CustomStateProviderProxy { - public ItemProperty[] GetItemProperties(string itemPath) + public ItemProperty[] GetItemProperties(string itemPath, bool virtualDrivePlatform) { - GrpcClient grpcClient = new GrpcClient("VirtualDrive.RPC"); + string channelName = virtualDrivePlatform ? "VirtualDrive.RPC" : "WebDAVDrive.RPC"; + + GrpcClient grpcClient = new GrpcClient(channelName); try { - ItemPropertyRequest request = new() { Path = itemPath @@ -29,7 +30,7 @@ public ItemProperty[] GetItemProperties(string itemPath) return itemPropertyResult .Properties - .Select(i => new ItemProperty(i.Id, i.Value, i.IconResource)) + .Select(i => new ItemProperty(i.Id, ValueValidator(i.Value), i.IconResource)) .ToArray(); } @@ -46,5 +47,10 @@ public ItemProperty[] GetItemProperties(string itemPath) return new ItemProperty[] { }; } } + + private string ValueValidator(string val) + { + return string.IsNullOrWhiteSpace(val) ? "n/a" : val; + } } } diff --git a/Windows/UserFileSystemSamples.sln b/Windows/UserFileSystemSamples.sln index ac9b12d..6308b25 100644 --- a/Windows/UserFileSystemSamples.sln +++ b/Windows/UserFileSystemSamples.sln @@ -37,20 +37,24 @@ Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "WebDAVDrive.Package", "WebD EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebDAVDrive.ShellExtension", "WebDAVDrive\WebDAVDrive.ShellExtension\WebDAVDrive.ShellExtension.csproj", "{2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common.Windows.WinRT.ShellExtension", "Common\WinRT.ShellExtension\Common.Windows.WinRT.ShellExtension.vcxproj", "{98E623B9-BCAB-48D2-80A2-1D7AADE897D6}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommonShellExtensionRpc", "Common\WinRT.ShellExtension.Rpc\CommonShellExtensionRpc.csproj", "{8EA7BABA-FC44-4074-86CB-88B8F42CA055}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VirtualDrive.WinRT.ShellExtension", "VirtualDrive\VirtualDrive.WinRT.ShellExtension\VirtualDrive.WinRT.ShellExtension.vcxproj", "{98E623B9-BCAB-48D2-80A2-1D7AADE897D6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebDAVDrive.WinRT.ShellExtension", "WebDAVDrive\WebDAVDrive.WinRT.ShellExtension\WebDAVDrive.WinRT.ShellExtension.vcxproj", "{5730488F-9F58-4951-9502-49A5A9A42B07}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {C624F9B5-3EA1-416C-8592-37E6064C8247}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -61,6 +65,8 @@ Global {C624F9B5-3EA1-416C-8592-37E6064C8247}.Debug|ARM64.Build.0 = Debug|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Debug|x64.ActiveCfg = Debug|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Debug|x64.Build.0 = Debug|Any CPU + {C624F9B5-3EA1-416C-8592-37E6064C8247}.Debug|x86.ActiveCfg = Debug|Any CPU + {C624F9B5-3EA1-416C-8592-37E6064C8247}.Debug|x86.Build.0 = Debug|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|Any CPU.ActiveCfg = Release|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|Any CPU.Build.0 = Release|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|ARM.ActiveCfg = Release|Any CPU @@ -69,6 +75,8 @@ Global {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|ARM64.Build.0 = Release|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|x64.ActiveCfg = Release|Any CPU {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|x64.Build.0 = Release|Any CPU + {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|x86.ActiveCfg = Release|Any CPU + {C624F9B5-3EA1-416C-8592-37E6064C8247}.Release|x86.Build.0 = Release|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|Any CPU.Build.0 = Debug|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -77,6 +85,8 @@ Global {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|ARM64.Build.0 = Debug|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|x64.ActiveCfg = Debug|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|x64.Build.0 = Debug|Any CPU + {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|x86.ActiveCfg = Debug|Any CPU + {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Debug|x86.Build.0 = Debug|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|Any CPU.ActiveCfg = Release|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|Any CPU.Build.0 = Release|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|ARM.ActiveCfg = Release|Any CPU @@ -85,6 +95,8 @@ Global {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|ARM64.Build.0 = Release|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|x64.ActiveCfg = Release|Any CPU {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|x64.Build.0 = Release|Any CPU + {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|x86.ActiveCfg = Release|Any CPU + {51F6CFCC-AB57-40DD-AADA-6299A2C6B941}.Release|x86.Build.0 = Release|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|Any CPU.ActiveCfg = Debug|x64 {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|Any CPU.Build.0 = Debug|x64 {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -93,6 +105,8 @@ Global {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|ARM64.Build.0 = Debug|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|x64.ActiveCfg = Debug|x64 {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|x64.Build.0 = Debug|x64 + {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|x86.ActiveCfg = Debug|Any CPU + {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Debug|x86.Build.0 = Debug|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|Any CPU.ActiveCfg = Release|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|Any CPU.Build.0 = Release|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|ARM.ActiveCfg = Release|Any CPU @@ -101,6 +115,8 @@ Global {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|ARM64.Build.0 = Release|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|x64.ActiveCfg = Release|Any CPU {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|x64.Build.0 = Release|Any CPU + {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|x86.ActiveCfg = Release|Any CPU + {648FB01F-0C4A-409E-A48A-E6722F626AB8}.Release|x86.Build.0 = Release|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|Any CPU.ActiveCfg = Debug|x64 {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|Any CPU.Build.0 = Debug|x64 {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -109,6 +125,8 @@ Global {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|ARM64.Build.0 = Debug|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|x64.ActiveCfg = Debug|x64 {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|x64.Build.0 = Debug|x64 + {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E765516-497B-4546-8C38-DB452915ACBF}.Debug|x86.Build.0 = Debug|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Release|Any CPU.Build.0 = Release|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Release|ARM.ActiveCfg = Release|Any CPU @@ -117,6 +135,8 @@ Global {1E765516-497B-4546-8C38-DB452915ACBF}.Release|ARM64.Build.0 = Release|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Release|x64.ActiveCfg = Release|Any CPU {1E765516-497B-4546-8C38-DB452915ACBF}.Release|x64.Build.0 = Release|Any CPU + {1E765516-497B-4546-8C38-DB452915ACBF}.Release|x86.ActiveCfg = Release|Any CPU + {1E765516-497B-4546-8C38-DB452915ACBF}.Release|x86.Build.0 = Release|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|Any CPU.Build.0 = Debug|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -125,6 +145,8 @@ Global {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|ARM64.Build.0 = Debug|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|x64.ActiveCfg = Debug|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|x64.Build.0 = Debug|Any CPU + {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|x86.ActiveCfg = Debug|Any CPU + {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Debug|x86.Build.0 = Debug|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|Any CPU.ActiveCfg = Release|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|Any CPU.Build.0 = Release|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|ARM.ActiveCfg = Release|Any CPU @@ -133,6 +155,8 @@ Global {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|ARM64.Build.0 = Release|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|x64.ActiveCfg = Release|Any CPU {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|x64.Build.0 = Release|Any CPU + {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|x86.ActiveCfg = Release|Any CPU + {06E5D212-CAD4-4880-832D-69D8D69B8E3D}.Release|x86.Build.0 = Release|Any CPU {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|Any CPU.ActiveCfg = Debug|x64 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|Any CPU.Build.0 = Debug|x64 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|Any CPU.Deploy.0 = Debug|x64 @@ -145,6 +169,10 @@ Global {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|x64.ActiveCfg = Debug|x64 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|x64.Build.0 = Debug|x64 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|x64.Deploy.0 = Debug|x64 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|x86.ActiveCfg = Debug|x86 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|x86.Build.0 = Debug|x86 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Debug|x86.Deploy.0 = Debug|x86 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|Any CPU.ActiveCfg = Release|x86 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|ARM.ActiveCfg = Release|ARM {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|ARM.Build.0 = Release|ARM {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|ARM.Deploy.0 = Release|ARM @@ -154,6 +182,9 @@ Global {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|x64.ActiveCfg = Release|x64 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|x64.Build.0 = Release|x64 {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|x64.Deploy.0 = Release|x64 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|x86.ActiveCfg = Release|x86 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|x86.Build.0 = Release|x86 + {9CC25823-7D6C-4AAA-95A0-EE0514CCABD9}.Release|x86.Deploy.0 = Release|x86 {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|Any CPU.Build.0 = Debug|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -162,6 +193,8 @@ Global {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|ARM64.Build.0 = Debug|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|x64.ActiveCfg = Debug|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|x64.Build.0 = Debug|Any CPU + {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|x86.ActiveCfg = Debug|Any CPU + {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Debug|x86.Build.0 = Debug|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|Any CPU.Build.0 = Release|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|ARM.ActiveCfg = Release|Any CPU @@ -170,6 +203,8 @@ Global {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|ARM64.Build.0 = Release|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|x64.ActiveCfg = Release|Any CPU {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|x64.Build.0 = Release|Any CPU + {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|x86.ActiveCfg = Release|Any CPU + {AA64B9BF-C18A-4818-A260-0A32ACFCC809}.Release|x86.Build.0 = Release|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|Any CPU.Build.0 = Debug|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -178,6 +213,8 @@ Global {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|ARM64.Build.0 = Debug|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|x64.ActiveCfg = Debug|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|x64.Build.0 = Debug|Any CPU + {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|x86.ActiveCfg = Debug|Any CPU + {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Debug|x86.Build.0 = Debug|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|Any CPU.ActiveCfg = Release|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|Any CPU.Build.0 = Release|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|ARM.ActiveCfg = Release|Any CPU @@ -186,6 +223,8 @@ Global {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|ARM64.Build.0 = Release|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|x64.ActiveCfg = Release|Any CPU {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|x64.Build.0 = Release|Any CPU + {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|x86.ActiveCfg = Release|Any CPU + {D0DA8CE2-2AC3-42AE-BAF4-103E663EB70F}.Release|x86.Build.0 = Release|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|Any CPU.Build.0 = Debug|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -194,6 +233,8 @@ Global {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|ARM64.Build.0 = Debug|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|x64.ActiveCfg = Debug|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|x64.Build.0 = Debug|Any CPU + {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|x86.ActiveCfg = Debug|Any CPU + {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Debug|x86.Build.0 = Debug|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|Any CPU.ActiveCfg = Release|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|Any CPU.Build.0 = Release|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|ARM.ActiveCfg = Release|Any CPU @@ -202,6 +243,8 @@ Global {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|ARM64.Build.0 = Release|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|x64.ActiveCfg = Release|Any CPU {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|x64.Build.0 = Release|Any CPU + {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|x86.ActiveCfg = Release|Any CPU + {CEFD557A-7366-4F4B-AF2B-17C6EDDD7A27}.Release|x86.Build.0 = Release|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|Any CPU.Build.0 = Debug|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -210,6 +253,8 @@ Global {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|ARM64.Build.0 = Debug|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|x64.ActiveCfg = Debug|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|x64.Build.0 = Debug|Any CPU + {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|x86.ActiveCfg = Debug|Any CPU + {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Debug|x86.Build.0 = Debug|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|Any CPU.ActiveCfg = Release|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|Any CPU.Build.0 = Release|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|ARM.ActiveCfg = Release|Any CPU @@ -218,6 +263,8 @@ Global {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|ARM64.Build.0 = Release|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|x64.ActiveCfg = Release|Any CPU {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|x64.Build.0 = Release|Any CPU + {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|x86.ActiveCfg = Release|Any CPU + {61F4EB6E-6C70-43DB-89ED-ECABEBA4FDDE}.Release|x86.Build.0 = Release|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|Any CPU.Build.0 = Debug|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -226,6 +273,8 @@ Global {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|ARM64.Build.0 = Debug|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|x64.ActiveCfg = Debug|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|x64.Build.0 = Debug|Any CPU + {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|x86.ActiveCfg = Debug|Any CPU + {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Debug|x86.Build.0 = Debug|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|Any CPU.ActiveCfg = Release|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|Any CPU.Build.0 = Release|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|ARM.ActiveCfg = Release|Any CPU @@ -234,6 +283,8 @@ Global {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|ARM64.Build.0 = Release|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|x64.ActiveCfg = Release|Any CPU {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|x64.Build.0 = Release|Any CPU + {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|x86.ActiveCfg = Release|Any CPU + {E589600E-97A4-4B1D-8921-0CCC63B03E96}.Release|x86.Build.0 = Release|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|Any CPU.Build.0 = Debug|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -242,6 +293,8 @@ Global {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|ARM64.Build.0 = Debug|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|x64.ActiveCfg = Debug|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|x64.Build.0 = Debug|Any CPU + {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Debug|x86.Build.0 = Debug|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|Any CPU.ActiveCfg = Release|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|Any CPU.Build.0 = Release|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|ARM.ActiveCfg = Release|Any CPU @@ -250,6 +303,9 @@ Global {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|ARM64.Build.0 = Release|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|x64.ActiveCfg = Release|Any CPU {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|x64.Build.0 = Release|Any CPU + {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|x86.ActiveCfg = Release|Any CPU + {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE}.Release|x86.Build.0 = Release|Any CPU + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|Any CPU.ActiveCfg = Debug|x86 {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|ARM.ActiveCfg = Debug|ARM {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|ARM.Build.0 = Debug|ARM {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|ARM.Deploy.0 = Debug|ARM @@ -259,6 +315,10 @@ Global {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|x64.ActiveCfg = Debug|x64 {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|x64.Build.0 = Debug|x64 {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|x64.Deploy.0 = Debug|x64 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|x86.ActiveCfg = Debug|x86 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|x86.Build.0 = Debug|x86 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Debug|x86.Deploy.0 = Debug|x86 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|Any CPU.ActiveCfg = Release|x86 {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|ARM.ActiveCfg = Release|ARM {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|ARM.Build.0 = Release|ARM {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|ARM.Deploy.0 = Release|ARM @@ -268,36 +328,61 @@ Global {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|x64.ActiveCfg = Release|x64 {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|x64.Build.0 = Release|x64 {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|x64.Deploy.0 = Release|x64 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|x86.ActiveCfg = Release|x86 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|x86.Build.0 = Release|x86 + {86767A2F-1559-4DFB-925D-B8E7FCDE74CA}.Release|x86.Deploy.0 = Release|x86 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Debug|Any CPU.ActiveCfg = Debug|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Debug|ARM.ActiveCfg = Debug|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Debug|ARM64.ActiveCfg = Debug|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Debug|x64.ActiveCfg = Debug|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Debug|x64.Build.0 = Debug|x64 + {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Debug|x86.ActiveCfg = Debug|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Release|Any CPU.ActiveCfg = Release|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Release|ARM.ActiveCfg = Release|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Release|ARM64.ActiveCfg = Release|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Release|x64.ActiveCfg = Release|x64 {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Release|x64.Build.0 = Release|x64 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|ARM.ActiveCfg = Debug|Win32 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|ARM64.ActiveCfg = Debug|Win32 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|x64.ActiveCfg = Debug|x64 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|x64.Build.0 = Debug|x64 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|Any CPU.ActiveCfg = Release|Win32 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|ARM.ActiveCfg = Release|Win32 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|ARM64.ActiveCfg = Release|Win32 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|x64.ActiveCfg = Release|x64 - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|x64.Build.0 = Release|x64 + {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1}.Release|x86.ActiveCfg = Release|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Debug|Any CPU.ActiveCfg = Debug|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Debug|ARM.ActiveCfg = Debug|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Debug|ARM64.ActiveCfg = Debug|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Debug|x64.ActiveCfg = Debug|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Debug|x64.Build.0 = Debug|x64 + {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Debug|x86.ActiveCfg = Debug|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Release|Any CPU.ActiveCfg = Release|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Release|ARM.ActiveCfg = Release|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Release|ARM64.ActiveCfg = Release|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Release|x64.ActiveCfg = Release|x64 {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Release|x64.Build.0 = Release|x64 + {8EA7BABA-FC44-4074-86CB-88B8F42CA055}.Release|x86.ActiveCfg = Release|x64 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|ARM.ActiveCfg = Debug|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|ARM64.ActiveCfg = Debug|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|x64.ActiveCfg = Debug|x64 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|x64.Build.0 = Debug|x64 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|x86.ActiveCfg = Debug|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Debug|x86.Build.0 = Debug|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|Any CPU.ActiveCfg = Release|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|ARM.ActiveCfg = Release|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|ARM64.ActiveCfg = Release|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|x64.ActiveCfg = Release|x64 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|x64.Build.0 = Release|x64 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|x86.ActiveCfg = Release|Win32 + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6}.Release|x86.Build.0 = Release|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|ARM.ActiveCfg = Debug|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|ARM64.ActiveCfg = Debug|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|x64.ActiveCfg = Debug|x64 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|x64.Build.0 = Debug|x64 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|x86.ActiveCfg = Debug|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Debug|x86.Build.0 = Debug|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|Any CPU.ActiveCfg = Release|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|ARM.ActiveCfg = Release|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|ARM64.ActiveCfg = Release|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|x64.ActiveCfg = Release|x64 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|x64.Build.0 = Release|x64 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|x86.ActiveCfg = Release|Win32 + {5730488F-9F58-4951-9502-49A5A9A42B07}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -316,8 +401,9 @@ Global {C1585095-4C3B-4CD1-B8B2-ECDD378D41BE} = {F24CBDD0-7A18-43F0-BCD2-A8FD1A8A7B54} {86767A2F-1559-4DFB-925D-B8E7FCDE74CA} = {264745B0-DF86-41E1-B400-3CAA1B403830} {2EC2F0CD-4E7D-47ED-AAD0-E6DCCB5138B1} = {264745B0-DF86-41E1-B400-3CAA1B403830} - {98E623B9-BCAB-48D2-80A2-1D7AADE897D6} = {F24CBDD0-7A18-43F0-BCD2-A8FD1A8A7B54} {8EA7BABA-FC44-4074-86CB-88B8F42CA055} = {F24CBDD0-7A18-43F0-BCD2-A8FD1A8A7B54} + {98E623B9-BCAB-48D2-80A2-1D7AADE897D6} = {CAE8E8A6-2721-4C90-BCD9-F4B03C3D8F13} + {5730488F-9F58-4951-9502-49A5A9A42B07} = {264745B0-DF86-41E1-B400-3CAA1B403830} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {740A716A-38A7-46BC-A21F-18336D0023B7} diff --git a/Windows/VirtualDrive/VirtualDrive.Package/Package.appxmanifest b/Windows/VirtualDrive/VirtualDrive.Package/Package.appxmanifest index 1715856..4b253cc 100644 --- a/Windows/VirtualDrive/VirtualDrive.Package/Package.appxmanifest +++ b/Windows/VirtualDrive/VirtualDrive.Package/Package.appxmanifest @@ -68,7 +68,7 @@ - + diff --git a/Windows/VirtualDrive/VirtualDrive.Package/VirtualDrive.Package.wapproj b/Windows/VirtualDrive/VirtualDrive.Package/VirtualDrive.Package.wapproj index ec04237..1b939b9 100644 --- a/Windows/VirtualDrive/VirtualDrive.Package/VirtualDrive.Package.wapproj +++ b/Windows/VirtualDrive/VirtualDrive.Package/VirtualDrive.Package.wapproj @@ -68,8 +68,8 @@ - + True diff --git a/Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters similarity index 100% rename from Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters diff --git a/Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx similarity index 100% rename from Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx diff --git a/Windows/Common/WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps similarity index 100% rename from Windows/Common/WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps diff --git a/Windows/Common/WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest similarity index 100% rename from Windows/Common/WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest diff --git a/Windows/Common/WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc similarity index 100% rename from Windows/Common/WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc diff --git a/Windows/Common/WinRT.ShellExtension/CustomStateProvider.cpp b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.cpp similarity index 76% rename from Windows/Common/WinRT.ShellExtension/CustomStateProvider.cpp rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.cpp index b78d537..4fc4ee0 100644 --- a/Windows/Common/WinRT.ShellExtension/CustomStateProvider.cpp +++ b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.cpp @@ -1,7 +1,6 @@ #include "pch.h" #include "CustomStateProvider.h" -#include "ShellExtensionModule.h" -#include +#include "..\..\Common\WinRT.ShellExtension\ShellExtensionModule.h" namespace winrt { @@ -10,14 +9,17 @@ namespace winrt namespace winrt::CommonWindowsRtShellExtenstion::implementation { - Windows::Foundation::Collections::IIterable CustomStateProvider::GetItemProperties(hstring const& itemPath) + using namespace Windows::Foundation::Collections; + using namespace Windows::Storage::Provider; + + IIterable CustomStateProvider::GetItemProperties(hstring const& itemPath) { auto propertyVector{ winrt::single_threaded_vector() }; try { CommonShellExtensionRpc::CustomStateProviderProxy stateProviderProxy; - auto itemProperties = stateProviderProxy.GetItemProperties(itemPath); + auto itemProperties = stateProviderProxy.GetItemProperties(itemPath, true); for (const auto& itemProp : itemProperties) { diff --git a/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.h b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.h new file mode 100644 index 0000000..ade6803 --- /dev/null +++ b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/CustomStateProvider.h @@ -0,0 +1,24 @@ +#pragma once + +#include "CommonWindowsRtShellExtenstion.CustomStateProvider.g.h" +#include + +// 000562AA-2879-4CF1-89E8-0AEC9596FE19 +constexpr CLSID CLSID_CustomStateProviderVirtualDrive = { 0x562aa, 0x2879, 0x4cf1, { 0x89, 0xe8, 0xa, 0xec, 0x95, 0x96, 0xfe, 0x19 } }; + +namespace winrt::CommonWindowsRtShellExtenstion::implementation +{ + struct CustomStateProvider : CustomStateProviderT + { + CustomStateProvider() = default; + + Windows::Foundation::Collections::IIterable GetItemProperties(_In_ hstring const& itemPath); + }; +} + +namespace winrt::CommonWindowsRtShellExtenstion::factory_implementation +{ + struct CustomStateProvider : CustomStateProviderT + { + }; +} diff --git a/Windows/Common/WinRT.ShellExtension/PropertySheet.props b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/PropertySheet.props similarity index 100% rename from Windows/Common/WinRT.ShellExtension/PropertySheet.props rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/PropertySheet.props diff --git a/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/ShellExtensionModule.cpp b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/ShellExtensionModule.cpp new file mode 100644 index 0000000..f2814b0 --- /dev/null +++ b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/ShellExtensionModule.cpp @@ -0,0 +1,28 @@ +#include "pch.h" +#include "..\..\Common\WinRT.ShellExtension\ShellExtensionModule.h" +#include "..\..\Common\WinRT.ShellExtension\ClassFactory.h" + +using namespace winrt::CommonWindowsRtShellExtenstion::implementation; + +ShellExtensionModule::ShellExtensionModule() +{ + Start(); +} + +ShellExtensionModule::~ShellExtensionModule() +{ + Stop(); +} + +void ShellExtensionModule::Start() +{ + DWORD cookie = 0; + + auto customStateProviderVirtualDrive = winrt::make>(); + winrt::check_hresult(CoRegisterClassObject(CLSID_CustomStateProviderVirtualDrive, customStateProviderVirtualDrive.get(), CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE, &cookie)); +} + +void ShellExtensionModule::Stop() +{ + +} diff --git a/Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/VirtualDrive.WinRT.ShellExtension.vcxproj similarity index 92% rename from Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/VirtualDrive.WinRT.ShellExtension.vcxproj index 97f6186..035fae5 100644 --- a/Windows/Common/WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj +++ b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/VirtualDrive.WinRT.ShellExtension.vcxproj @@ -104,7 +104,8 @@ - + + @@ -114,29 +115,28 @@ Create - - + false - - - - + {96fb01be-3def-418d-8ab0-69cc0d1813d3} - + {1f61a031-cdfe-4b81-bac3-7760fa777a2a} - + {e64b361d-8934-401e-b4fd-64786e4e1dc7} + + + diff --git a/Windows/Common/WinRT.ShellExtension/WinMain.cpp b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/WinMain.cpp similarity index 95% rename from Windows/Common/WinRT.ShellExtension/WinMain.cpp rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/WinMain.cpp index cded36a..6b7b4d7 100644 --- a/Windows/Common/WinRT.ShellExtension/WinMain.cpp +++ b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/WinMain.cpp @@ -1,5 +1,5 @@ #include "pch.h" -#include "ShellExtensionModule.h" +#include "..\..\Common\WinRT.ShellExtension\ShellExtensionModule.h" using namespace winrt; using namespace Windows::Foundation; diff --git a/Windows/Common/WinRT.ShellExtension/pch.cpp b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/pch.cpp similarity index 100% rename from Windows/Common/WinRT.ShellExtension/pch.cpp rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/pch.cpp diff --git a/Windows/Common/WinRT.ShellExtension/pch.h b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/pch.h similarity index 100% rename from Windows/Common/WinRT.ShellExtension/pch.h rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/pch.h diff --git a/Windows/Common/WinRT.ShellExtension/readme.txt b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/readme.txt similarity index 100% rename from Windows/Common/WinRT.ShellExtension/readme.txt rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/readme.txt diff --git a/Windows/Common/WinRT.ShellExtension/resource.h b/Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/resource.h similarity index 100% rename from Windows/Common/WinRT.ShellExtension/resource.h rename to Windows/VirtualDrive/VirtualDrive.WinRT.ShellExtension/resource.h diff --git a/Windows/VirtualDrive/VirtualDrive/Program.cs b/Windows/VirtualDrive/VirtualDrive/Program.cs index 4855eee..b905902 100644 --- a/Windows/VirtualDrive/VirtualDrive/Program.cs +++ b/Windows/VirtualDrive/VirtualDrive/Program.cs @@ -74,6 +74,7 @@ static async Task Main(string[] args) Settings.IconsFolderPath, Settings.RpcCommunicationChannelName, Settings.SyncIntervalMs, + Settings.MaxDegreeOfParallelism, log); Engine.AutoLock = Settings.AutoLock; diff --git a/Windows/VirtualDrive/VirtualDrive/RemoteStorage/General.docx b/Windows/VirtualDrive/VirtualDrive/RemoteStorage/General.docx index fd8d5ff0d1d867a30ab32f21bd61117812bf81c6..a29e91d671758406282928e6b78f80dd4c3fc0a4 100644 GIT binary patch delta 6675 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 diff --git a/Windows/VirtualDrive/VirtualDrive/RemoteStorage/Notes.txt b/Windows/VirtualDrive/VirtualDrive/RemoteStorage/Notes.txt index 45a4503..6d07837 100644 --- a/Windows/VirtualDrive/VirtualDrive/RemoteStorage/Notes.txt +++ b/Windows/VirtualDrive/VirtualDrive/RemoteStorage/Notes.txt @@ -1 +1 @@ -My notes file text \ No newline at end of file +My notes file text s \ No newline at end of file diff --git a/Windows/VirtualDrive/VirtualDrive/VirtualEngine.cs b/Windows/VirtualDrive/VirtualDrive/VirtualEngine.cs index af483f2..6230033 100644 --- a/Windows/VirtualDrive/VirtualDrive/VirtualEngine.cs +++ b/Windows/VirtualDrive/VirtualDrive/VirtualEngine.cs @@ -30,6 +30,7 @@ public class VirtualEngine : VirtualEngineBase /// Path to the icons folder. /// Channel name to communicate with Windows Explorer context menu and other components on this machine. /// Full synchronization interval in milliseconds. + /// A maximum number of concurrent tasks. /// Log4net logger. public VirtualEngine( string license, @@ -38,8 +39,9 @@ public VirtualEngine( string iconsFolderPath, string rpcCommunicationChannelName, double syncIntervalMs, + int maxDegreeOfParallelism, ILog log4net) - : base(license, userFileSystemRootPath, remoteStorageRootPath, iconsFolderPath, rpcCommunicationChannelName, syncIntervalMs, log4net) + : base(license, userFileSystemRootPath, remoteStorageRootPath, iconsFolderPath, rpcCommunicationChannelName, syncIntervalMs, maxDegreeOfParallelism, log4net) { RemoteStorageMonitor = new RemoteStorageMonitor(remoteStorageRootPath, this, log4net); } @@ -60,9 +62,9 @@ public override async Task GetFileSystemItemAsync(string userFi //public override IMapping Mapping { get { return new Mapping(this); } } /// - public override async Task StartAsync() + public override async Task StartAsync(bool processModified = true) { - await base.StartAsync(); + await base.StartAsync(processModified); RemoteStorageMonitor.Start(); } @@ -75,6 +77,8 @@ public override async Task StopAsync() /// public override async Task GetThumbnailAsync(string userFileSystemPath, uint size) { + // For this method to be called you need to run the Package project. + byte[] thumbnail = ThumbnailExtractor.GetThumbnail(userFileSystemPath, size); string thumbnailResult = thumbnail != null ? "Success" : "Not Impl"; @@ -86,6 +90,8 @@ public override async Task GetThumbnailAsync(string userFileSystemPath, /// public override async Task> GetItemPropertiesAsync(string userFileSystemPath) { + // For this method to be called you need to run the Package project. + //LogMessage($"{nameof(VirtualEngine)}.{nameof(GetItemPropertiesAsync)}()", userFileSystemPath); IList props = new List(); diff --git a/Windows/VirtualDrive/VirtualDrive/VirtualFile.cs b/Windows/VirtualDrive/VirtualDrive/VirtualFile.cs index cf91227..5528b68 100644 --- a/Windows/VirtualDrive/VirtualDrive/VirtualFile.cs +++ b/Windows/VirtualDrive/VirtualDrive/VirtualFile.cs @@ -58,11 +58,10 @@ public async Task ReadAsync(Stream output, long offset, long length, ITransferD await stream.CopyToAsync(output, bufferSize, length); } - // Store ETag here. - // In this sample we use file USN (USN changes on every file update) as a ETag for demo purposes. - string eTag = (await WindowsFileSystemItem.GetUsnByPathAsync(remoteStoragePath)).ToString(); - PlaceholderItem placeholder = Engine.Placeholders.GetItem(UserFileSystemPath); - await placeholder.Properties.AddOrUpdateAsync("ETag", eTag); + // Save ETag received from your remote storage in persistent placeholder properties. + //string eTag = ... + //PlaceholderItem placeholder = Engine.Placeholders.GetItem(UserFileSystemPath); + //await placeholder.Properties.AddOrUpdateAsync("ETag", eTag); } /// @@ -85,10 +84,11 @@ public async Task WriteAsync(IFileMetadata fileMetadata, Stream content = null, { Logger.LogMessage($"{nameof(IFile)}.{nameof(WriteAsync)}()", UserFileSystemPath, default, operationContext); + PlaceholderItem placeholder = Engine.Placeholders.GetItem(UserFileSystemPath); + // Send the ETag to the server as part of the update to ensure // the file in the remote storge is not modified since last read. - PlaceholderItem placeholder = Engine.Placeholders.GetItem(UserFileSystemPath); - string oldEtag = await placeholder.Properties["ETag"].GetValueAsync(); + //string oldEtag = await placeholder.Properties["ETag"].GetValueAsync(); // Send the lock-token to the server as part of the update. string lockToken; @@ -130,9 +130,9 @@ public async Task WriteAsync(IFileMetadata fileMetadata, Stream content = null, remoteStorageItem.LastAccessTimeUtc = fileMetadata.LastAccessTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = fileMetadata.LastWriteTime.UtcDateTime; - // Get the new ETag from server here as part of the update and save it on the client. - string newEtag = (await WindowsFileSystemItem.GetUsnByPathAsync(remoteStoragePath)).ToString(); - await placeholder.Properties.AddOrUpdateAsync("ETag", newEtag); + // Save ETag received from your remote storage in persistent placeholder properties. + //string newEtag = ... + //await placeholder.Properties.AddOrUpdateAsync("ETag", newEtag); //await customDataManager.SetCustomDataAsync( // eTagNew, diff --git a/Windows/VirtualDrive/VirtualDrive/VirtualFolder.cs b/Windows/VirtualDrive/VirtualDrive/VirtualFolder.cs index ac02a9c..0b613b3 100644 --- a/Windows/VirtualDrive/VirtualDrive/VirtualFolder.cs +++ b/Windows/VirtualDrive/VirtualDrive/VirtualFolder.cs @@ -55,11 +55,11 @@ public async Task CreateFileAsync(IFileMetadata fileMetadata, Stream con remoteStorageItem.LastAccessTimeUtc = fileMetadata.LastAccessTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = fileMetadata.LastWriteTime.UtcDateTime; - // Get ETag from your remote storage here and save it in + // Save Etag received from your remote storage in // persistent placeholder properties unlil the next update. - string eTag = (await WindowsFileSystemItem.GetUsnByPathAsync(remoteStorageItem.FullName)).ToString(); - PlaceholderItem placeholder = Engine.Placeholders.GetItem(userFileSystemNewItemPath); - await placeholder.Properties.AddOrUpdateAsync("ETag", eTag); + //string eTag = ... + //PlaceholderItem placeholder = Engine.Placeholders.GetItem(userFileSystemNewItemPath); + //await placeholder.Properties.AddOrUpdateAsync("ETag", eTag); // Return remote storage item ID. It will be passed later // into IEngine.GetFileSystemItemAsync() method on every call. @@ -83,10 +83,10 @@ public async Task CreateFolderAsync(IFolderMetadata folderMetadata) remoteStorageItem.LastAccessTimeUtc = folderMetadata.LastAccessTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = folderMetadata.LastWriteTime.UtcDateTime; - // Get ETag from your remote storage here and save it in persistent placeholder properties. - string eTag = (await WindowsFileSystemItem.GetUsnByPathAsync(remoteStorageItem.FullName)).ToString(); - PlaceholderItem placeholder = Engine.Placeholders.GetItem(userFileSystemNewItemPath); - await placeholder.Properties.AddOrUpdateAsync("ETag", eTag); + // Save ETag received from your remote storage in persistent placeholder properties. + //string eTag = ... + //PlaceholderItem placeholder = Engine.Placeholders.GetItem(userFileSystemNewItemPath); + //await placeholder.Properties.AddOrUpdateAsync("ETag", eTag); // Return remote storage item ID. It will be passed later // into IEngine.GetFileSystemItemAsync() method on every call. diff --git a/Windows/VirtualDrive/VirtualDrive/appsettings.json b/Windows/VirtualDrive/VirtualDrive/appsettings.json index bfbd21b..76f8cd5 100644 --- a/Windows/VirtualDrive/VirtualDrive/appsettings.json +++ b/Windows/VirtualDrive/VirtualDrive/appsettings.json @@ -36,5 +36,8 @@ // Communication channel name is used by RPC to establish connection over named pipes. // The channel is used to comunicate between the main app and COM thumbnails handler, Win Explorer context menu, etc. - "RpcCommunicationChannelName": "VirtualDrive.RPC" + "RpcCommunicationChannelName": "VirtualDrive.RPC", + + // Gets or sets the maximum number of concurrent tasks + "MaxDegreeOfParallelism": 1000 } \ No newline at end of file diff --git a/Windows/VirtualFileSystem/Program.cs b/Windows/VirtualFileSystem/Program.cs index 160b2a6..db82229 100644 --- a/Windows/VirtualFileSystem/Program.cs +++ b/Windows/VirtualFileSystem/Program.cs @@ -70,7 +70,8 @@ static async Task Main(string[] args) Engine = new VirtualEngine( Settings.UserFileSystemLicense, Settings.UserFileSystemRootPath, - Settings.RemoteStorageRootPath, + Settings.RemoteStorageRootPath, + Settings.MaxDegreeOfParallelism, log); // Set the remote storage item ID for the root item. It will be passed to the IEngine.GetFileSystemItemAsync() diff --git a/Windows/VirtualFileSystem/VirtualEngine.cs b/Windows/VirtualFileSystem/VirtualEngine.cs index 402677b..551d3dd 100644 --- a/Windows/VirtualFileSystem/VirtualEngine.cs +++ b/Windows/VirtualFileSystem/VirtualEngine.cs @@ -32,8 +32,10 @@ public class VirtualEngine : EngineWindows /// A root folder of your user file system. /// Your file system tree will be located under this folder. /// + /// A maximum number of concurrent tasks. /// Logger. - public VirtualEngine(string license, string userFileSystemRootPath, string remoteStorageRootPath, ILog log) : base(license, userFileSystemRootPath) + public VirtualEngine(string license, string userFileSystemRootPath, string remoteStorageRootPath, int maxDegreeOfParallelism, ILog log) : + base(license, userFileSystemRootPath, maxDegreeOfParallelism) { logger = new Logger("File System Engine", log); @@ -62,7 +64,7 @@ public override async Task GetFileSystemItemAsync(string userFi } /// - public override async Task StartAsync() + public override async Task StartAsync(bool processModified = true) { await base.StartAsync(); RemoteStorageMonitor.Start(); diff --git a/Windows/VirtualFileSystem/appsettings.json b/Windows/VirtualFileSystem/appsettings.json index c17e220..7b84c5b 100644 --- a/Windows/VirtualFileSystem/appsettings.json +++ b/Windows/VirtualFileSystem/appsettings.json @@ -29,5 +29,8 @@ // 1. Compile the project in the release mode. // 2. Run without debugger arrached (Ctrl-F5). // 3. Set the VerboseLogging to false. - "VerboseLogging": true + "VerboseLogging": true, + + // Gets or sets the maximum number of concurrent tasks + "MaxDegreeOfParallelism": 1000 } \ No newline at end of file diff --git a/Windows/WebDAVDrive/WebDAVDrive.Package/Package.appxmanifest b/Windows/WebDAVDrive/WebDAVDrive.Package/Package.appxmanifest index ee21c65..db41d2b 100644 --- a/Windows/WebDAVDrive/WebDAVDrive.Package/Package.appxmanifest +++ b/Windows/WebDAVDrive/WebDAVDrive.Package/Package.appxmanifest @@ -44,7 +44,7 @@ - + @@ -67,8 +67,12 @@ - - + + + + + + diff --git a/Windows/WebDAVDrive/WebDAVDrive.Package/WebDAVDrive.Package.wapproj b/Windows/WebDAVDrive/WebDAVDrive.Package/WebDAVDrive.Package.wapproj index 52b74ac..4bf9522 100644 --- a/Windows/WebDAVDrive/WebDAVDrive.Package/WebDAVDrive.Package.wapproj +++ b/Windows/WebDAVDrive/WebDAVDrive.Package/WebDAVDrive.Package.wapproj @@ -69,6 +69,7 @@ + True diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters new file mode 100644 index 0000000..5f72f70 --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + + + + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..eb14bc50dd76ba7824350e61b1852757ccefacd7 GIT binary patch literal 2520 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 literal 0 HcmV?d00001 diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps new file mode 100644 index 0000000000000000000000000000000000000000..4a39751fafc2becb343d5a5145971ccd77b1550d GIT binary patch literal 1476 zcmb7EO>fgc5Pg9h2#5;@&PnN^m0BxlD};Irj;mTEPGvhukt|u2W0AD}h@3naY88;3YXN&1TU2OBRN zeeP(p4&S6j)IP7nG8>h$hI2UN(8B}^#7J<*wT>Bkb3$pcqo)LybEu>xLSI8%(*5M5hR+C+(Fw%%V0Ur(bjPBDir9DL^GG38OAzJie zIx1yVa=()NK5!N+s<@zk%A|?|Mty_VI9%n;Syl0lxO6`a_NCZ!#2p3P*^qf1*1S%J zLK=*5$|xst?GO>tzL5J!Ii}3O+`rfU`&R93Hkxjz?OuxwCawG2)4KNLkJ{6fR^Wl7 zt#dB!Sbompztf`Z`tOLl|C91RcVFIj=Ks4-!G)pa5V!WzPM__2{Xn13^eOlkcRGy< ah<^XVbOom9_Z%b6<%s{+0#lqzj`;=PMHY?# literal 0 HcmV?d00001 diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest new file mode 100644 index 0000000..ed32231 --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.exe.manifest @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc new file mode 100644 index 0000000000000000000000000000000000000000..6d285329154a138f9216537b866148988d06f675 GIT binary patch literal 2664 zcmdUxTTAOe5Xb+|g5M#wFN$KlJo%`t7CE&_FQQN=VvQDRJTxu7_}M+@HyamYlPF#u zBFlC*)0x?s|6G!P&o$K)=tN^(YpMsu>`*g!=kQ|9b)^YUb*-}k-RedWdkTLB9l@JI zO>fTWnsdODSsUvwGMie~61UVGt-_7?cY^fD$yPG@o4QlQNtyg zL&rMRP#qn@ZE$X@rAs(neou4&r^VUdZ$6Z7dG9<8)C8ABj6+a*&^__bK*wX?I-RZ>XYU#ks|yti8}>b(odZbbi0 z$W%-X1X?BM5l_AkyPT4)jJ1|i1#zmU#tyHQH@!8&;=Ycks-&m7^iQAes&n&@>T0pf z?h`90)a+rSLk$nnYNNmAZf(JB!|g+xu1@!~ftBqApNcbSb$*UVf6#9Hx}MJOR-ap= zwzol~Sn`0#o37tYHh5Y2^K+oBmlPO~3yZ_E?q+hqO25VR5}je2>_7V)mVz&HI09JUAu* literal 0 HcmV?d00001 diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.cpp b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.cpp new file mode 100644 index 0000000..f2b860b --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.cpp @@ -0,0 +1,40 @@ +#include "pch.h" +#include "CustomStateProvider.h" +#include "..\..\Common\WinRT.ShellExtension\ShellExtensionModule.h" + +namespace winrt +{ + using namespace winrt::Windows::Storage::Provider; +} + +namespace winrt::CommonWindowsRtShellExtenstion::implementation +{ + using namespace Windows::Foundation::Collections; + using namespace Windows::Storage::Provider; + + IIterable CustomStateProvider::GetItemProperties(hstring const& itemPath) + { + auto propertyVector{ winrt::single_threaded_vector() }; + + try + { + CommonShellExtensionRpc::CustomStateProviderProxy stateProviderProxy; + auto itemProperties = stateProviderProxy.GetItemProperties(itemPath, false); + + for (const auto& itemProp : itemProperties) + { + winrt::StorageProviderItemProperty storageItemProperty; + storageItemProperty.Id(itemProp.Id()); + storageItemProperty.Value(itemProp.Value()); + storageItemProperty.IconResource(itemProp.IconResource()); + + propertyVector.Append(storageItemProperty); + } + } + catch (...) + { + } + + return propertyVector; + } +} diff --git a/Windows/Common/WinRT.ShellExtension/CustomStateProvider.h b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.h similarity index 80% rename from Windows/Common/WinRT.ShellExtension/CustomStateProvider.h rename to Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.h index ce3d6f6..7451a06 100644 --- a/Windows/Common/WinRT.ShellExtension/CustomStateProvider.h +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/CustomStateProvider.h @@ -3,8 +3,7 @@ #include "CommonWindowsRtShellExtenstion.CustomStateProvider.g.h" #include -/* 000562AA-2879-4CF1-89E8-0AEC9596FE19 */ -constexpr CLSID CLSID_CustomStateProvider = { 0x562aa, 0x2879, 0x4cf1, { 0x89, 0xe8, 0xa, 0xec, 0x95, 0x96, 0xfe, 0x19 } }; +constexpr CLSID CLSID_CustomStateProviderWebDav = { 0x754f334f, 0x95c, 0x46cd, { 0xb0, 0x33, 0xb2, 0xc0, 0x52, 0x3d, 0x28, 0x29 } }; namespace winrt::CommonWindowsRtShellExtenstion::implementation { diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/PropertySheet.props b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/PropertySheet.props new file mode 100644 index 0000000..e34141b --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/PropertySheet.props @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/Windows/Common/WinRT.ShellExtension/ShellExtensionModule.cpp b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/ShellExtensionModule.cpp similarity index 51% rename from Windows/Common/WinRT.ShellExtension/ShellExtensionModule.cpp rename to Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/ShellExtensionModule.cpp index c3f2a1b..2e50b95 100644 --- a/Windows/Common/WinRT.ShellExtension/ShellExtensionModule.cpp +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/ShellExtensionModule.cpp @@ -1,7 +1,6 @@ #include "pch.h" -#include "ShellExtensionModule.h" -#include "CustomStateProvider.h" -#include "ClassFactory.h" +#include "..\..\Common\WinRT.ShellExtension\ShellExtensionModule.h" +#include "..\..\Common\WinRT.ShellExtension\ClassFactory.h" using namespace winrt::CommonWindowsRtShellExtenstion::implementation; @@ -17,13 +16,13 @@ ShellExtensionModule::~ShellExtensionModule() void ShellExtensionModule::Start() { - DWORD cookie; + DWORD cookie = 0; - auto customStateProvider = winrt::make>(); - winrt::check_hresult(CoRegisterClassObject(CLSID_CustomStateProvider, customStateProvider.get(), CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &cookie)); + auto customStateProviderWebDav = winrt::make>(); + winrt::check_hresult(CoRegisterClassObject(CLSID_CustomStateProviderWebDav, customStateProviderWebDav.get(), CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE, &cookie)); } void ShellExtensionModule::Stop() -{ +{ } diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WebDAVDrive.WinRT.ShellExtension.vcxproj b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WebDAVDrive.WinRT.ShellExtension.vcxproj new file mode 100644 index 0000000..416897a --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WebDAVDrive.WinRT.ShellExtension.vcxproj @@ -0,0 +1,148 @@ + + + + + + true + true + true + true + 15.0 + {5730488F-9F58-4951-9502-49A5A9A42B07} + Win32Proj + Common_Windows_WinRT_ShellExtension + 10.0.18362.0 + 10.0.18362.0 + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + Application + v143 + v142 + v141 + v140 + Unicode + + + true + true + + + false + true + false + + + + + + + + + + + + + + + + Use + pch.h + $(IntDir)pch.pch + _CONSOLE;WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;%(PreprocessorDefinitions) + Level4 + %(AdditionalOptions) /permissive- /bigobj + + + Windows + false + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + + + + + + + + + WIN32;%(PreprocessorDefinitions) + + + + + MaxSpeed + true + true + NDEBUG;%(PreprocessorDefinitions) + + + true + true + + + + + + + + + + + Create + + + + + + + + + + + {96fb01be-3def-418d-8ab0-69cc0d1813d3} + + + {1f61a031-cdfe-4b81-bac3-7760fa777a2a} + + + {e64b361d-8934-401e-b4fd-64786e4e1dc7} + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WinMain.cpp b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WinMain.cpp new file mode 100644 index 0000000..6b7b4d7 --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/WinMain.cpp @@ -0,0 +1,69 @@ +#include "pch.h" +#include "..\..\Common\WinRT.ShellExtension\ShellExtensionModule.h" + +using namespace winrt; +using namespace Windows::Foundation; + +void __stdcall TimerProc(HWND hWnd, UINT message, UINT idTimer, DWORD dwTime) +{ + PostQuitMessage(0); +} + +LRESULT __stdcall WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_DESTROY: + KillTimer(hWnd, 0); + PostQuitMessage(0); + break; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +void RunMessageLoop(HINSTANCE hInstance) +{ + std::wstring className = L"ShellExtension Window Class"; + + WNDCLASS wc = { }; + + wc.lpfnWndProc = WindowProc; + wc.hInstance = hInstance; + wc.lpszClassName = className.c_str(); + + RegisterClass(&wc); + + HWND hWnd = CreateWindowEx( + 0, + className.c_str(), + L"ShellExtension", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + nullptr, + nullptr, + hInstance, + nullptr + ); + + ShowWindow(hWnd, SW_HIDE); + + SetTimer(hWnd, 0, 20000, (TIMERPROC)TimerProc); + + MSG msg; + + while (GetMessage(&msg, nullptr, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) +{ + init_apartment(); + + ShellExtensionModule module; + + RunMessageLoop(hInstance); +} diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.cpp b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.cpp new file mode 100644 index 0000000..bcb5590 --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.cpp @@ -0,0 +1 @@ +#include "pch.h" diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.h b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.h new file mode 100644 index 0000000..9efea8c --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/pch.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#ifdef GetCurrentTime +#undef GetCurrentTime +#endif + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "CustomStateProvider.h" \ No newline at end of file diff --git a/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/resource.h b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/resource.h new file mode 100644 index 0000000..5b37dd6 --- /dev/null +++ b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/resource.h @@ -0,0 +1,13 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Windows/WebDAVDrive/WebDAVDrive/Images/Empty.ico b/Windows/WebDAVDrive/WebDAVDrive/Images/Empty.ico new file mode 100644 index 0000000000000000000000000000000000000000..23cfb33c77c2205e76cc258e9ecbf97cbd780bdb GIT binary patch literal 293207 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 C^Yvc< literal 0 HcmV?d00001 diff --git a/Windows/WebDAVDrive/WebDAVDrive/Program.cs b/Windows/WebDAVDrive/WebDAVDrive/Program.cs index 20624a8..4daf8fc 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/Program.cs +++ b/Windows/WebDAVDrive/WebDAVDrive/Program.cs @@ -107,6 +107,7 @@ static async Task Main(string[] args) Settings.IconsFolderPath, Settings.RpcCommunicationChannelName, Settings.SyncIntervalMs, + Settings.MaxDegreeOfParallelism, log); Engine.AutoLock = Settings.AutoLock; diff --git a/Windows/WebDAVDrive/WebDAVDrive/VirtualEngine.cs b/Windows/WebDAVDrive/WebDAVDrive/VirtualEngine.cs index 7e2bcba..452e2ef 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/VirtualEngine.cs +++ b/Windows/WebDAVDrive/WebDAVDrive/VirtualEngine.cs @@ -41,6 +41,7 @@ public class VirtualEngine : VirtualEngineBase /// Path to the icons folder. /// Channel name to communicate with Windows Explorer context menu and other components on this machine. /// Full synchronization interval in milliseconds. + /// A maximum number of concurrent tasks. /// Log4net logger. public VirtualEngine( string license, @@ -48,10 +49,11 @@ public VirtualEngine( string remoteStorageRootPath, string webSocketServerUrl, string iconsFolderPath, - string rpcCommunicationChannelName, + string rpcCommunicationChannelName, double syncIntervalMs, + int maxDegreeOfParallelism, ILog log4net) - : base(license, userFileSystemRootPath, remoteStorageRootPath, iconsFolderPath, rpcCommunicationChannelName, syncIntervalMs, log4net) + : base(license, userFileSystemRootPath, remoteStorageRootPath, iconsFolderPath, rpcCommunicationChannelName, syncIntervalMs, maxDegreeOfParallelism, log4net) { RemoteStorageMonitor = new RemoteStorageMonitor(webSocketServerUrl, this, log4net); } @@ -72,9 +74,9 @@ public override async Task GetFileSystemItemAsync(string userFi //public override IMapping Mapping { get { return new Mapping(this); } } /// - public override async Task StartAsync() + public override async Task StartAsync(bool processModified = true) { - await base.StartAsync(); + await base.StartAsync(processModified); await RemoteStorageMonitor.StartAsync(); } diff --git a/Windows/WebDAVDrive/WebDAVDrive/VirtualFolder.cs b/Windows/WebDAVDrive/WebDAVDrive/VirtualFolder.cs index 215f8f3..df54af1 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/VirtualFolder.cs +++ b/Windows/WebDAVDrive/WebDAVDrive/VirtualFolder.cs @@ -38,7 +38,7 @@ public async Task CreateFileAsync(IFileMetadata fileMetadata, Stream con long contentLength = content != null ? content.Length : 0; // Update remote storage file content. - // Get the new ETag returned by the server, if any. + // Get the ETag returned by the server, if any. string eTag = await Program.DavClient.UploadAsync(newFileUri, async (outputStream) => { if (content != null) { diff --git a/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj b/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj index 2d7a7d5..735f951 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj +++ b/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj @@ -46,6 +46,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Windows/WebDAVDrive/WebDAVDrive/appsettings.json b/Windows/WebDAVDrive/WebDAVDrive/appsettings.json index b57d5f0..be11544 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/appsettings.json +++ b/Windows/WebDAVDrive/WebDAVDrive/appsettings.json @@ -57,5 +57,8 @@ // File types to request thumbnails for. // To request thumbnails for specific file types, list file types using '|' separator. // To request thumbnails for all file types set the value to "*". - "RequestThumbnailsFor": "png|jpeg|gif|jpg|apng|avif|jfif|pjpeg|pjp|svg|webp|bmp|ico|cur|tif|tiff|heic|hif" + "RequestThumbnailsFor": "png|jpeg|gif|jpg|apng|avif|jfif|pjpeg|pjp|svg|webp|bmp|ico|cur|tif|tiff|heic|hif", + + // Gets or sets the maximum number of concurrent tasks + "MaxDegreeOfParallelism": 1000 } \ No newline at end of file