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