| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | 
							- using System.Collections.Concurrent;
 
- using System.Diagnostics;
 
- using Universal;
 
- namespace EEMSClientCore;
 
- public class ClientProvider(IClientCaller clientCaller, IClientBaseProvider baseProvider) : IClientProvider
 
- {
 
-     private static readonly ConcurrentDictionary<FileType, MemoryStream> _streamBuffer = [];
 
-     public static readonly ConcurrentDictionary<FileType, string> _savePath = [];
 
-     //Receive Files from Server
 
-     public Task<bool> PushFile(Guid guid, FileType fileType, byte[] buffer, int current, int total)
 
-     {
 
-         if (baseProvider is null)
 
-             return Task.FromResult(false);
 
-         if (!_streamBuffer.TryGetValue(fileType, out MemoryStream? stream) || stream is null)
 
-         {
 
-             if (current != 1)
 
-                 return Task.FromResult(false);
 
-             if (!baseProvider.AllowReceiveFile())
 
-                 return Task.FromResult(false);
 
-             baseProvider.StartFileReceiveNotify(fileType);
 
-             stream = new();
 
-             _streamBuffer[fileType] = stream;
 
-             Timer timer = new(FileCleanerTimerCallback, fileType, 600000, Timeout.Infinite);
 
-         }
 
-         stream.Write(buffer);
 
-         if (current != total)
 
-             return Task.FromResult(true);
 
-         string? tempPath = fileType switch
 
-         {
 
-             FileType.Recipe => baseProvider.RecipePath,
 
-             FileType.Config => baseProvider.ConfigPath,
 
-             _ => "Undefined"
 
-         };
 
-         tempPath ??= "Undefined";
 
-         string path = Path.Combine(tempPath, "Receive");
 
-         if (!Compressor.DecompressZipFile(new(path), stream))
 
-             return Task.FromResult(false);
 
-         if (_streamBuffer.TryRemove(fileType, out MemoryStream? memoryStream) && memoryStream is not null)
 
-             memoryStream.Dispose();
 
-         baseProvider?.FileReceivedNotify(fileType, path);
 
-         return Task.FromResult(true);
 
-     }
 
-     public Task<bool> RequestFile(Guid guid, FileType fileType)
 
-     {
 
-         Debug.WriteLine($"RequestFile {guid} {fileType}");
 
-         string? filePath = fileType switch
 
-         {
 
-             FileType.Config => baseProvider.ConfigPath,
 
-             FileType.Recipe => baseProvider.RecipePath,
 
-             _ => default
 
-         };
 
-         if (string.IsNullOrEmpty(filePath))
 
-             return Task.FromResult(false);
 
-         if (!Directory.Exists(filePath))
 
-             return Task.FromResult(false);
 
-         using MemoryStream stream = new();
 
-         Compressor.CompressZipFileDirectory(new(filePath), stream);
 
-         return SendFile(guid, stream);
 
-     }
 
-     private async Task<bool> SendFile(Guid guid, MemoryStream stream)
 
-     {
 
-         if (!stream.Split(out List<byte[]>? buffer, 8192) || buffer is null)
 
-             return false;
 
-         for (int i = 0; i < buffer.Count; i++)
 
-         {
 
-             try
 
-             {
 
-                 if (!await clientCaller.FilePack(guid, buffer[i], i + 1, buffer.Count))
 
-                     return false;
 
-             }
 
-             catch
 
-             {
 
-                 return false;
 
-             }
 
-         }
 
-         return true;
 
-     }
 
-     private void FileCleanerTimerCallback(object? state)
 
-     {
 
-         if (state is not FileType fileType)
 
-             return;
 
-         if (_streamBuffer.TryRemove(fileType, out MemoryStream? memoryStream) && memoryStream is not null)
 
-             memoryStream.Dispose();
 
-     }
 
- }
 
- public interface IClientBaseProvider
 
- {
 
-     string? RecipePath { get; set; }
 
-     string? ConfigPath { get; set; }
 
-     bool AllowReceiveFile();
 
-     void FileReceivedNotify(FileType fileType, string path);
 
-     void StartFileReceiveNotify(FileType fileType);
 
- }
 
 
  |