some changes

This commit is contained in:
Timerix 2021-09-29 18:02:27 +03:00
parent 21e7e75584
commit 5fb4c3b40d
6 changed files with 83 additions and 110 deletions

View File

@ -39,7 +39,6 @@
<Compile Include="ConsoleGUI\Label.cs" /> <Compile Include="ConsoleGUI\Label.cs" />
<Compile Include="ConsoleGUI\Window.cs" /> <Compile Include="ConsoleGUI\Window.cs" />
<Compile Include="ConsoleGUI\WindowOld.cs" /> <Compile Include="ConsoleGUI\WindowOld.cs" />
<Compile Include="Dtsod\DtsodV22.cs" />
<Compile Include="Dtsod\DtsodV23.cs" /> <Compile Include="Dtsod\DtsodV23.cs" />
<Compile Include="Dtsod\DtsodV21.cs" /> <Compile Include="Dtsod\DtsodV21.cs" />
<Compile Include="cs9somefix.cs" /> <Compile Include="cs9somefix.cs" />

View File

@ -16,7 +16,7 @@ namespace DTLib.Dtsod
// парсер теперь не может игнорировать комменты, потом починю // парсер теперь не может игнорировать комменты, потом починю
// теперь числовые значения конвертируются в правильный тип, а не в int64/uint64 (новый вариант switch из c#9.0 делал какую-то херню) // теперь числовые значения конвертируются в правильный тип, а не в int64/uint64 (новый вариант switch из c#9.0 делал какую-то херню)
// исправлены некоторые другие баги // исправлены некоторые другие баги
class DtsodV21 : Dictionary<string, dynamic> public class DtsodV21 : Dictionary<string, dynamic>
{ {
static readonly bool debug = false; static readonly bool debug = false;
string Text; string Text;

View File

@ -11,7 +11,7 @@ namespace DTLib.Network
// //
public class FSP public class FSP
{ {
Socket mainSocket; Socket mainSocket { get; init; }
static public bool debug = false; static public bool debug = false;
public FSP(Socket _mainSocket) => mainSocket = _mainSocket; public FSP(Socket _mainSocket) => mainSocket = _mainSocket;
@ -19,22 +19,23 @@ namespace DTLib.Network
public uint BytesUploaded = 0; public uint BytesUploaded = 0;
public uint Filesize = 0; public uint Filesize = 0;
/*public delegate void PackageTransferDel(uint size); public SafeMutex Mutex = new();
public event PackageTransferDel PackageRecieved;
public event PackageTransferDel PackageSent;*/
// скачивает файл с помощью FSP протокола // скачивает файл с помощью FSP протокола
public void DownloadFile(string filePath_server, string filePath_client) public void DownloadFile(string filePath_server, string filePath_client)
{
Mutex.Execute(() =>
{ {
Debug("b", $"requesting file download: {filePath_server}\n"); Debug("b", $"requesting file download: {filePath_server}\n");
mainSocket.SendPackage("requesting file download".ToBytes()); mainSocket.SendPackage("requesting file download".ToBytes());
mainSocket.SendPackage(filePath_server.ToBytes()); mainSocket.SendPackage(filePath_server.ToBytes());
}, out var exception);
exception?.Throw();
DownloadFile(filePath_client); DownloadFile(filePath_client);
} }
public void DownloadFile(string filePath_client) public void DownloadFile(string filePath_client)
{ {
BytesDownloaded = 0;
using System.IO.Stream fileStream = File.OpenWrite(filePath_client); using System.IO.Stream fileStream = File.OpenWrite(filePath_client);
Download_SharedCode(fileStream, true); Download_SharedCode(fileStream, true);
fileStream.Close(); fileStream.Close();
@ -42,18 +43,21 @@ namespace DTLib.Network
} }
public byte[] DownloadFileToMemory(string filePath_server) public byte[] DownloadFileToMemory(string filePath_server)
{
Mutex.Execute(() =>
{ {
Debug("b", $"requesting file download: {filePath_server}\n"); Debug("b", $"requesting file download: {filePath_server}\n");
mainSocket.SendPackage("requesting file download".ToBytes()); mainSocket.SendPackage("requesting file download".ToBytes());
mainSocket.SendPackage(filePath_server.ToBytes()); mainSocket.SendPackage(filePath_server.ToBytes());
}, out var exception);
exception?.Throw();
return DownloadFileToMemory(); return DownloadFileToMemory();
} }
public byte[] DownloadFileToMemory() public byte[] DownloadFileToMemory()
{ {
BytesDownloaded = 0;
using var fileStream = new System.IO.MemoryStream(); using var fileStream = new System.IO.MemoryStream();
Download_SharedCode(fileStream,false); Download_SharedCode(fileStream, false);
byte[] output = fileStream.GetBuffer(); byte[] output = fileStream.GetBuffer();
fileStream.Close(); fileStream.Close();
Debug(new string[] { "g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n" }); Debug(new string[] { "g", $" downloaded {BytesDownloaded} of {Filesize} bytes\n" });
@ -62,6 +66,9 @@ namespace DTLib.Network
void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing) void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing)
{ {
Mutex.Execute(() =>
{
BytesDownloaded = 0;
Filesize = mainSocket.GetPackage().ToStr().ToUInt(); Filesize = mainSocket.GetPackage().ToStr().ToUInt();
mainSocket.SendPackage("ready".ToBytes()); mainSocket.SendPackage("ready".ToBytes());
int packagesCount = 0; int packagesCount = 0;
@ -91,21 +98,22 @@ namespace DTLib.Network
BytesDownloaded += (uint)buffer.Length; BytesDownloaded += (uint)buffer.Length;
fileStream.Write(buffer, 0, buffer.Length); fileStream.Write(buffer, 0, buffer.Length);
} }
}, out var exception);
exception?.Throw();
if (requiresFlushing) fileStream.Flush(); if (requiresFlushing) fileStream.Flush();
} }
// отдаёт файл с помощью FSP протокола // отдаёт файл с помощью FSP протокола
public void UploadFile(string filePath) public void UploadFile(string filePath)
{ {
BytesUploaded = 0;
Debug("b", $"uploading file {filePath}\n"); Debug("b", $"uploading file {filePath}\n");
Debug("m", "0\n");
using var fileStream = File.OpenRead(filePath); using var fileStream = File.OpenRead(filePath);
Filesize = File.GetSize(filePath).ToUInt(); Filesize = File.GetSize(filePath).ToUInt();
Debug("m", "1\n"); Mutex.Execute(() =>
{
mainSocket.SendPackage(Filesize.ToString().ToBytes()); mainSocket.SendPackage(Filesize.ToString().ToBytes());
Debug("m", "2\n");
mainSocket.GetAnswer("ready"); mainSocket.GetAnswer("ready");
Debug("m", "3\n");
byte[] buffer = new byte[5120]; byte[] buffer = new byte[5120];
int packagesCount = 0; int packagesCount = 0;
int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length); int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length);
@ -125,62 +133,18 @@ namespace DTLib.Network
mainSocket.SendPackage(buffer); mainSocket.SendPackage(buffer);
BytesUploaded += (uint)buffer.Length; BytesUploaded += (uint)buffer.Length;
} }
}, out var exception);
exception?.Throw();
fileStream.Close(); fileStream.Close();
Debug(new string[] { "g", $" uploaded {BytesUploaded} of {Filesize} bytes\n" }); 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<string> 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) public void DownloadByManifest(string dirOnServer, string dirOnClient, bool overwrite = false, bool delete_excess = false)
{ {
if (!dirOnClient.EndsWith("\\")) dirOnClient += "\\"; if (!dirOnClient.EndsWith("\\")) dirOnClient += "\\";
if (!dirOnServer.EndsWith("\\")) dirOnServer += "\\"; if (!dirOnServer.EndsWith("\\")) dirOnServer += "\\";
Debug("b", "downloading manifest <", "c", dirOnServer + "manifest.dtsod", "b", ">\n"); 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"); Debug("g", $"found {manifest.Values.Count} files in manifest\n");
var hasher = new Hasher(); var hasher = new Hasher();
foreach (string fileOnServer in manifest.Keys) foreach (string fileOnServer in manifest.Keys)

View File

@ -46,6 +46,7 @@ namespace DTLib.Network
list.AddRange(data); list.AddRange(data);
socket.Send(list.ToArray()); 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) public static void GetAnswer(this Socket socket, string answer)
@ -59,5 +60,6 @@ namespace DTLib.Network
socket.SendPackage(request); socket.SendPackage(request);
return socket.GetPackage(); return socket.GetPackage();
} }
public static byte[] RequestPackage(this Socket socket, string request) => socket.RequestPackage(request.ToBytes());
} }
} }

View File

@ -25,5 +25,11 @@ namespace DTLib
if (!isReleased) Mutex.ReleaseMutex(); if (!isReleased) Mutex.ReleaseMutex();
} }
} }
public void Execute(Action action)
{
Execute(action, out Exception exception);
exception?.Throw();
}
} }
} }

View File

@ -143,5 +143,7 @@ namespace DTLib
b.Append(input); b.Append(input);
return b.ToString(); return b.ToString();
} }
public static void Throw(this Exception ex) => throw ex;
} }
} }