Explorar o código

Update IClient Interface

Zixuan hai 16 horas
pai
achega
efcfce8f43

+ 7 - 5
Server/EEMSClientCore/ClientCaller.cs

@@ -1,15 +1,17 @@
-namespace EEMSClientCore;
+using Universal;
 
-public class ClientCaller : IClientCaller
+namespace EEMSClientCore;
+
+public partial class HubBase : IClientCaller
 {
     Task<Guid> IClientCaller.RegisterDevice(DeviceInfo deviceInfo)
     {
-        HubBase.Invoke("RegisterDevice", deviceInfo, out Guid guid);
+        this.Invoke("RegisterDevice", deviceInfo, out Guid guid);
         return Task.FromResult(guid);
     }
 
     Task<bool> IClientCaller.FilePack(Guid guid, byte[] buffer, int current, int total)
     {
-        return HubBase.Send("FilePack", guid, buffer, current, total);
+        return this.Send("FilePack", guid, buffer, current, total);
     }
-}
+}

+ 56 - 0
Server/EEMSClientCore/ClientProvider.cs

@@ -0,0 +1,56 @@
+using System.Diagnostics;
+using Universal;
+
+namespace EEMSClientCore;
+
+public class ClientProvider(IClientCaller clientCaller, IClientBaseProvider baseProvider) : IClientProvider
+{
+    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;
+    }
+}
+
+public interface IClientBaseProvider
+{
+    public string? RecipePath { get; set; }
+    public string? ConfigPath { get; set; }
+}

+ 15 - 16
Server/EEMSClientCore/HubBase.cs

@@ -2,20 +2,18 @@
 
 namespace EEMSClientCore;
 
-public class HubBase : IDisposable
+public partial class HubBase(IClientBaseProvider baseProvider) : IDisposable
 {
     private IClientProvider? _clientProvider;
-    private static HubConnection? _HubConnection;
+    private HubConnection? _HubConnection;
 
-    public bool Initialize(IClientProvider clientProvider)
+    public bool Initialize()
     {
         if (_HubConnection is not null)
             return false;
         if (_clientProvider is not null)
             return false;
-
-        this._clientProvider = clientProvider;
-
+        this._clientProvider = new ClientProvider(this, baseProvider);
         return true;
     }
 
@@ -49,7 +47,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static bool CheckConnect()
+    protected bool CheckConnect()
     {
         if (_HubConnection is null)
             return false;
@@ -59,7 +57,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static async Task<bool> Send(string name)
+    protected async Task<bool> Send(string name)
     {
         if (!CheckConnect())
             return false;
@@ -76,7 +74,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static async Task<bool> Send<T1>(string name, T1 para1)
+    protected async Task<bool> Send<T1>(string name, T1 para1)
     {
         if (!CheckConnect())
             return false;
@@ -93,7 +91,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static async Task<bool> Send<T1, T2>(string name, T1 para1, T2 para2)
+    protected async Task<bool> Send<T1, T2>(string name, T1 para1, T2 para2)
     {
         if (!CheckConnect())
             return false;
@@ -110,7 +108,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static async Task<bool> Send<T1, T2, T3>(string name, T1 para1, T2 para2, T3 para3)
+    protected async Task<bool> Send<T1, T2, T3>(string name, T1 para1, T2 para2, T3 para3)
     {
         if (!CheckConnect())
             return false;
@@ -127,7 +125,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static async Task<bool> Send<T1, T2, T3, T4>(string name, T1 para1, T2 para2, T3 para3, T4 para4)
+    protected async Task<bool> Send<T1, T2, T3, T4>(string name, T1 para1, T2 para2, T3 para3, T4 para4)
     {
         if (!CheckConnect())
             return false;
@@ -144,7 +142,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static bool Invoke<T_Return>(string name, out T_Return? returnValue)
+    protected bool Invoke<T_Return>(string name, out T_Return? returnValue)
     {
         returnValue = default;
 
@@ -163,7 +161,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static bool Invoke<T_Return, T_para1>(string name, T_para1 para1, out T_Return? returnValue)
+    protected bool Invoke<T_Return, T_para1>(string name, T_para1 para1, out T_Return? returnValue)
     {
         returnValue = default;
 
@@ -182,7 +180,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static bool Invoke<T_Return, T_para1, T_Para2>(string name, T_para1 para1, T_Para2 para2, out T_Return? returnValue)
+    protected bool Invoke<T_Return, T_para1, T_Para2>(string name, T_para1 para1, T_Para2 para2, out T_Return? returnValue)
     {
         returnValue = default;
 
@@ -201,7 +199,7 @@ public class HubBase : IDisposable
         return true;
     }
 
-    public static bool Invoke<T_Return, T_para1, T_Para2, T_Para3>(string name, T_para1 para1, T_Para2 para2, T_Para3 para3, out T_Return? returnValue)
+    protected bool Invoke<T_Return, T_para1, T_Para2, T_Para3>(string name, T_para1 para1, T_Para2 para2, T_Para3 para3, out T_Return? returnValue)
     {
         returnValue = default;
 
@@ -224,5 +222,6 @@ public class HubBase : IDisposable
     {
         _HubConnection?.StopAsync().Wait();
         _HubConnection = null;
+        this._clientProvider = null;
     }
 }

+ 9 - 26
TestSignalRClient/Program.cs

@@ -9,10 +9,10 @@ internal class Program
 {
     static void Main(string[] args)
     {
-        IClientCaller caller = new ClientCaller();
-        IClientProvider provider = new ClientProvider(caller);
-        HubBase hubSender = new();
-        hubSender.Initialize(provider);
+        IClientBaseProvider baseProvider = new ClientBaseProvider();
+        HubBase hubSender = new(baseProvider);
+        IClientCaller caller = hubSender;
+        hubSender.Initialize();
         hubSender.Open("localhost", 50054, "ClientHub");
 
         DeviceInfo deviceInfo = new()
@@ -25,26 +25,9 @@ internal class Program
         Thread.Sleep(-1);
     }
 }
-public class ClientProvider(IClientCaller clientCaller) : IClientProvider
-{
-    Task<bool> IClientProvider.RequestFile(Guid guid, FileType fileType)
-    {
-        Console.WriteLine($"RequestFile {guid} {fileType}");
-        using MemoryStream stream = new();
-        Compressor.CompressZipFileDirectory(new(@"E:\Recipes"), 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++)
-        {
-            if (!await clientCaller.FilePack(guid, buffer[i], i + 1, buffer.Count))
-                return false;
-        }
-        return true;
-    }
-}
+internal class ClientBaseProvider : IClientBaseProvider
+{
+    public string? RecipePath { get; set; }
+    public string? ConfigPath { get; set; }
+}