54 lines
1.8 KiB
C#
54 lines
1.8 KiB
C#
using FileTime.Core.ContentAccess;
|
|
using FileTime.Core.Models;
|
|
using FileTime.Server.Common;
|
|
|
|
namespace FileTime.Providers.Remote;
|
|
|
|
public class RemoteContentWriter : IRemoteContentWriter
|
|
{
|
|
private IRemoteConnection _remoteConnection = null!;
|
|
private string _remoteContentProviderId = null!;
|
|
private NativePath _nativePath = null!;
|
|
private string _transactionId = null!;
|
|
private bool _isRemoteWriterInitialized;
|
|
|
|
public void Init(
|
|
IRemoteConnection remoteConnection,
|
|
string remoteContentProviderId,
|
|
NativePath nativePath,
|
|
Guid transactionId)
|
|
{
|
|
_remoteConnection = remoteConnection;
|
|
_remoteContentProviderId = remoteContentProviderId;
|
|
_nativePath = nativePath;
|
|
_transactionId = transactionId.ToString();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (!_isRemoteWriterInitialized) return;
|
|
_remoteConnection.CloseWriterAsync(_transactionId);
|
|
}
|
|
|
|
public int PreferredBufferSize => 10 * 1024 * 1024;
|
|
|
|
public async Task WriteBytesAsync(byte[] data, int? index = null, CancellationToken cancellationToken = default)
|
|
{
|
|
if (!_isRemoteWriterInitialized) await InitializeRemoteWriter(_nativePath);
|
|
await _remoteConnection.WriteBytesAsync(_transactionId, data, index, cancellationToken);
|
|
}
|
|
|
|
public async Task FlushAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
if (!_isRemoteWriterInitialized) return;
|
|
await _remoteConnection.FlushWriterAsync(_transactionId, cancellationToken);
|
|
}
|
|
|
|
public Stream AsStream() => new ContentAccessStream(this);
|
|
|
|
private async Task InitializeRemoteWriter(NativePath nativePath)
|
|
{
|
|
_isRemoteWriterInitialized = true;
|
|
await _remoteConnection.InitializeRemoteWriter(_remoteContentProviderId, _transactionId, nativePath);
|
|
}
|
|
} |