using System; using System.Collections.Generic; using System.IO; namespace ScreenConnect; public class FileSystemVirtualStreamReceiver : IDisposable { private readonly string basePath; private readonly VirtualStreamReceiver receiver; private readonly Dictionary receiveStreamMap = new Dictionary(); public FileSystemVirtualStreamReceiver(string basePath, Proc messageHandler) { this.basePath = basePath; receiver = new VirtualStreamReceiver(messageHandler); } public bool ProcessMessage(VirtualStreamDataMessage message) { return receiver.ProcessMessage(message); } public void Dispose() { TryReleaseFiles(); } public void TryStartReceiveFiles(IEnumerable files) { foreach (VirtualFileInfo file in files) { try { string text = Path.Combine(basePath, file.FilePath); FileSystemExtensions.DemandInParentPath(basePath, text); if (file.IsDirectory) { FileSystemExtensions.EnsureDirectoryExists(text); continue; } Stream stream = receiver.OpenReadStream(file.StreamID); try { receiveStreamMap[file.StreamID] = (stream, File.Create(text)); } catch { stream.Dispose(); throw; } } catch (Exception ex) { TypeTrace.TraceException(ex); } } } public string TryTransferAsyncStreamData(Guid streamID) { string result = null; if (receiveStreamMap.TryGetValue(streamID, out (Stream, FileStream) value)) { (Stream, FileStream) tuple = value; Stream item = tuple.Item1; FileStream item2 = tuple.Item2; long num = item.Length - item.Position; try { byte[] array = new byte[num]; item.Read(array, 0, array.Length); item2.Write(array, 0, array.Length); } catch { num = 0L; } if (num == 0L) { result = item2.Name; item.DisposeQuietly(); item2.DisposeQuietly(); receiver.ReleaseStream(streamID); receiveStreamMap.Remove(streamID); } } return result; } public void TryReleaseFiles() { foreach (KeyValuePair item in receiveStreamMap) { Extensions.Deconstruct(item, out var key, out var value); (Stream, FileStream) tuple = value; Guid streamID = key; var (disposable, disposable2) = tuple; disposable.DisposeQuietly(); disposable2.DisposeQuietly(); receiver.ReleaseStream(streamID); } } }