Server-side file transfer UI, server notifies the recipient of a file transfer if the transfer is cancelled, fixed TextGetter not working on wrapped GUITextBlocks

This commit is contained in:
Regalis
2017-03-10 19:16:17 +02:00
parent 4f589603d1
commit a1342fdc45
4 changed files with 81 additions and 5 deletions
+1 -1
View File
@@ -259,7 +259,7 @@ namespace Barotrauma
base.Draw(spriteBatch); base.Draw(spriteBatch);
if (TextGetter != null) text = TextGetter(); if (TextGetter != null) Text = TextGetter();
if (!string.IsNullOrEmpty(text)) if (!string.IsNullOrEmpty(text))
{ {
@@ -266,8 +266,11 @@ namespace Barotrauma.Networking
case (byte)FileTransferMessageType.Cancel: case (byte)FileTransferMessageType.Cancel:
byte sequenceChannel = inc.ReadByte(); byte sequenceChannel = inc.ReadByte();
var matchingTransfer = activeTransfers.Find(t => t.Connection == inc.SenderConnection && t.SequenceChannel == sequenceChannel); var matchingTransfer = activeTransfers.Find(t => t.Connection == inc.SenderConnection && t.SequenceChannel == sequenceChannel);
if (matchingTransfer != null) StopTransfer(matchingTransfer); if (matchingTransfer != null)
{
new GUIMessageBox("File transfer cancelled", "The server has cancelled the transfer of the file \"" + matchingTransfer.FileName + "\".");
StopTransfer(matchingTransfer);
}
break; break;
} }
} }
@@ -103,6 +103,10 @@ namespace Barotrauma.Networking
public static TimeSpan MaxTransferDuration = new TimeSpan(0, 2, 0); public static TimeSpan MaxTransferDuration = new TimeSpan(0, 2, 0);
public delegate void FileTransferDelegate(FileTransferOut fileStreamReceiver);
public FileTransferDelegate OnStarted;
public FileTransferDelegate OnEnded;
private List<FileTransferOut> activeTransfers; private List<FileTransferOut> activeTransfers;
private int chunkLen; private int chunkLen;
@@ -156,6 +160,8 @@ namespace Barotrauma.Networking
DebugConsole.ThrowError("Failed to initiate file transfer", e); DebugConsole.ThrowError("Failed to initiate file transfer", e);
} }
OnStarted(transfer);
return transfer; return transfer;
} }
@@ -163,6 +169,18 @@ namespace Barotrauma.Networking
{ {
activeTransfers.RemoveAll(t => t.Connection.Status != NetConnectionStatus.Connected); activeTransfers.RemoveAll(t => t.Connection.Status != NetConnectionStatus.Connected);
var endedTransfers = activeTransfers.FindAll(t =>
t.Connection.Status != NetConnectionStatus.Connected ||
t.Status == FileTransferStatus.Finished ||
t.Status == FileTransferStatus.Canceled ||
t.Status == FileTransferStatus.Error);
foreach (FileTransferOut transfer in endedTransfers)
{
activeTransfers.Remove(transfer);
OnEnded(transfer);
}
foreach (FileTransferOut transfer in activeTransfers) foreach (FileTransferOut transfer in activeTransfers)
{ {
transfer.WaitTimer -= deltaTime; transfer.WaitTimer -= deltaTime;
@@ -223,14 +241,16 @@ namespace Barotrauma.Networking
transfer.Status = FileTransferStatus.Finished; transfer.Status = FileTransferStatus.Finished;
} }
} }
activeTransfers.RemoveAll(t => t.Status == FileTransferStatus.Finished);
} }
public void CancelTransfer(FileTransferOut transfer) public void CancelTransfer(FileTransferOut transfer)
{ {
transfer.Status = FileTransferStatus.Canceled; transfer.Status = FileTransferStatus.Canceled;
activeTransfers.Remove(transfer); activeTransfers.Remove(transfer);
OnEnded(transfer);
GameMain.Server.SendCancelTransferMsg(transfer);
} }
public void ReadFileRequest(NetIncomingMessage inc) public void ReadFileRequest(NetIncomingMessage inc)
@@ -153,7 +153,10 @@ namespace Barotrauma.Networking
Log("Starting the server...", Color.Cyan); Log("Starting the server...", Color.Cyan);
server = new NetServer(config); server = new NetServer(config);
netPeer = server; netPeer = server;
fileSender = new FileSender(this); fileSender = new FileSender(this);
fileSender.OnEnded += FileTransferChanged;
fileSender.OnStarted += FileTransferChanged;
server.Start(); server.Start();
} }
@@ -1695,7 +1698,57 @@ namespace Barotrauma.Networking
netStats.AddValue(NetStats.NetStatType.ReceivedBytes, server.Statistics.ReceivedBytes); netStats.AddValue(NetStats.NetStatType.ReceivedBytes, server.Statistics.ReceivedBytes);
netStats.Draw(spriteBatch, new Rectangle(200,0,800,200), this); netStats.Draw(spriteBatch, new Rectangle(200,0,800,200), this);
}
private void FileTransferChanged(FileSender.FileTransferOut transfer)
{
Client recipient = connectedClients.Find(c => c.Connection == transfer.Connection);
UpdateFileTransferIndicator(recipient);
}
public void SendCancelTransferMsg(FileSender.FileTransferOut transfer)
{
NetOutgoingMessage msg = server.CreateMessage();
msg.Write((byte)ServerPacketHeader.FILE_TRANSFER);
msg.Write((byte)FileTransferMessageType.Cancel);
msg.Write((byte)transfer.SequenceChannel);
server.SendMessage(msg, transfer.Connection, NetDeliveryMethod.ReliableOrdered, transfer.SequenceChannel);
}
private void UpdateFileTransferIndicator(Client client)
{
var transfers = fileSender.ActiveTransfers.FindAll(t => t.Connection == client.Connection);
var clientNameBox = GameMain.NetLobbyScreen.PlayerList.FindChild(client.name);
var clientInfo = clientNameBox.FindChild("filetransfer");
if (clientInfo == null)
{
clientNameBox.ClearChildren();
clientInfo = new GUIFrame(new Rectangle(0, 0, 180, 0), Color.Transparent, Alignment.TopRight, null, clientNameBox);
clientInfo.UserData = "filetransfer";
}
else if (transfers.Count == 0)
{
clientInfo.Parent.RemoveChild(clientInfo);
}
clientInfo.ClearChildren();
var progressBar = new GUIProgressBar(new Rectangle(0, 4, 160, clientInfo.Rect.Height - 8), Color.Green, GUI.Style, 0.0f, Alignment.Left, clientInfo);
progressBar.IsHorizontal = true;
progressBar.ProgressGetter = () => { return transfers.Sum(t => t.Progress) / transfers.Count; };
var textBlock = new GUITextBlock(new Rectangle(0, 2, 160, 0), "", GUI.Style, Alignment.TopLeft, Alignment.Left | Alignment.CenterY, clientInfo, true, GUI.SmallFont);
textBlock.TextGetter = () =>
{ return MathUtils.GetBytesReadable(transfers.Sum(t => t.SentOffset)) + " / " + MathUtils.GetBytesReadable(transfers.Sum(t => t.Data.Length)); };
var cancelButton = new GUIButton(new Rectangle(-5, 0, 14, 0), "X", Alignment.Right, GUI.Style, clientInfo);
cancelButton.OnClicked = (GUIButton button, object userdata) =>
{
transfers.ForEach(t => fileSender.CancelTransfer(t));
return true;
};
} }
public void UpdateVoteStatus() public void UpdateVoteStatus()