some changes
This commit is contained in:
parent
21e7e75584
commit
5fb4c3b40d
@ -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" />
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
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();
|
||||
@ -42,16 +43,19 @@ namespace DTLib.Network
|
||||
}
|
||||
|
||||
public byte[] DownloadFileToMemory(string filePath_server)
|
||||
{
|
||||
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);
|
||||
byte[] output = fileStream.GetBuffer();
|
||||
@ -62,6 +66,9 @@ namespace DTLib.Network
|
||||
|
||||
void Download_SharedCode(System.IO.Stream fileStream, bool requiresFlushing)
|
||||
{
|
||||
Mutex.Execute(() =>
|
||||
{
|
||||
BytesDownloaded = 0;
|
||||
Filesize = mainSocket.GetPackage().ToStr().ToUInt();
|
||||
mainSocket.SendPackage("ready".ToBytes());
|
||||
int packagesCount = 0;
|
||||
@ -91,21 +98,22 @@ namespace DTLib.Network
|
||||
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");
|
||||
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);
|
||||
@ -125,62 +133,18 @@ namespace DTLib.Network
|
||||
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)
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,5 +25,11 @@ namespace DTLib
|
||||
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);
|
||||
return b.ToString();
|
||||
}
|
||||
|
||||
public static void Throw(this Exception ex) => throw ex;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user