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