some changes
This commit is contained in:
parent
21e7e75584
commit
5fb4c3b40d
@ -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" />
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
180
Network/FSP.cs
180
Network/FSP.cs
@ -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)
|
||||||
{
|
{
|
||||||
Debug("b", $"requesting file download: {filePath_server}\n");
|
Mutex.Execute(() =>
|
||||||
mainSocket.SendPackage("requesting file download".ToBytes());
|
{
|
||||||
mainSocket.SendPackage(filePath_server.ToBytes());
|
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);
|
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();
|
||||||
@ -43,17 +44,20 @@ namespace DTLib.Network
|
|||||||
|
|
||||||
public byte[] DownloadFileToMemory(string filePath_server)
|
public byte[] DownloadFileToMemory(string filePath_server)
|
||||||
{
|
{
|
||||||
Debug("b", $"requesting file download: {filePath_server}\n");
|
Mutex.Execute(() =>
|
||||||
mainSocket.SendPackage("requesting file download".ToBytes());
|
{
|
||||||
mainSocket.SendPackage(filePath_server.ToBytes());
|
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();
|
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,125 +66,85 @@ namespace DTLib.Network
|
|||||||
|
|
||||||
void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing)
|
void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing)
|
||||||
{
|
{
|
||||||
Filesize = mainSocket.GetPackage().ToStr().ToUInt();
|
Mutex.Execute(() =>
|
||||||
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++)
|
|
||||||
{
|
{
|
||||||
buffer = mainSocket.GetPackage();
|
BytesDownloaded = 0;
|
||||||
BytesDownloaded += (uint)buffer.Length;
|
Filesize = mainSocket.GetPackage().ToStr().ToUInt();
|
||||||
fileStream.Write(buffer, 0, buffer.Length);
|
mainSocket.SendPackage("ready".ToBytes());
|
||||||
if (requiresFlushing)
|
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();
|
if (n == 100)
|
||||||
n = 0;
|
{
|
||||||
|
fileStream.Flush();
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
|
else n++;
|
||||||
}
|
}
|
||||||
else n++;
|
|
||||||
}
|
}
|
||||||
}
|
// получение остатка
|
||||||
// получение остатка
|
if ((Filesize - fileStream.Position) > 0)
|
||||||
if ((Filesize - fileStream.Position) > 0)
|
{
|
||||||
{
|
mainSocket.SendPackage("remain request".ToBytes());
|
||||||
mainSocket.SendPackage("remain request".ToBytes());
|
buffer = mainSocket.GetPackage();
|
||||||
buffer = mainSocket.GetPackage();
|
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());
|
|
||||||
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++)
|
|
||||||
{
|
{
|
||||||
fileStream.Read(buffer, 0, buffer.Length);
|
mainSocket.SendPackage(Filesize.ToString().ToBytes());
|
||||||
mainSocket.SendPackage(buffer);
|
mainSocket.GetAnswer("ready");
|
||||||
BytesUploaded += (uint)buffer.Length;
|
byte[] buffer = new byte[5120];
|
||||||
}
|
int packagesCount = 0;
|
||||||
// отправка остатка
|
int fullPackagesCount = SimpleConverter.Truncate(Filesize / buffer.Length);
|
||||||
if ((Filesize - fileStream.Position) > 0)
|
// отправка полных пакетов файла
|
||||||
{
|
for (; packagesCount < fullPackagesCount; packagesCount++)
|
||||||
mainSocket.GetAnswer("remain request");
|
{
|
||||||
buffer = new byte[(Filesize - fileStream.Position).ToInt()];
|
fileStream.Read(buffer, 0, buffer.Length);
|
||||||
fileStream.Read(buffer, 0, buffer.Length);
|
mainSocket.SendPackage(buffer);
|
||||||
mainSocket.SendPackage(buffer);
|
BytesUploaded += (uint)buffer.Length;
|
||||||
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();
|
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)
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user