diff --git a/Common/Common.csproj b/Common/Common.csproj index 51cbd8f..7d198c6 100644 --- a/Common/Common.csproj +++ b/Common/Common.csproj @@ -10,6 +10,6 @@ AnyCPU;x64 - + \ No newline at end of file diff --git a/Windows/Common/Core/Common.Windows.Core.csproj b/Windows/Common/Core/Common.Windows.Core.csproj index 9cfc871..1394e23 100644 --- a/Windows/Common/Core/Common.Windows.Core.csproj +++ b/Windows/Common/Core/Common.Windows.Core.csproj @@ -20,8 +20,8 @@ - - + + \ No newline at end of file diff --git a/Windows/Common/Core/LogFormatter.cs b/Windows/Common/Core/LogFormatter.cs index c075772..6809480 100644 --- a/Windows/Common/Core/LogFormatter.cs +++ b/Windows/Common/Core/LogFormatter.cs @@ -50,6 +50,8 @@ public bool DebugLoggingEnabled private const int sourcePathWidth = 60; private const int remoteStorageIdWidth = 20; + private const int indent = -30; + /// /// Creates instance of this class. /// @@ -88,24 +90,24 @@ private string ConfigureLogger() public void PrintEnvironmentDescription() { // Log environment description. - log.Info($"\n{"AppID:",-25} {appId}"); - log.Info($"\n{"Engine version:",-25} {typeof(IEngine).Assembly.GetName().Version}"); - log.Info($"\n{"OS version:",-25} {RuntimeInformation.OSDescription}"); - log.Info($"\n{".NET version:",-25} {RuntimeInformation.FrameworkDescription} {IntPtr.Size * 8}bit."); - log.Info($"\n{"Package or app identity:",-25} {PackageRegistrar.IsRunningWithIdentity()}"); - log.Info($"\n{"Sparse package identity:",-25} {PackageRegistrar.IsRunningWithSparsePackageIdentity()}"); - log.Info($"\n{"Elevated mode:",-25} {new System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent()).IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)}"); + log.Info($"\n{"AppID:",indent} {appId}"); + log.Info($"\n{"Engine version:",indent} {typeof(IEngine).Assembly.GetName().Version}"); + log.Info($"\n{"OS version:",indent} {RuntimeInformation.OSDescription}"); + log.Info($"\n{".NET version:",indent} {RuntimeInformation.FrameworkDescription} {IntPtr.Size * 8}bit."); + log.Info($"\n{"Package or app identity:",indent} {PackageRegistrar.IsRunningWithIdentity()}"); + log.Info($"\n{"Sparse package identity:",indent} {PackageRegistrar.IsRunningWithSparsePackageIdentity()}"); + log.Info($"\n{"Elevated mode:",indent} {new System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent()).IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)}"); string sparsePackagePath = PackageRegistrar.GetSparsePackagePath(); if (File.Exists(sparsePackagePath)) { - log.Info($"\n{"Sparse package location:",-25} {sparsePackagePath}"); + log.Info($"\n{"Sparse package location:",indent} {sparsePackagePath}"); var cert = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromSignedFile(sparsePackagePath); - log.Info($"\n{"Sparse package cert:",-25} Subject: {cert.Subject}, Issued by: {cert.Issuer}"); + log.Info($"\n{"Sparse package cert:", indent} Subject: {cert.Subject}, Issued by: {cert.Issuer}"); } else { - log.Info($"\n{"Sparse package:",-25} Not found"); + log.Info($"\n{"Sparse package:", indent} Not found"); } } @@ -126,11 +128,12 @@ public async Task PrintEngineStartInfoAsync(EngineWindows engine) public async Task PrintEngineDescriptionAsync(EngineWindows engine) { log.Info($"\n"); - log.Info($"\n{"File system root:",-25} {engine.Path}"); - log.Info($"\n{"Remote storage root:",-25} {remoteStorageRootPath}"); - log.Info($"\n{"AutoLock:",-25} {engine.AutoLock}"); - log.Info($"\n{"Outgoing sync, ms:",-25} {engine.SyncService.SyncIntervalMs}"); - + log.Info($"\n{"File system root:",indent} {engine.Path}"); + log.Info($"\n{"Remote storage root:",indent} {remoteStorageRootPath}"); + log.Info($"\n{"AutoLock:",indent} {engine.AutoLock}"); + log.Info($"\n{"Outgoing sync, ms:",indent} {engine.SyncService.SyncIntervalMs}"); + log.Info($"\n{"Shell extensions RPC enabled:",indent} {engine.ShellExtensionsComServerRpcEnabled}"); + log.Info($"\n{"Max Transfer concurrent requests:",indent} {engine.MaxTransferConcurrentRequests}"); // Log indexing state. Sync root must be indexed. await PrintIndexingStateAsync(engine.Path); @@ -143,7 +146,7 @@ public async Task PrintEngineDescriptionAsync(EngineWindows engine) private async Task PrintIndexingStateAsync(string path) { StorageFolder userFileSystemRootFolder = await StorageFolder.GetFolderFromPathAsync(path); - log.Info($"\n{"Indexed state:",-25} {await userFileSystemRootFolder.GetIndexedStateAsync()}"); + log.Info($"\n{"Indexed state:",indent} {await userFileSystemRootFolder.GetIndexedStateAsync()}"); } public void LogMessage(string message) diff --git a/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj b/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj index 216a195..bef93a2 100644 --- a/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj +++ b/Windows/Common/VirtualDrive/Common.Windows.VirtualDrive.csproj @@ -9,7 +9,7 @@ AnyCPU;x64 - + diff --git a/Windows/VirtualDrive/VirtualDrive.ShellExtension/VirtualDrive.ShellExtension.csproj b/Windows/VirtualDrive/VirtualDrive.ShellExtension/VirtualDrive.ShellExtension.csproj index 989f8f8..4776056 100644 --- a/Windows/VirtualDrive/VirtualDrive.ShellExtension/VirtualDrive.ShellExtension.csproj +++ b/Windows/VirtualDrive/VirtualDrive.ShellExtension/VirtualDrive.ShellExtension.csproj @@ -19,7 +19,7 @@ - + diff --git a/Windows/VirtualDrive/VirtualDrive/AppSettings.cs b/Windows/VirtualDrive/VirtualDrive/AppSettings.cs index a54f067..f480969 100644 --- a/Windows/VirtualDrive/VirtualDrive/AppSettings.cs +++ b/Windows/VirtualDrive/VirtualDrive/AppSettings.cs @@ -27,9 +27,14 @@ public class AppSettings : Settings public double SyncIntervalMs { get; set; } /// - /// Throttling max concurrent requests. + /// Throttling max of create/update/read concurrent requests. /// - public int? MaxConcurrentRequests { get; set; } + public int? MaxTransferConcurrentRequests { get; set; } + + /// + /// Throttling max of listing/move/delete concurrent requests. + /// + public int? MaxOperationsConcurrentRequests { get; set; } /// /// Absolute or relative path of external COM server executable. @@ -137,9 +142,14 @@ public static AppSettings ReadSettings(this IConfiguration configuration) // Load product name from entry exe file. settings.ProductName = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductName; - if (!settings.MaxConcurrentRequests.HasValue) + if (!settings.MaxTransferConcurrentRequests.HasValue) + { + settings.MaxTransferConcurrentRequests = 6; + } + + if (!settings.MaxOperationsConcurrentRequests.HasValue) { - settings.MaxConcurrentRequests = int.MaxValue; + settings.MaxOperationsConcurrentRequests = int.MaxValue; } return settings; diff --git a/Windows/VirtualDrive/VirtualDrive/Program.cs b/Windows/VirtualDrive/VirtualDrive/Program.cs index 0288e6b..d35e95d 100644 --- a/Windows/VirtualDrive/VirtualDrive/Program.cs +++ b/Windows/VirtualDrive/VirtualDrive/Program.cs @@ -151,7 +151,8 @@ private static async Task RunEngine() Engine.SyncService.SyncIntervalMs = Settings.SyncIntervalMs; Engine.AutoLock = Settings.AutoLock; - Engine.MaxConcurrentRequests = Settings.MaxConcurrentRequests.Value; + Engine.MaxTransferConcurrentRequests = Settings.MaxTransferConcurrentRequests.Value; + Engine.MaxOperationsConcurrentRequests = Settings.MaxOperationsConcurrentRequests.Value; Engine.ShellExtensionsComServerRpcEnabled = Settings.ShellExtensionsComServerRpcEnabled; // Enable RPC in case RPC shaell extension handlers, hosted in separate process. // Set the remote storage item ID for the root item. It will be passed to the IEngine.GetFileSystemItemAsync() diff --git a/Windows/VirtualDrive/VirtualDrive/VirtualDrive.csproj b/Windows/VirtualDrive/VirtualDrive/VirtualDrive.csproj index 7d5e242..6f304d6 100644 --- a/Windows/VirtualDrive/VirtualDrive/VirtualDrive.csproj +++ b/Windows/VirtualDrive/VirtualDrive/VirtualDrive.csproj @@ -40,7 +40,7 @@ This is an advanced project with ETags support, Microsoft Office documents editi - + diff --git a/Windows/VirtualDrive/VirtualDrive/appsettings.json b/Windows/VirtualDrive/VirtualDrive/appsettings.json index d9e9ada..327970e 100644 --- a/Windows/VirtualDrive/VirtualDrive/appsettings.json +++ b/Windows/VirtualDrive/VirtualDrive/appsettings.json @@ -30,8 +30,12 @@ "SyncIntervalMs": 10000, - // Maximum number of concurrent requests to remote storage. If null then int.Max value is used. - "MaxConcurrentRequests": null, + // Maximum number of create/update/read concurrent requests to remote storage. If null then 6 value is used. + "MaxTransferConcurrentRequests": 6, + + + // Maximum number of listing/delete/move concurrent requests to remote storage. If null then int.Max value is used. + "MaxOperationsConcurrentRequests": null, // Automatically lock the file in the remote storage when a file handle is being opened for writing, unlock on close. diff --git a/Windows/WebDAVDrive/WebDAVDrive.ShellExtension/WebDAVDrive.ShellExtension.csproj b/Windows/WebDAVDrive/WebDAVDrive.ShellExtension/WebDAVDrive.ShellExtension.csproj index b331798..0c70a44 100644 --- a/Windows/WebDAVDrive/WebDAVDrive.ShellExtension/WebDAVDrive.ShellExtension.csproj +++ b/Windows/WebDAVDrive/WebDAVDrive.ShellExtension/WebDAVDrive.ShellExtension.csproj @@ -12,7 +12,7 @@ IT HIT LTD. - + diff --git a/Windows/WebDAVDrive/WebDAVDrive/AppSettings.cs b/Windows/WebDAVDrive/WebDAVDrive/AppSettings.cs index 5ccecad..f297767 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/AppSettings.cs +++ b/Windows/WebDAVDrive/WebDAVDrive/AppSettings.cs @@ -35,9 +35,14 @@ public class AppSettings : Settings public double SyncIntervalMs { get; set; } /// - /// Throttling max concurrent requests. + /// Throttling max of create/update/read concurrent requests. /// - public int? MaxConcurrentRequests { get; set; } + public int? MaxTransferConcurrentRequests { get; set; } + + /// + /// Throttling max of listing/move/delete concurrent requests. + /// + public int? MaxOperationsConcurrentRequests { get; set; } /// /// URL to get a thumbnail for Windows Explorer thumbnails mode. @@ -117,9 +122,14 @@ public static AppSettings ReadSettings(this IConfiguration configuration) // Load product name from entry exe file. settings.ProductName = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductName; - if (!settings.MaxConcurrentRequests.HasValue) + if (!settings.MaxTransferConcurrentRequests.HasValue) + { + settings.MaxTransferConcurrentRequests = 6; + } + + if (!settings.MaxOperationsConcurrentRequests.HasValue) { - settings.MaxConcurrentRequests = int.MaxValue; + settings.MaxOperationsConcurrentRequests = int.MaxValue; } return settings; diff --git a/Windows/WebDAVDrive/WebDAVDrive/Program.cs b/Windows/WebDAVDrive/WebDAVDrive/Program.cs index 81593da..8e94e09 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/Program.cs +++ b/Windows/WebDAVDrive/WebDAVDrive/Program.cs @@ -178,7 +178,8 @@ private static async Task RunEngine() Engine.SyncService.SyncIntervalMs = Settings.SyncIntervalMs; Engine.AutoLock = Settings.AutoLock; - Engine.MaxConcurrentRequests = Settings.MaxConcurrentRequests.Value; + Engine.MaxTransferConcurrentRequests = Settings.MaxTransferConcurrentRequests.Value; + Engine.MaxOperationsConcurrentRequests = Settings.MaxOperationsConcurrentRequests.Value; Engine.ShellExtensionsComServerRpcEnabled = Settings.ShellExtensionsComServerRpcEnabled; // Enable RPC in case RPC shaell extension handlers, hosted in separate process. // Print console commands. diff --git a/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj b/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj index 172878f..4268310 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj +++ b/Windows/WebDAVDrive/WebDAVDrive/WebDAVDrive.csproj @@ -38,7 +38,7 @@ - + diff --git a/Windows/WebDAVDrive/WebDAVDrive/appsettings.json b/Windows/WebDAVDrive/WebDAVDrive/appsettings.json index c1ae526..9e22525 100644 --- a/Windows/WebDAVDrive/WebDAVDrive/appsettings.json +++ b/Windows/WebDAVDrive/WebDAVDrive/appsettings.json @@ -47,8 +47,12 @@ "SyncIntervalMs": 10000, - // Maximum number of concurrent requests to remote storage. If null then int.Max value is used. - "MaxConcurrentRequests": 6, + // Maximum number of create/update/read concurrent requests to remote storage. If null then 6 value is used. + "MaxTransferConcurrentRequests": 6, + + + // Maximum number of listing/delete/move concurrent requests to remote storage. If null then int.Max value is used. + "MaxOperationsConcurrentRequests": null, // Automatically lock the file in remote storage when a file handle is being opened for writing, unlock on close.