Refactor AdminContentProvider
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
namespace FileTime.App.Core.UserCommand;
|
||||
|
||||
public class AddRemoteContentProviderCommand : IIdentifiableUserCommand
|
||||
{
|
||||
public const string CommandName = "add_remote_content_provider";
|
||||
|
||||
public static AddRemoteContentProviderCommand Instance { get; } = new();
|
||||
|
||||
private AddRemoteContentProviderCommand()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public string UserCommandID => CommandName;
|
||||
public string Title => "Add Remote Content Provider";
|
||||
}
|
||||
@@ -11,6 +11,7 @@ public class DefaultIdentifiableCommandHandlerRegister : IStartupHandler
|
||||
{
|
||||
_userCommandHandlerService = userCommandHandlerService;
|
||||
|
||||
AddUserCommand(AddRemoteContentProviderCommand.Instance);
|
||||
AddUserCommand(CloseTabCommand.Instance);
|
||||
AddUserCommand(CopyCommand.Instance);
|
||||
AddUserCommand(CopyBase64Command.Instance);
|
||||
|
||||
@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
|
||||
public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
|
||||
{
|
||||
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
|
||||
private readonly IAdminContentProvider _adminContentProvider;
|
||||
private readonly IAdminElevationManager _adminElevationManager;
|
||||
private readonly ILogger<LocalItemCreator> _logger;
|
||||
|
||||
public LocalItemCreator(
|
||||
IAdminContentAccessorFactory adminContentAccessorFactory,
|
||||
IAdminContentProvider adminContentProvider,
|
||||
IAdminElevationManager adminElevationManager,
|
||||
ILogger<LocalItemCreator> logger)
|
||||
{
|
||||
_adminContentAccessorFactory = adminContentAccessorFactory;
|
||||
_adminContentProvider = adminContentProvider;
|
||||
_adminElevationManager = adminElevationManager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,8 @@ public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
|
||||
}
|
||||
|
||||
var adminItemCreator = await _adminContentAccessorFactory.CreateAdminItemCreatorAsync();
|
||||
await adminItemCreator.CreateContainerAsync(_adminContentProvider, fullName);
|
||||
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
|
||||
await adminItemCreator.CreateContainerAsync(remoteContentProvider, fullName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +81,8 @@ public class LocalItemCreator : ItemCreatorBase<ILocalContentProvider>
|
||||
}
|
||||
|
||||
var adminItemCreator = await _adminContentAccessorFactory.CreateAdminItemCreatorAsync();
|
||||
await adminItemCreator.CreateElementAsync(_adminContentProvider, fullName);
|
||||
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
|
||||
await adminItemCreator.CreateElementAsync(remoteContentProvider, fullName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
|
||||
public class LocalItemDeleter : IItemDeleter<ILocalContentProvider>
|
||||
{
|
||||
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
|
||||
private readonly IAdminContentProvider _adminContentProvider;
|
||||
private readonly IAdminElevationManager _adminElevationManager;
|
||||
private readonly ILogger<LocalItemDeleter> _logger;
|
||||
|
||||
public LocalItemDeleter(
|
||||
IAdminContentAccessorFactory adminContentAccessorFactory,
|
||||
IAdminContentProvider adminContentProvider,
|
||||
IAdminElevationManager adminElevationManager,
|
||||
ILogger<LocalItemDeleter> logger)
|
||||
{
|
||||
_adminContentAccessorFactory = adminContentAccessorFactory;
|
||||
_adminContentProvider = adminContentProvider;
|
||||
_adminElevationManager = adminElevationManager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,8 @@ public class LocalItemDeleter : IItemDeleter<ILocalContentProvider>
|
||||
}
|
||||
|
||||
var adminItemDeleter = await _adminContentAccessorFactory.CreateAdminItemDeleterAsync();
|
||||
await adminItemDeleter.DeleteAsync(_adminContentProvider, fullName);
|
||||
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
|
||||
await adminItemDeleter.DeleteAsync(remoteContentProvider, fullName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,16 +8,16 @@ namespace FileTime.Providers.Local;
|
||||
public class LocalItemMover : IItemMover<ILocalContentProvider>
|
||||
{
|
||||
private readonly IAdminContentAccessorFactory _adminContentAccessorFactory;
|
||||
private readonly IAdminContentProvider _adminContentProvider;
|
||||
private readonly IAdminElevationManager _adminElevationManager;
|
||||
private readonly ILogger<LocalItemMover> _logger;
|
||||
|
||||
public LocalItemMover(
|
||||
IAdminContentAccessorFactory adminContentAccessorFactory,
|
||||
IAdminContentProvider adminContentProvider,
|
||||
IAdminElevationManager adminElevationManager,
|
||||
ILogger<LocalItemMover> logger)
|
||||
{
|
||||
_adminContentAccessorFactory = adminContentAccessorFactory;
|
||||
_adminContentProvider = adminContentProvider;
|
||||
_adminElevationManager = adminElevationManager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,8 @@ public class LocalItemMover : IItemMover<ILocalContentProvider>
|
||||
}
|
||||
|
||||
var adminItemMover = await _adminContentAccessorFactory.CreateAdminItemMoverAsync();
|
||||
await adminItemMover.RenameAsync(_adminContentProvider, fullName, newPath);
|
||||
var remoteContentProvider = await _adminElevationManager.GetRemoteContentProviderAsync();
|
||||
await adminItemMover.RenameAsync(remoteContentProvider, fullName, newPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.Remote\FileTime.Providers.Remote.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -6,8 +6,8 @@ namespace FileTime.Providers.LocalAdmin;
|
||||
public interface IAdminContentAccessorFactory
|
||||
{
|
||||
bool IsAdminModeSupported { get; }
|
||||
Task<IRemoteItemCreator> CreateAdminItemCreatorAsync();
|
||||
Task<IRemoteItemDeleter> CreateAdminItemDeleterAsync();
|
||||
Task<IRemoteItemMover> CreateAdminItemMoverAsync();
|
||||
Task<IRemoteContentWriter> CreateContentWriterAsync(NativePath nativePath);
|
||||
Task<RemoteItemCreator> CreateAdminItemCreatorAsync();
|
||||
Task<RemoteItemDeleter> CreateAdminItemDeleterAsync();
|
||||
Task<RemoteItemMover> CreateAdminItemMoverAsync();
|
||||
Task<RemoteContentWriter> CreateContentWriterAsync(NativePath nativePath);
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
|
||||
namespace FileTime.Providers.LocalAdmin;
|
||||
|
||||
public interface IAdminContentProvider : IContentProvider
|
||||
{
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using FileTime.Server.Common;
|
||||
using FileTime.Providers.Remote;
|
||||
|
||||
namespace FileTime.Providers.LocalAdmin;
|
||||
|
||||
@@ -6,7 +6,7 @@ public interface IAdminElevationManager
|
||||
{
|
||||
bool IsAdminModeSupported { get; }
|
||||
bool IsAdminInstanceRunning { get; }
|
||||
Task<IRemoteConnection> CreateConnectionAsync();
|
||||
Task<IRemoteContentProvider> GetRemoteContentProviderAsync();
|
||||
string ProviderName { get; }
|
||||
Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null);
|
||||
}
|
||||
@@ -22,34 +22,34 @@ public class AdminContentAccessorFactory : IAdminContentAccessorFactory
|
||||
|
||||
public bool IsAdminModeSupported => _adminElevationManager.IsAdminModeSupported;
|
||||
|
||||
public async Task<IRemoteItemCreator> CreateAdminItemCreatorAsync()
|
||||
=> await CreateHelperAsync<IRemoteItemCreator>();
|
||||
public async Task<RemoteItemCreator> CreateAdminItemCreatorAsync()
|
||||
=> await CreateHelperAsync<RemoteItemCreator>();
|
||||
|
||||
public async Task<IRemoteItemDeleter> CreateAdminItemDeleterAsync()
|
||||
=> await CreateHelperAsync<IRemoteItemDeleter>();
|
||||
public async Task<RemoteItemDeleter> CreateAdminItemDeleterAsync()
|
||||
=> await CreateHelperAsync<RemoteItemDeleter>();
|
||||
|
||||
public async Task<IRemoteItemMover> CreateAdminItemMoverAsync()
|
||||
=> await CreateHelperAsync<IRemoteItemMover>();
|
||||
public async Task<RemoteItemMover> CreateAdminItemMoverAsync()
|
||||
=> await CreateHelperAsync<RemoteItemMover>();
|
||||
|
||||
public async Task<IRemoteContentWriter> CreateContentWriterAsync(NativePath nativePath)
|
||||
public async Task<RemoteContentWriter> CreateContentWriterAsync(NativePath nativePath)
|
||||
{
|
||||
await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync();
|
||||
var connection = await _adminElevationManager.CreateConnectionAsync();
|
||||
var connection = await _adminElevationManager.GetRemoteContentProviderAsync();
|
||||
var contentWriter = _serviceProvider.GetInitableResolver(
|
||||
connection,
|
||||
_adminElevationManager.ProviderName,
|
||||
nativePath,
|
||||
Guid.NewGuid()
|
||||
).GetRequiredService<IRemoteContentWriter>();
|
||||
).GetRequiredService<RemoteContentWriter>();
|
||||
|
||||
return contentWriter;
|
||||
}
|
||||
|
||||
private async Task<T> CreateHelperAsync<T>()
|
||||
where T : class, IInitable<IRemoteConnection, string>
|
||||
where T : class, IInitable<IRemoteContentProvider, string>
|
||||
{
|
||||
await _adminElevationManager.CreateAdminInstanceIfNecessaryAsync();
|
||||
var connection = await _adminElevationManager.CreateConnectionAsync();
|
||||
var connection = await _adminElevationManager.GetRemoteContentProviderAsync();
|
||||
|
||||
Debug.Assert(connection != null);
|
||||
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
using FileTime.Core.Enums;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Core.Timeline;
|
||||
using FileTime.Providers.Remote;
|
||||
|
||||
namespace FileTime.Providers.LocalAdmin;
|
||||
|
||||
//TODO: this should be a RemoteContentProvider if there will be one
|
||||
public class AdminContentProvider : RemoteContentProvider, IAdminContentProvider
|
||||
{
|
||||
public AdminContentProvider(ITimelessContentProvider timelessContentProvider) : base(timelessContentProvider, "local", "localAdmin")
|
||||
{
|
||||
}
|
||||
|
||||
public override Task<IItem> GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, AbsolutePathType forceResolvePathType = AbsolutePathType.Unknown, ItemInitializationSettings itemInitializationSettings = default)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public override NativePath GetNativePath(FullName fullName)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public override FullName GetFullName(NativePath nativePath)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public override Task<byte[]?> GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public override bool CanHandlePath(NativePath path)
|
||||
=> throw new NotImplementedException();
|
||||
}
|
||||
@@ -3,8 +3,9 @@ using System.Diagnostics;
|
||||
using System.Runtime.CompilerServices;
|
||||
using FileTime.App.Core.Services;
|
||||
using FileTime.Core.Interactions;
|
||||
using FileTime.Core.Timeline;
|
||||
using FileTime.Providers.Local;
|
||||
using FileTime.Server.Common;
|
||||
using FileTime.Providers.Remote;
|
||||
using FileTime.Server.Common.Connections.SignalR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
@@ -20,12 +21,14 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
|
||||
|
||||
private readonly SemaphoreSlim _lock = new(1, 1);
|
||||
private readonly IUserCommunicationService _dialogService;
|
||||
private readonly ITimelessContentProvider _timelessContentProvider;
|
||||
private readonly ILogger<AdminElevationManager> _logger;
|
||||
private readonly IOptionsMonitor<AdminElevationConfiguration> _configuration;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private ConnectionInfo? _connectionInfo;
|
||||
private bool _isAdminInstanceRunning;
|
||||
private Process? _adminProcess;
|
||||
private RemoteContentProvider? _remoteContentProvider;
|
||||
|
||||
public bool IsAdminModeSupported => true;
|
||||
private bool StartProcess => _configuration.CurrentValue.StartProcess ?? true;
|
||||
@@ -40,12 +43,14 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
|
||||
|
||||
public AdminElevationManager(
|
||||
IUserCommunicationService dialogService,
|
||||
ITimelessContentProvider timelessContentProvider,
|
||||
ILogger<AdminElevationManager> logger,
|
||||
IOptionsMonitor<AdminElevationConfiguration> configuration,
|
||||
IServiceProvider serviceProvider
|
||||
)
|
||||
{
|
||||
_dialogService = dialogService;
|
||||
_timelessContentProvider = timelessContentProvider;
|
||||
_logger = logger;
|
||||
_configuration = configuration;
|
||||
_serviceProvider = serviceProvider;
|
||||
@@ -126,16 +131,25 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IRemoteConnection> CreateConnectionAsync()
|
||||
//Note: this does not have to return a task
|
||||
public Task<IRemoteContentProvider> GetRemoteContentProviderAsync()
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(_connectionInfo);
|
||||
try
|
||||
{
|
||||
if (_remoteContentProvider != null) return Task.FromResult((IRemoteContentProvider)_remoteContentProvider);
|
||||
|
||||
ArgumentNullException.ThrowIfNull(_connectionInfo);
|
||||
//TODO: use other connections too (if there will be any)
|
||||
ArgumentNullException.ThrowIfNull(_connectionInfo.SignalRBaseUrl);
|
||||
|
||||
var connection = await SignalRConnection.GetOrCreateForAsync(_connectionInfo.SignalRBaseUrl);
|
||||
return connection;
|
||||
_remoteContentProvider = new RemoteContentProvider(
|
||||
_timelessContentProvider,
|
||||
async () => await SignalRConnection.GetOrCreateForAsync(_connectionInfo.SignalRBaseUrl),
|
||||
"local",
|
||||
"localAdminRemote"
|
||||
);
|
||||
|
||||
return Task.FromResult((IRemoteContentProvider)_remoteContentProvider);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -181,8 +195,8 @@ public class AdminElevationManager : IAdminElevationManager, INotifyPropertyChan
|
||||
try
|
||||
{
|
||||
_logger.LogInformation("Stopping admin process");
|
||||
var connection = await CreateConnectionAsync();
|
||||
await connection.Exit();
|
||||
var connection = await GetRemoteContentProviderAsync();
|
||||
await (await connection.GetRemoteConnectionAsync()).Exit();
|
||||
_logger.LogInformation("Admin process stopped successfully");
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<ProjectReference Include="..\..\Server\FileTime.Server.Common\FileTime.Server.Common.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.Local.Abstractions\FileTime.Providers.Local.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.LocalAdmin.Abstractions\FileTime.Providers.LocalAdmin.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.Remote\FileTime.Providers.Remote.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ public static class Startup
|
||||
{
|
||||
services.AddOptions<AdminElevationConfiguration>().Bind(configuration.GetSection(AdminElevationConfiguration.SectionName));
|
||||
services.TryAddSingleton<IAdminContentAccessorFactory, AdminContentAccessorFactory>();
|
||||
services.TryAddSingleton<IAdminContentProvider, AdminContentProvider>();
|
||||
services.TryAddSingleton<AdminElevationManager>();
|
||||
services.TryAddSingleton<IAdminElevationManager>(sp => sp.GetRequiredService<AdminElevationManager>());
|
||||
services.AddSingleton<IExitHandler>(sp => sp.GetRequiredService<AdminElevationManager>());
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Server.Common;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public interface IRemoteContentProvider : IContentProvider
|
||||
{
|
||||
|
||||
Task<IRemoteConnection> GetRemoteConnectionAsync();
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Server.Common;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public interface IRemoteContentWriter :
|
||||
IContentWriter,
|
||||
IInitable<IRemoteConnection, string, NativePath, Guid>
|
||||
{
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Server.Common;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public interface IRemoteItemCreator :
|
||||
IItemCreator<IRemoteContentProvider>,
|
||||
IInitable<IRemoteConnection, string>
|
||||
{
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Server.Common;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public interface IRemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteConnection, string>
|
||||
{
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Server.Common;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public interface IRemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteConnection, string>
|
||||
{
|
||||
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\Core\FileTime.Core.Abstraction\FileTime.Core.Abstraction.csproj" />
|
||||
<ProjectReference Include="..\..\Core\FileTime.Core.ContentAccess\FileTime.Core.ContentAccess.csproj" />
|
||||
<ProjectReference Include="..\..\Server\FileTime.Server.Common.Abstractions\FileTime.Server.Common.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\FileTime.Providers.Remote.Abstractions\FileTime.Providers.Remote.Abstractions.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -2,18 +2,25 @@
|
||||
using FileTime.Core.Enums;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Core.Timeline;
|
||||
using FileTime.Server.Common;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider
|
||||
public sealed class RemoteContentProvider : ContentProviderBase, IRemoteContentProvider
|
||||
{
|
||||
private readonly Func<Task<IRemoteConnection>> _remoteConnectionProvider;
|
||||
|
||||
public RemoteContentProvider(
|
||||
ITimelessContentProvider timelessContentProvider,
|
||||
Func<Task<IRemoteConnection>> remoteConnectionProvider,
|
||||
string remoteName,
|
||||
string name = "remote")
|
||||
: base(name, timelessContentProvider)
|
||||
{
|
||||
_remoteConnectionProvider = remoteConnectionProvider;
|
||||
}
|
||||
public async Task<IRemoteConnection> GetRemoteConnectionAsync()
|
||||
=> await _remoteConnectionProvider();
|
||||
|
||||
//TODO implement
|
||||
public override Task<IItem> GetItemByNativePathAsync(NativePath nativePath, PointInTime pointInTime, bool forceResolve = false, AbsolutePathType forceResolvePathType = AbsolutePathType.Unknown, ItemInitializationSettings itemInitializationSettings = default) => throw new NotImplementedException();
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Server.Common;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public class RemoteContentWriter : IRemoteContentWriter
|
||||
public class RemoteContentWriter : IContentWriter, IInitable<IRemoteContentProvider, string, NativePath, Guid>
|
||||
{
|
||||
private IRemoteConnection _remoteConnection = null!;
|
||||
private IRemoteContentProvider _remoteContentProvider = null!;
|
||||
private string _remoteContentProviderId = null!;
|
||||
private NativePath _nativePath = null!;
|
||||
private string _transactionId = null!;
|
||||
private bool _isRemoteWriterInitialized;
|
||||
|
||||
public void Init(
|
||||
IRemoteConnection remoteConnection,
|
||||
IRemoteContentProvider remoteContentProvider,
|
||||
string remoteContentProviderId,
|
||||
NativePath nativePath,
|
||||
Guid transactionId)
|
||||
{
|
||||
_remoteConnection = remoteConnection;
|
||||
_remoteContentProvider = remoteContentProvider;
|
||||
_remoteContentProviderId = remoteContentProviderId;
|
||||
_nativePath = nativePath;
|
||||
_transactionId = transactionId.ToString();
|
||||
@@ -27,7 +28,7 @@ public class RemoteContentWriter : IRemoteContentWriter
|
||||
public void Dispose()
|
||||
{
|
||||
if (!_isRemoteWriterInitialized) return;
|
||||
_remoteConnection.CloseWriterAsync(_transactionId);
|
||||
Task.Run(async () => await (await _remoteContentProvider.GetRemoteConnectionAsync()).CloseWriterAsync(_transactionId));
|
||||
}
|
||||
|
||||
public int PreferredBufferSize => 10 * 1024 * 1024;
|
||||
@@ -35,13 +36,13 @@ public class RemoteContentWriter : IRemoteContentWriter
|
||||
public async Task WriteBytesAsync(byte[] data, int? index = null, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!_isRemoteWriterInitialized) await InitializeRemoteWriter(_nativePath);
|
||||
await _remoteConnection.WriteBytesAsync(_transactionId, data, index, cancellationToken);
|
||||
await (await _remoteContentProvider.GetRemoteConnectionAsync()).WriteBytesAsync(_transactionId, data, index, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task FlushAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!_isRemoteWriterInitialized) return;
|
||||
await _remoteConnection.FlushWriterAsync(_transactionId, cancellationToken);
|
||||
await (await _remoteContentProvider.GetRemoteConnectionAsync()).FlushWriterAsync(_transactionId, cancellationToken);
|
||||
}
|
||||
|
||||
public Stream AsStream() => new ContentAccessStream(this);
|
||||
@@ -49,6 +50,6 @@ public class RemoteContentWriter : IRemoteContentWriter
|
||||
private async Task InitializeRemoteWriter(NativePath nativePath)
|
||||
{
|
||||
_isRemoteWriterInitialized = true;
|
||||
await _remoteConnection.InitializeRemoteWriter(_remoteContentProviderId, _transactionId, nativePath);
|
||||
await (await _remoteContentProvider.GetRemoteConnectionAsync()).InitializeRemoteWriter(_remoteContentProviderId, _transactionId, nativePath);
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,26 @@
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Server.Common;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public class RemoteItemCreator :
|
||||
ItemCreatorBase<IRemoteContentProvider>,
|
||||
IRemoteItemCreator
|
||||
IInitable<IRemoteContentProvider, string>
|
||||
{
|
||||
private IRemoteConnection _remoteConnection = null!;
|
||||
private IRemoteContentProvider _remoteContentProvider = null!;
|
||||
private string _remoteContentProviderId = null!;
|
||||
public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId)
|
||||
|
||||
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId)
|
||||
{
|
||||
_remoteConnection = remoteConnection;
|
||||
_remoteContentProvider = remoteConnection;
|
||||
_remoteContentProviderId = remoteContentProviderId;
|
||||
}
|
||||
|
||||
public override async Task CreateContainerAsync(IRemoteContentProvider contentProvider, FullName fullName)
|
||||
=> await _remoteConnection.CreateContainerAsync(_remoteContentProviderId, fullName);
|
||||
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateContainerAsync(_remoteContentProviderId, fullName);
|
||||
|
||||
public override async Task CreateElementAsync(IRemoteContentProvider contentProvider, FullName fullName)
|
||||
=> await _remoteConnection.CreateElementAsync(_remoteContentProviderId, fullName);
|
||||
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).CreateElementAsync(_remoteContentProviderId, fullName);
|
||||
}
|
||||
@@ -1,17 +1,20 @@
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Server.Common;
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Core.Models;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public class RemoteItemDeleter : IRemoteItemDeleter
|
||||
public class RemoteItemDeleter : IItemDeleter<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
|
||||
{
|
||||
private IRemoteConnection _remoteConnection = null!;
|
||||
private IRemoteContentProvider _remoteContentProvider = null!;
|
||||
private string _remoteContentProviderId = null!;
|
||||
public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId)
|
||||
|
||||
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId)
|
||||
{
|
||||
_remoteConnection = remoteConnection;
|
||||
_remoteContentProvider = remoteConnection;
|
||||
_remoteContentProviderId = remoteContentProviderId;
|
||||
}
|
||||
|
||||
public async Task DeleteAsync(IRemoteContentProvider contentProvider, FullName fullName)
|
||||
=> await _remoteConnection.DeleteItemAsync(_remoteContentProviderId, fullName);
|
||||
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).DeleteItemAsync(_remoteContentProviderId, fullName);
|
||||
}
|
||||
@@ -1,19 +1,20 @@
|
||||
using FileTime.Core.Models;
|
||||
using FileTime.Server.Common;
|
||||
using FileTime.Core.ContentAccess;
|
||||
using FileTime.Core.Models;
|
||||
using InitableService;
|
||||
|
||||
namespace FileTime.Providers.Remote;
|
||||
|
||||
public class RemoteItemMover : IRemoteItemMover
|
||||
public class RemoteItemMover : IItemMover<IRemoteContentProvider>, IInitable<IRemoteContentProvider, string>
|
||||
{
|
||||
|
||||
private IRemoteConnection _remoteConnection = null!;
|
||||
private IRemoteContentProvider _remoteContentProvider = null!;
|
||||
private string _remoteContentProviderId = null!;
|
||||
public void Init(IRemoteConnection remoteConnection, string remoteContentProviderId)
|
||||
|
||||
public void Init(IRemoteContentProvider remoteConnection, string remoteContentProviderId)
|
||||
{
|
||||
_remoteConnection = remoteConnection;
|
||||
_remoteContentProvider = remoteConnection;
|
||||
_remoteContentProviderId = remoteContentProviderId;
|
||||
}
|
||||
|
||||
public async Task RenameAsync(IRemoteContentProvider contentProvider, FullName fullName, FullName newPath)
|
||||
=> await _remoteConnection.MoveItemAsync(_remoteContentProviderId, fullName, newPath);
|
||||
=> await (await _remoteContentProvider.GetRemoteConnectionAsync()).MoveItemAsync(_remoteContentProviderId, fullName, newPath);
|
||||
}
|
||||
@@ -8,10 +8,10 @@ public static class Startup
|
||||
public static IServiceCollection AddRemoteProviderServices(this IServiceCollection serviceCollection)
|
||||
{
|
||||
serviceCollection.TryAddSingleton<IRemoteContentProvider, RemoteContentProvider>();
|
||||
serviceCollection.TryAddTransient<IRemoteItemCreator, RemoteItemCreator>();
|
||||
serviceCollection.TryAddTransient<IRemoteItemDeleter, RemoteItemDeleter>();
|
||||
serviceCollection.TryAddTransient<IRemoteItemMover, RemoteItemMover>();
|
||||
serviceCollection.TryAddTransient<IRemoteContentWriter, RemoteContentWriter>();
|
||||
serviceCollection.TryAddTransient<RemoteItemCreator>();
|
||||
serviceCollection.TryAddTransient<RemoteItemDeleter>();
|
||||
serviceCollection.TryAddTransient<RemoteItemMover>();
|
||||
serviceCollection.TryAddTransient<RemoteContentWriter>();
|
||||
return serviceCollection;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using FileTime.Providers.LocalAdmin;
|
||||
using FileTime.Providers.Remote;
|
||||
using FileTime.Server.Common;
|
||||
|
||||
namespace FileTime.Server.App;
|
||||
@@ -6,7 +7,7 @@ namespace FileTime.Server.App;
|
||||
public class DummyAdminElevationManager : IAdminElevationManager
|
||||
{
|
||||
public bool IsAdminInstanceRunning => throw new NotImplementedException();
|
||||
public Task<IRemoteConnection> CreateConnectionAsync() => throw new NotImplementedException();
|
||||
public Task<IRemoteContentProvider> GetRemoteContentProviderAsync() => throw new NotImplementedException();
|
||||
|
||||
public string ProviderName => throw new NotImplementedException();
|
||||
public Task CreateAdminInstanceIfNecessaryAsync(string? confirmationMessage = null) => throw new NotImplementedException();
|
||||
|
||||
Reference in New Issue
Block a user