remove PackageDownloader
This commit is contained in:
@@ -152,8 +152,6 @@ namespace OpenRA
|
|||||||
|
|
||||||
public void Draw( World world )
|
public void Draw( World world )
|
||||||
{
|
{
|
||||||
DrawDownloadBar();
|
|
||||||
|
|
||||||
chromeCollection = "chrome-" + world.LocalPlayer.Country.Race;
|
chromeCollection = "chrome-" + world.LocalPlayer.Country.Race;
|
||||||
radarCollection = "radar-" + world.LocalPlayer.Country.Race;
|
radarCollection = "radar-" + world.LocalPlayer.Country.Race;
|
||||||
paletteCollection = "palette-" + world.LocalPlayer.Country.Race;
|
paletteCollection = "palette-" + world.LocalPlayer.Country.Race;
|
||||||
@@ -175,36 +173,6 @@ namespace OpenRA
|
|||||||
DrawChat();
|
DrawChat();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawDownloadBar()
|
|
||||||
{
|
|
||||||
if (PackageDownloader.IsIdle())
|
|
||||||
return;
|
|
||||||
|
|
||||||
var r = new Rectangle((Game.viewport.Width - 400) / 2, Game.viewport.Height - 110, 400, 100);
|
|
||||||
DrawDialogBackground(r, "dialog");
|
|
||||||
|
|
||||||
DrawCentered("Downloading: {0} (+{1} more)".F(
|
|
||||||
PackageDownloader.CurrentPackage.Split(':')[0],
|
|
||||||
PackageDownloader.RemainingPackages),
|
|
||||||
new int2( Game.viewport.Width /2, Game.viewport.Height - 90),
|
|
||||||
Color.White);
|
|
||||||
|
|
||||||
DrawDialogBackground(new Rectangle(r.Left + 30, r.Top + 50, r.Width - 60, 20),
|
|
||||||
"dialog2");
|
|
||||||
|
|
||||||
var x1 = r.Left + 35;
|
|
||||||
var x2 = r.Right - 35;
|
|
||||||
var x = float2.Lerp(x1, x2, PackageDownloader.Fraction);
|
|
||||||
|
|
||||||
for (var y = r.Top + 55; y < r.Top + 65; y++)
|
|
||||||
lineRenderer.DrawLine(
|
|
||||||
new float2(x1, y) + Game.viewport.Location,
|
|
||||||
new float2(x, y) + Game.viewport.Location,
|
|
||||||
Color.White, Color.White);
|
|
||||||
|
|
||||||
lineRenderer.Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawDialog(string text)
|
public void DrawDialog(string text)
|
||||||
{
|
{
|
||||||
DrawDialog(text, null, _ => { }, null, _ => { });
|
DrawDialog(text, null, _ => { }, null, _ => { });
|
||||||
@@ -416,7 +384,6 @@ namespace OpenRA
|
|||||||
public void DrawLobby()
|
public void DrawLobby()
|
||||||
{
|
{
|
||||||
buttons.Clear();
|
buttons.Clear();
|
||||||
DrawDownloadBar();
|
|
||||||
|
|
||||||
if (showMapChooser)
|
if (showMapChooser)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
public static void Tick()
|
public static void Tick()
|
||||||
{
|
{
|
||||||
if (packageChangePending && PackageDownloader.IsIdle())
|
if (packageChangePending)
|
||||||
{
|
{
|
||||||
// TODO: Only do this on mod change
|
// TODO: Only do this on mod change
|
||||||
Timer.Time("----begin maplist");
|
Timer.Time("----begin maplist");
|
||||||
@@ -241,7 +241,7 @@ namespace OpenRA
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapChangePending && PackageDownloader.IsIdle())
|
if (mapChangePending)
|
||||||
{
|
{
|
||||||
ChangeMap(LobbyInfo.GlobalSettings.Map);
|
ChangeMap(LobbyInfo.GlobalSettings.Map);
|
||||||
return;
|
return;
|
||||||
@@ -331,9 +331,6 @@ namespace OpenRA
|
|||||||
Debug("Order lag is now {0} frames.".F(LobbyInfo.GlobalSettings.OrderLatency));
|
Debug("Order lag is now {0} frames.".F(LobbyInfo.GlobalSettings.OrderLatency));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PackageDownloader.SetPackageList(LobbyInfo.GlobalSettings.Packages))
|
|
||||||
packageChangePending = true;
|
|
||||||
|
|
||||||
if (mapName != LobbyInfo.GlobalSettings.Map)
|
if (mapName != LobbyInfo.GlobalSettings.Map)
|
||||||
mapChangePending = true;
|
mapChangePending = true;
|
||||||
|
|
||||||
|
|||||||
@@ -48,12 +48,6 @@ namespace OpenRA.Network
|
|||||||
Game.SyncLobbyInfo(order.TargetString);
|
Game.SyncLobbyInfo(order.TargetString);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "FileChunk":
|
|
||||||
{
|
|
||||||
PackageDownloader.ReceiveChunk(order.TargetString);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if( !order.IsImmediate )
|
if( !order.IsImmediate )
|
||||||
|
|||||||
@@ -117,7 +117,6 @@
|
|||||||
<Compile Include="Network\OrderManager.cs" />
|
<Compile Include="Network\OrderManager.cs" />
|
||||||
<Compile Include="Orders\RepairOrderGenerator.cs" />
|
<Compile Include="Orders\RepairOrderGenerator.cs" />
|
||||||
<Compile Include="Orders\SellOrderGenerator.cs" />
|
<Compile Include="Orders\SellOrderGenerator.cs" />
|
||||||
<Compile Include="PackageDownloader.cs" />
|
|
||||||
<Compile Include="PathSearch.cs" />
|
<Compile Include="PathSearch.cs" />
|
||||||
<Compile Include="Selection.cs" />
|
<Compile Include="Selection.cs" />
|
||||||
<Compile Include="Server\Connection.cs" />
|
<Compile Include="Server\Connection.cs" />
|
||||||
|
|||||||
@@ -1,144 +0,0 @@
|
|||||||
#region Copyright & License Information
|
|
||||||
/*
|
|
||||||
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
|
|
||||||
* This file is part of OpenRA.
|
|
||||||
*
|
|
||||||
* OpenRA is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* OpenRA is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with OpenRA. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
using OpenRA.FileFormats;
|
|
||||||
|
|
||||||
namespace OpenRA
|
|
||||||
{
|
|
||||||
static class PackageDownloader
|
|
||||||
{
|
|
||||||
static string[] allPackages = { };
|
|
||||||
static List<string> missingPackages = new List<string>();
|
|
||||||
static string currentPackage = null;
|
|
||||||
static MemoryStream content = null;
|
|
||||||
|
|
||||||
public static string CurrentPackage { get { return currentPackage; } }
|
|
||||||
public static int RemainingPackages { get { return missingPackages.Count; } }
|
|
||||||
public static float Fraction { get; private set; }
|
|
||||||
public static int DownloadedBytes { get { return (int)content.Length; } }
|
|
||||||
|
|
||||||
public static bool SetPackageList(string[] packages)
|
|
||||||
{
|
|
||||||
if (!(allPackages.Except(packages).Any()
|
|
||||||
|| packages.Except(allPackages).Any()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
allPackages = packages;
|
|
||||||
missingPackages = allPackages.Where(p => !HavePackage(p)).ToList();
|
|
||||||
|
|
||||||
if (currentPackage == null || !missingPackages.Contains(currentPackage))
|
|
||||||
BeginDownload();
|
|
||||||
else
|
|
||||||
missingPackages.Remove(currentPackage);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Chunk { public int Index = 0; public int Count = 0; public string Data = ""; }
|
|
||||||
|
|
||||||
public static void ReceiveChunk(string data)
|
|
||||||
{
|
|
||||||
var c = new Chunk();
|
|
||||||
FieldLoader.Load(c, new MiniYaml(null, MiniYaml.FromString(data)));
|
|
||||||
var bytes = Convert.FromBase64String(c.Data);
|
|
||||||
content.Write(bytes, 0, bytes.Length);
|
|
||||||
|
|
||||||
Fraction = (float)c.Index / c.Count;
|
|
||||||
|
|
||||||
if (c.Index == c.Count - 1)
|
|
||||||
EndDownload();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BeginDownload()
|
|
||||||
{
|
|
||||||
if (missingPackages.Count == 0) // we're finished downloading resources!
|
|
||||||
{
|
|
||||||
currentPackage = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentPackage = missingPackages[0];
|
|
||||||
missingPackages.RemoveAt(0);
|
|
||||||
|
|
||||||
content = new MemoryStream();
|
|
||||||
|
|
||||||
Game.Debug("Requesting package: {0}".F(currentPackage));
|
|
||||||
|
|
||||||
Game.IssueOrder(
|
|
||||||
new Order("RequestFile", null, currentPackage) { IsImmediate = true });
|
|
||||||
|
|
||||||
Fraction = 0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void EndDownload()
|
|
||||||
{
|
|
||||||
// commit this data to disk
|
|
||||||
var parts = currentPackage.Split(':');
|
|
||||||
File.WriteAllBytes(parts[0], content.ToArray());
|
|
||||||
|
|
||||||
if (CalculateSHA1(parts[0]) != parts[1])
|
|
||||||
throw new InvalidOperationException("Broken download");
|
|
||||||
|
|
||||||
Game.Debug("Finished receiving package: {0}".F(currentPackage));
|
|
||||||
|
|
||||||
currentPackage = null;
|
|
||||||
|
|
||||||
BeginDownload();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsIdle()
|
|
||||||
{
|
|
||||||
return currentPackage == null
|
|
||||||
&& missingPackages.Count == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool HavePackage(string p)
|
|
||||||
{
|
|
||||||
var parts = p.Split(':');
|
|
||||||
if (!File.Exists(parts[0]))
|
|
||||||
{
|
|
||||||
Game.Debug("Missing package: {0}".F(p));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CalculateSHA1(parts[0]) != parts[1])
|
|
||||||
{
|
|
||||||
Game.Debug("Bad SHA1 for package; redownloading: {0}".F(p));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Game.Debug("Verified package: {0}".F(p));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string CalculateSHA1(string filename)
|
|
||||||
{
|
|
||||||
using (var csp = SHA1.Create())
|
|
||||||
return new string(csp.ComputeHash(File.ReadAllBytes(filename))
|
|
||||||
.SelectMany(a => a.ToString("x2")).ToArray());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -39,12 +39,6 @@ namespace OpenRA.Server
|
|||||||
/* client data */
|
/* client data */
|
||||||
public int PlayerIndex;
|
public int PlayerIndex;
|
||||||
|
|
||||||
/* file server state */
|
|
||||||
public int NextChunk = 0;
|
|
||||||
public int NumChunks = 0;
|
|
||||||
public int RemainingBytes = 0;
|
|
||||||
public Stream Stream = null;
|
|
||||||
|
|
||||||
public byte[] PopBytes(int n)
|
public byte[] PopBytes(int n)
|
||||||
{
|
{
|
||||||
var result = data.GetRange(0, n);
|
var result = data.GetRange(0, n);
|
||||||
|
|||||||
@@ -92,18 +92,13 @@ namespace OpenRA.Server
|
|||||||
checkRead.Add( listener.Server );
|
checkRead.Add( listener.Server );
|
||||||
foreach( var c in conns ) checkRead.Add( c.socket );
|
foreach( var c in conns ) checkRead.Add( c.socket );
|
||||||
|
|
||||||
var isSendingPackages = conns.Any( c => c.Stream != null );
|
|
||||||
|
|
||||||
/* msdn lies, -1 doesnt work. this is ~1h instead. */
|
/* msdn lies, -1 doesnt work. this is ~1h instead. */
|
||||||
Socket.Select( checkRead, null, null, isSendingPackages ? DownloadChunkInterval : MasterPingInterval * 1000000 );
|
Socket.Select( checkRead, null, null, MasterPingInterval * 1000000 );
|
||||||
|
|
||||||
foreach( Socket s in checkRead )
|
foreach( Socket s in checkRead )
|
||||||
if( s == listener.Server ) AcceptConnection();
|
if( s == listener.Server ) AcceptConnection();
|
||||||
else conns.Single( c => c.socket == s ).ReadData();
|
else conns.Single( c => c.socket == s ).ReadData();
|
||||||
|
|
||||||
foreach( var c in conns.Where( a => a.Stream != null ).ToArray() )
|
|
||||||
SendNextChunk( c );
|
|
||||||
|
|
||||||
if (Environment.TickCount - lastPing > MasterPingInterval * 1000)
|
if (Environment.TickCount - lastPing > MasterPingInterval * 1000)
|
||||||
PingMasterServer();
|
PingMasterServer();
|
||||||
}
|
}
|
||||||
@@ -185,40 +180,6 @@ namespace OpenRA.Server
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Chunk { public int Index = 0; public int Count = 0; public string Data = ""; }
|
|
||||||
|
|
||||||
static void SendNextChunk(Connection c)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var data = c.Stream.Read(Math.Min(DownloadChunkSize, c.RemainingBytes));
|
|
||||||
if (data.Length != 0)
|
|
||||||
{
|
|
||||||
var chunk = new Chunk
|
|
||||||
{
|
|
||||||
Index = c.NextChunk++,
|
|
||||||
Count = c.NumChunks,
|
|
||||||
Data = Convert.ToBase64String(data)
|
|
||||||
};
|
|
||||||
|
|
||||||
DispatchOrdersToClient(c, 0, 0,
|
|
||||||
new ServerOrder("FileChunk",
|
|
||||||
FieldSaver.Save(chunk).Nodes.WriteToString()).Serialize());
|
|
||||||
}
|
|
||||||
|
|
||||||
c.RemainingBytes -= data.Length;
|
|
||||||
if (c.RemainingBytes == 0)
|
|
||||||
{
|
|
||||||
GetClient(c).State = Session.ClientState.NotReady;
|
|
||||||
c.Stream.Dispose();
|
|
||||||
c.Stream = null;
|
|
||||||
|
|
||||||
SyncLobbyInfo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) { DropClient(c, e); }
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DispatchOrdersToClient(Connection c, int client, int frame, byte[] data)
|
static void DispatchOrdersToClient(Connection c, int client, int frame, byte[] data)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -514,29 +475,6 @@ namespace OpenRA.Server
|
|||||||
foreach (var c in conns.Except(conn).ToArray())
|
foreach (var c in conns.Except(conn).ToArray())
|
||||||
DispatchOrdersToClient(c, GetClient(conn).Index, 0, so.Serialize());
|
DispatchOrdersToClient(c, GetClient(conn).Index, 0, so.Serialize());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "RequestFile":
|
|
||||||
{
|
|
||||||
Console.WriteLine("** Requesting file: `{0}`", so.Data);
|
|
||||||
var client = GetClient(conn);
|
|
||||||
client.State = Session.ClientState.Downloading;
|
|
||||||
|
|
||||||
var filename = so.Data.Split(':')[0];
|
|
||||||
|
|
||||||
if (conn.Stream != null)
|
|
||||||
conn.Stream.Dispose();
|
|
||||||
|
|
||||||
conn.Stream = File.OpenRead(filename);
|
|
||||||
// todo: validate that the SHA1 they asked for matches what we've got.
|
|
||||||
|
|
||||||
var length = (int) new FileInfo(filename).Length;
|
|
||||||
conn.NextChunk = 0;
|
|
||||||
conn.NumChunks = (length + DownloadChunkSize - 1) / DownloadChunkSize;
|
|
||||||
conn.RemainingBytes = length;
|
|
||||||
|
|
||||||
SyncLobbyInfo();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user