317 lines
13 KiB
C#
317 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Web;
|
|
using System.Net;
|
|
using System.IO;
|
|
|
|
namespace GamerServices {
|
|
public class Downloader {
|
|
public class DownloadInfo {
|
|
public string Path;
|
|
public string URL;
|
|
public string Version;
|
|
public int GameID;
|
|
public int TotalActions;
|
|
|
|
public byte Action;
|
|
}
|
|
|
|
public FormMain Main;
|
|
public List<DownloadInfo> FilesToDownload;
|
|
public System.Threading.Thread DownloadThread;
|
|
|
|
private static System.Net.WebClient DownloadClient;
|
|
|
|
public Downloader(FormMain main) {
|
|
Main = main;
|
|
|
|
FilesToDownload = new List<DownloadInfo>();
|
|
|
|
if (DownloadThread != null && DownloadThread.IsAlive)
|
|
DownloadThread.Abort();
|
|
|
|
DownloadThread = new System.Threading.Thread(new System.Threading.ThreadStart(Update));
|
|
DownloadThread.Start();
|
|
}
|
|
|
|
private static int CurrentGameUpdateing = -1;
|
|
private void Update() {
|
|
DownloadClient = new WebClient();
|
|
DownloadClient.Proxy = null;
|
|
|
|
DownloadClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(DownloadFinished);
|
|
DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadBusy);
|
|
|
|
while (true) {
|
|
if (Main.Games != null && Main.Games.Length > 0) {
|
|
lock(Main.Games){
|
|
foreach (Game g in Main.Games) {
|
|
if (g != null) {
|
|
if (g.Status == Game.GameStatus.DOWNLOADING) {
|
|
bool isdownloading = false;
|
|
lock (FilesToDownload) {
|
|
for (int i = 0; i < FilesToDownload.Count; i++) {
|
|
if (FilesToDownload[i].GameID == g.GameID) {
|
|
isdownloading = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!isdownloading) {
|
|
Main.Popup("Download finished!", g.Name, 0);
|
|
g.Status = Game.GameStatus.INSTALLED;
|
|
Main.SetGameData(g.GameID, g.Name, g.Status);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (FilesToDownload.Count > 0 && CurrentGameUpdateing == -1) {
|
|
DownloadInfo info = null;
|
|
lock (FilesToDownload) {
|
|
info = FilesToDownload[0];
|
|
|
|
try {
|
|
CurrentGameUpdateing = -1;
|
|
switch (info.Action) {
|
|
case 0:
|
|
if (File.Exists("Games/" + info.GameID + "/" + info.Path))
|
|
File.Delete("Games/" + info.GameID + "/" + info.Path);
|
|
|
|
DownloadClient.DownloadFileAsync(new Uri(info.URL.Replace("\\", "/")), "Games/" + info.GameID + "/" + info.Path, null);
|
|
CurrentGameUpdateing = info.GameID;
|
|
break;
|
|
|
|
case 1:
|
|
if (File.Exists("Games/" + info.GameID + "/" + info.Path))
|
|
File.Delete("Games/" + info.GameID + "/" + info.Path);
|
|
|
|
File.Create("Games/" + info.GameID + "/" + info.Path);
|
|
|
|
UpdateText((short)info.GameID, "");
|
|
SafeDownloadList(true);
|
|
break;
|
|
|
|
case 2:
|
|
if (Directory.Exists("Games/" + info.GameID + "/" + info.Path))
|
|
Directory.Delete("Games/" + info.GameID + "/" + info.Path, true);
|
|
|
|
if (File.Exists("Games/" + info.GameID + "/" + info.Path))
|
|
File.Delete("Games/" + info.GameID + "/" + info.Path);
|
|
|
|
UpdateText((short)info.GameID, "");
|
|
SafeDownloadList(true);
|
|
break;
|
|
|
|
case 3:
|
|
if (Directory.Exists("Games/" + info.GameID + "/" + info.Path))
|
|
Directory.Delete("Games/" + info.GameID + "/" + info.Path, true);
|
|
|
|
Directory.CreateDirectory("Games/" + info.GameID + "/" + info.Path);
|
|
UpdateText((short)info.GameID, "");
|
|
SafeDownloadList(true);
|
|
break;
|
|
}
|
|
} catch(Exception e) {
|
|
CurrentGameUpdateing = -1;
|
|
SafeDownloadList(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
System.Threading.Thread.Sleep(200);
|
|
}
|
|
}
|
|
|
|
public void SafeDownloadList(bool del){
|
|
if (del && FilesToDownload.Count > 0) {
|
|
lock(FilesToDownload){
|
|
FilesToDownload.RemoveAt(0);
|
|
}
|
|
}
|
|
|
|
if (FilesToDownload.Count > 0) {
|
|
string data = "";
|
|
|
|
DownloadInfo[] sort = null;
|
|
lock (FilesToDownload) {
|
|
sort = FilesToDownload.OrderBy(DownloadInfo => DownloadInfo.GameID).ToArray<DownloadInfo>();
|
|
}
|
|
|
|
short lastID = -1;
|
|
foreach (DownloadInfo info in sort) {
|
|
if (info.GameID != lastID) {
|
|
data += "}\n\n" + info.GameID + " " + info.Version + "\n{\n";
|
|
lastID = (short)info.GameID;
|
|
}
|
|
data += "\t" + info.Path + "\n";
|
|
data += "\t" + info.Action + "\n";
|
|
}
|
|
|
|
if (data.Length > 0) {
|
|
data = data.Substring(3) + (lastID != -1 ? "}" : "");
|
|
try {
|
|
File.WriteAllText("downloading.txt", data);
|
|
} catch {
|
|
}
|
|
}
|
|
} else {
|
|
try {
|
|
File.WriteAllText("downloading.txt", "");
|
|
} catch {
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateText(short gameID, string add) {
|
|
if (Main.Games == null || Main.Games.Length == 0)
|
|
return;
|
|
|
|
lock (Main.Games) {
|
|
int res = 0;
|
|
int totalfiles = 0;
|
|
lock (FilesToDownload) {
|
|
for (int i = 0; i < FilesToDownload.Count; i++) {
|
|
if (FilesToDownload[i].GameID == gameID) {
|
|
res++;
|
|
if (FilesToDownload[i].TotalActions > totalfiles)
|
|
totalfiles = FilesToDownload[i].TotalActions;
|
|
}
|
|
}
|
|
}
|
|
|
|
Game g = Main.GetGame(gameID);
|
|
if (g != null) {
|
|
g.Status = res > 0 ? Game.GameStatus.DOWNLOADING : Game.GameStatus.INSTALLED;
|
|
if (res > 0) {
|
|
double per = 100.0 - ((double)res / (double)totalfiles * 100.0);
|
|
per = per - per % 0.1;
|
|
|
|
Main.SetGameData(gameID, g.Name + " " + per + "%" + add, g.Status);
|
|
} else {
|
|
Main.Popup("Download finished!", g.Name, 0);
|
|
Main.SetGameData(gameID, g.Name, g.Status);
|
|
}
|
|
} else {
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DownloadFinished(object sender, System.ComponentModel.AsyncCompletedEventArgs e) {
|
|
UpdateText((short)CurrentGameUpdateing, "");
|
|
SafeDownloadList(true);
|
|
|
|
for (int i = 0; i < FilesToDownload.Count; i++) {
|
|
if (FilesToDownload[i].GameID == CurrentGameUpdateing) {
|
|
CurrentGameUpdateing = -1;
|
|
return;
|
|
}
|
|
}
|
|
|
|
Game g = Main.GetGame((short)CurrentGameUpdateing);
|
|
if (g != null) {
|
|
Main.Popup("Download finished!", g.Name, 0);
|
|
g.Status = Game.GameStatus.INSTALLED;
|
|
Main.SetGameData(g.GameID, g.Name, g.Status);
|
|
CurrentGameUpdateing = -1;
|
|
}
|
|
}
|
|
|
|
private void DownloadBusy(object sender, DownloadProgressChangedEventArgs e) {
|
|
UpdateText((short)CurrentGameUpdateing, " " + e.ProgressPercentage.ToString() + "%");
|
|
}
|
|
|
|
public bool UpdateParser(int GameID, string curver){
|
|
System.Net.WebClient client = new WebClient();
|
|
client.Proxy = null;
|
|
|
|
string[] FileData = null;
|
|
int actions = 0;
|
|
try {
|
|
FileData = new StreamReader(client.OpenRead("http://" + "gs.mrag.nl/download.php?gid=" + GameID + "&file=updates.txt")).ReadToEnd().Replace("\r", "").Split('\n');
|
|
} catch(Exception e) {
|
|
return false;
|
|
}
|
|
|
|
lock (FilesToDownload) {
|
|
string currenthandelingrev = "";
|
|
List<string> filesdone = new List<string>();
|
|
foreach (string line in FileData){
|
|
if (line.Length > 0) {
|
|
string[] args = null;
|
|
if (line.Contains("=")) args = line.Split('=');
|
|
|
|
if (line.TrimStart('\t', ' ').StartsWith("#")){
|
|
}else if (args[0] == "VER"){
|
|
if (currenthandelingrev.Length == 0){
|
|
currenthandelingrev = args[1];
|
|
File.WriteAllText("Games/" + GameID + "/version.txt", currenthandelingrev);
|
|
|
|
Game g = Main.GetGame((short)GameID);
|
|
if (g != null)
|
|
g.Version = currenthandelingrev;
|
|
}
|
|
if (args[1] == curver) {
|
|
break;
|
|
}
|
|
}else{
|
|
if (!filesdone.Contains(args[1])) {
|
|
filesdone.Add(args[1]);
|
|
DownloadInfo info = new DownloadInfo();
|
|
info.Action = 0;
|
|
info.GameID = GameID;
|
|
info.URL = "http://" + "gs.mrag.nl/download.php?gid=" + GameID + "&file=" + args[1];
|
|
info.Path = args[1];
|
|
info.Version = currenthandelingrev;
|
|
|
|
switch (args[0]) {
|
|
case "ADD":
|
|
info.Action = 0;
|
|
break;
|
|
|
|
case "MNF":
|
|
info.Action = 1;
|
|
break;
|
|
|
|
case "DEL":
|
|
info.Action = 2;
|
|
break;
|
|
|
|
case "MDR":
|
|
info.Action = 3;
|
|
break;
|
|
}
|
|
|
|
FilesToDownload.Add(info);
|
|
actions++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = FilesToDownload.Count - 1; i > 0; i--) {
|
|
if (FilesToDownload[i].GameID == GameID) {
|
|
Game g = Main.GetGame((short)GameID);
|
|
if (g != null)
|
|
g.Status = Game.GameStatus.DOWNLOADING;
|
|
|
|
FilesToDownload[i].TotalActions += actions;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < FilesToDownload.Count; i++) {
|
|
System.Diagnostics.Debug.Print(FilesToDownload[i].Action + " = " + FilesToDownload[i].Path);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|