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\Window.cs" />
<Compile Include="ConsoleGUI\WindowOld.cs" />
<Compile Include="Dtsod\DtsodV22.cs" />
<Compile Include="Dtsod\DtsodV23.cs" />
<Compile Include="Dtsod\DtsodV21.cs" />
<Compile Include="cs9somefix.cs" />

View File

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

View File

@ -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<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)
{
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)

View File

@ -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());
}
}

View File

@ -25,5 +25,11 @@ namespace DTLib
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);
return b.ToString();
}
public static void Throw(this Exception ex) => throw ex;
}
}