From 5fb4c3b40dbce00d7ed094ca41a8b648409870e4 Mon Sep 17 00:00:00 2001 From: Timerix Date: Wed, 29 Sep 2021 18:02:27 +0300 Subject: [PATCH] some changes --- DTLib.csproj | 1 - Dtsod/DtsodV21.cs | 2 +- Network/FSP.cs | 180 ++++++++++++++++++--------------------------- Network/Package.cs | 2 + SafeMutex.cs | 6 ++ SimpleConverter.cs | 2 + 6 files changed, 83 insertions(+), 110 deletions(-) diff --git a/DTLib.csproj b/DTLib.csproj index 97598e4..1b46f80 100644 --- a/DTLib.csproj +++ b/DTLib.csproj @@ -39,7 +39,6 @@ - diff --git a/Dtsod/DtsodV21.cs b/Dtsod/DtsodV21.cs index 250afa9..0b3325e 100644 --- a/Dtsod/DtsodV21.cs +++ b/Dtsod/DtsodV21.cs @@ -16,7 +16,7 @@ namespace DTLib.Dtsod // парсер теперь не может игнорировать комменты, потом починю // теперь числовые значения конвертируются в правильный тип, а не в int64/uint64 (новый вариант switch из c#9.0 делал какую-то херню) // исправлены некоторые другие баги - class DtsodV21 : Dictionary + public class DtsodV21 : Dictionary { static readonly bool debug = false; string Text; diff --git a/Network/FSP.cs b/Network/FSP.cs index 558cdee..8f41242 100644 --- a/Network/FSP.cs +++ b/Network/FSP.cs @@ -11,7 +11,7 @@ namespace DTLib.Network // public class FSP { - Socket mainSocket; + Socket mainSocket { get; init; } static public bool debug = false; public FSP(Socket _mainSocket) => mainSocket = _mainSocket; @@ -19,22 +19,23 @@ namespace DTLib.Network public uint BytesUploaded = 0; public uint Filesize = 0; - /*public delegate void PackageTransferDel(uint size); - public event PackageTransferDel PackageRecieved; - public event PackageTransferDel PackageSent;*/ + public SafeMutex Mutex = new(); // скачивает файл с помощью FSP протокола public void DownloadFile(string filePath_server, string filePath_client) { - Debug("b", $"requesting file download: {filePath_server}\n"); - mainSocket.SendPackage("requesting file download".ToBytes()); - mainSocket.SendPackage(filePath_server.ToBytes()); + Mutex.Execute(() => + { + Debug("b", $"requesting file download: {filePath_server}\n"); + mainSocket.SendPackage("requesting file download".ToBytes()); + mainSocket.SendPackage(filePath_server.ToBytes()); + }, out var exception); + exception?.Throw(); DownloadFile(filePath_client); } public void DownloadFile(string filePath_client) { - BytesDownloaded = 0; using System.IO.Stream fileStream = File.OpenWrite(filePath_client); Download_SharedCode(fileStream, true); fileStream.Close(); @@ -43,17 +44,20 @@ namespace DTLib.Network public byte[] DownloadFileToMemory(string filePath_server) { - Debug("b", $"requesting file download: {filePath_server}\n"); - mainSocket.SendPackage("requesting file download".ToBytes()); - mainSocket.SendPackage(filePath_server.ToBytes()); + Mutex.Execute(() => + { + Debug("b", $"requesting file download: {filePath_server}\n"); + mainSocket.SendPackage("requesting file download".ToBytes()); + mainSocket.SendPackage(filePath_server.ToBytes()); + }, out var exception); + exception?.Throw(); return DownloadFileToMemory(); } public byte[] DownloadFileToMemory() { - BytesDownloaded = 0; using var fileStream = new System.IO.MemoryStream(); - Download_SharedCode(fileStream,false); + Download_SharedCode(fileStream, false); byte[] output = fileStream.GetBuffer(); fileStream.Close(); Debug(new string[] { "g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n" }); @@ -62,125 +66,85 @@ namespace DTLib.Network void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing) { - Filesize = mainSocket.GetPackage().ToStr().ToUInt(); - mainSocket.SendPackage("ready".ToBytes()); - int packagesCount = 0; - byte[] buffer = new byte[5120]; - int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length); - // получение полных пакетов файла - for (byte n = 0; packagesCount < fullPackagesCount; packagesCount++) + Mutex.Execute(() => { - buffer = mainSocket.GetPackage(); - BytesDownloaded += (uint)buffer.Length; - fileStream.Write(buffer, 0, buffer.Length); - if (requiresFlushing) + BytesDownloaded = 0; + Filesize = mainSocket.GetPackage().ToStr().ToUInt(); + mainSocket.SendPackage("ready".ToBytes()); + int packagesCount = 0; + byte[] buffer = new byte[5120]; + int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length); + // получение полных пакетов файла + for (byte n = 0; packagesCount < fullPackagesCount; packagesCount++) { - if (n == 100) + buffer = mainSocket.GetPackage(); + BytesDownloaded += (uint)buffer.Length; + fileStream.Write(buffer, 0, buffer.Length); + if (requiresFlushing) { - fileStream.Flush(); - n = 0; + if (n == 100) + { + fileStream.Flush(); + n = 0; + } + else n++; } - else n++; } - } - // получение остатка - if ((Filesize - fileStream.Position) > 0) - { - mainSocket.SendPackage("remain request".ToBytes()); - buffer = mainSocket.GetPackage(); - BytesDownloaded += (uint)buffer.Length; - fileStream.Write(buffer, 0, buffer.Length); - } + // получение остатка + if ((Filesize - fileStream.Position) > 0) + { + mainSocket.SendPackage("remain request".ToBytes()); + buffer = mainSocket.GetPackage(); + BytesDownloaded += (uint)buffer.Length; + fileStream.Write(buffer, 0, buffer.Length); + } + }, out var exception); + exception?.Throw(); if (requiresFlushing) fileStream.Flush(); } // отдаёт файл с помощью FSP протокола public void UploadFile(string filePath) { + BytesUploaded = 0; Debug("b", $"uploading file {filePath}\n"); - Debug("m", "0\n"); using var fileStream = File.OpenRead(filePath); Filesize = File.GetSize(filePath).ToUInt(); - Debug("m", "1\n"); - mainSocket.SendPackage(Filesize.ToString().ToBytes()); - Debug("m", "2\n"); - mainSocket.GetAnswer("ready"); - Debug("m", "3\n"); - byte[] buffer = new byte[5120]; - int packagesCount = 0; - int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length); - // отправка полных пакетов файла - for (; packagesCount < fullPackagesCount; packagesCount++) + Mutex.Execute(() => { - fileStream.Read(buffer, 0, buffer.Length); - mainSocket.SendPackage(buffer); - BytesUploaded += (uint)buffer.Length; - } - // отправка остатка - if ((Filesize - fileStream.Position) > 0) - { - mainSocket.GetAnswer("remain request"); - buffer = new byte[(Filesize - fileStream.Position).ToInt()]; - fileStream.Read(buffer, 0, buffer.Length); - mainSocket.SendPackage(buffer); - BytesUploaded += (uint)buffer.Length; - } + mainSocket.SendPackage(Filesize.ToString().ToBytes()); + mainSocket.GetAnswer("ready"); + byte[] buffer = new byte[5120]; + int packagesCount = 0; + int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length); + // отправка полных пакетов файла + for (; packagesCount < fullPackagesCount; packagesCount++) + { + fileStream.Read(buffer, 0, buffer.Length); + mainSocket.SendPackage(buffer); + BytesUploaded += (uint)buffer.Length; + } + // отправка остатка + if ((Filesize - fileStream.Position) > 0) + { + mainSocket.GetAnswer("remain request"); + buffer = new byte[(Filesize - fileStream.Position).ToInt()]; + fileStream.Read(buffer, 0, buffer.Length); + mainSocket.SendPackage(buffer); + BytesUploaded += (uint)buffer.Length; + } + }, out var exception); + exception?.Throw(); fileStream.Close(); Debug(new string[] { "g", $" uploaded {BytesUploaded} of {Filesize} bytes\n" }); } - /*public void DownloadByManifest(string manifestString, string dirOnClient, bool overwrite = false, bool delete_excess = false) - { - if (!dirOnClient.EndsWith("\\")) dirOnClient += "\\"; - var manifest = new DtsodV23(manifestString); - Debug("g", $"found {manifest.Values.Count} files in manifest\n"); - var hasher = new Hasher(); - foreach (string fileOnServer in manifest.Keys) - { - string fileOnClient = dirOnClient + fileOnServer; - Debug("b", "file <", "c", fileOnClient, "b", ">... "); - if (!File.Exists(fileOnClient)) - { - DebugNoTime("y", "doesn't exist\n"); - DownloadFile(fileOnServer, fileOnClient); - } - else if (overwrite && hasher.HashFile(fileOnClient).HashToString() != manifest[fileOnServer]) - { - DebugNoTime("y", "outdated\n"); - DownloadFile(fileOnServer, fileOnClient); - } - else DebugNoTime("g", "without changes\n"); - } - // удаление лишних файлов - if (delete_excess) - { - List dirs = new(); - foreach (string file in Directory.GetAllFiles(dirOnClient, ref dirs)) - { - if (!manifest.ContainsKey(file.Remove(0, dirOnClient.Length))) - { - Debug("y", $"deleting excess file: {file}\n"); - File.Delete(file); - } - } - // удаление пустых папок - /*foreach (string dir in dirs) - { - if (Directory.Exists(dir) && Directory.GetAllFiles(dir).Count == 0) - { - Debug("y", $"deleting empty dir: {dir}\n"); - Directory.Delete(dir); - } - }*/ - /*} - }*/ - public void DownloadByManifest(string dirOnServer, string dirOnClient, bool overwrite = false, bool delete_excess = false) { if (!dirOnClient.EndsWith("\\")) dirOnClient += "\\"; if (!dirOnServer.EndsWith("\\")) dirOnServer += "\\"; Debug("b", "downloading manifest <", "c", dirOnServer + "manifest.dtsod", "b", ">\n"); - var manifest = new DtsodV22(DownloadFileToMemory(dirOnServer + "manifest.dtsod").ToStr()); + var manifest = new DtsodV23(DownloadFileToMemory(dirOnServer + "manifest.dtsod").ToStr()); Debug("g", $"found {manifest.Values.Count} files in manifest\n"); var hasher = new Hasher(); foreach (string fileOnServer in manifest.Keys) diff --git a/Network/Package.cs b/Network/Package.cs index 87aabac..8910507 100644 --- a/Network/Package.cs +++ b/Network/Package.cs @@ -46,6 +46,7 @@ namespace DTLib.Network list.AddRange(data); socket.Send(list.ToArray()); } + public static void SendPackage(this Socket socket, string data) => SendPackage(socket, data.ToBytes()); // получает пакет и выбрасывает исключение, если пакет не соответствует образцу public static void GetAnswer(this Socket socket, string answer) @@ -59,5 +60,6 @@ namespace DTLib.Network socket.SendPackage(request); return socket.GetPackage(); } + public static byte[] RequestPackage(this Socket socket, string request) => socket.RequestPackage(request.ToBytes()); } } diff --git a/SafeMutex.cs b/SafeMutex.cs index 1d7ca00..f7daa20 100644 --- a/SafeMutex.cs +++ b/SafeMutex.cs @@ -25,5 +25,11 @@ namespace DTLib if (!isReleased) Mutex.ReleaseMutex(); } } + + public void Execute(Action action) + { + Execute(action, out Exception exception); + exception?.Throw(); + } } } diff --git a/SimpleConverter.cs b/SimpleConverter.cs index 18f7021..c267ce8 100644 --- a/SimpleConverter.cs +++ b/SimpleConverter.cs @@ -143,5 +143,7 @@ namespace DTLib b.Append(input); return b.ToString(); } + + public static void Throw(this Exception ex) => throw ex; } } \ No newline at end of file