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 fd8d5ff..a29e91d 100644 Binary files a/Windows/VirtualDrive/VirtualDrive/RemoteStorage/General.docx and b/Windows/VirtualDrive/VirtualDrive/RemoteStorage/General.docx differ 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 0000000..eb14bc5 Binary files /dev/null and b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common.Windows.WinRT.ShellExtension_TemporaryKey.pfx differ 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 0000000..4a39751 Binary files /dev/null and b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.aps differ 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 0000000..6d28532 Binary files /dev/null and b/Windows/WebDAVDrive/WebDAVDrive.WinRT.ShellExtension/Common_Windows_WinRT_ShellExtension.rc differ 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 0000000..23cfb33 Binary files /dev/null and b/Windows/WebDAVDrive/WebDAVDrive/Images/Empty.ico differ 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