static void Main(string[] args) { Console.Title = "FOUpdater v" + FOUpdaterClient.VersionString; Console.CursorVisible = false; Console.Clear(); string cmdSource = null; string cmdConfig = null; foreach (string arg in args) { if (arg == "/autoclose" || arg == "--autoclose") { AutoClose = true; } else if (arg.StartsWith("/source:") || arg.StartsWith("--source:")) { cmdSource = arg.Substring((arg.StartsWith("/source:") ? 8 : 9)); } else if (arg.StartsWith("/config:") || arg.StartsWith("--config:")) { cmdConfig = arg.Substring((arg.StartsWith("/config:") ? 8 : 9)); } } FOUpdaterClient updater = new FOUpdaterClient(cmdConfig); FOUpdaterResult result = updater.Update(consoleMessage, null, cmdSource); if (result == FOUpdaterResult.InvalidConfig) { consoleMessage(FOUpdaterMessage.General, "Invalid configuration"); } if (!AutoClose) { Console.SetCursorPosition(0, textAnyKey); Console.CursorVisible = true; if (showAnyKey) { Console.Write("Press any key to exit..."); Console.ReadKey(true);; Console.WriteLine(); } } }
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { this.CancelButton = this.buttonCancel; updater = new FOUpdaterClient(); FOUpdaterResult result = updater.Update(winformMessage, winformProgress, DefaultSource); this.AcceptButton = this.buttonCancel; this.CancelButton = this.buttonExit; if (result == FOUpdaterResult.OK || result == FOUpdaterResult.Cancel) { string run = null; if (updater.FOnlineCfg != null) { run = updater.FOnlineCfg.GetValue(FOUpdaterClient.Strings.Section, FOUpdaterClient.Strings.Run, (string)null); } if (run != null && run.Length > 0) { string[] runOption = run.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (runOption.Length == 2 && File.Exists(runOption[0]) && runOption[1].Length > 0) { buttonCancel.SetEnabled(true); buttonCancel.SetText(runOption[1]); buttonCancel.SetTag(new string[] { runOption[0], null }); } } else // FOConfigEx support { string[] program = { "FOnline", "FOnlineGL" }; if (updater.FOnlineCfg != null) { run = updater.FOnlineCfg.GetValue("FOConfig", "PlayProgram", (string)null); } byte tmp = byte.MaxValue; if (run != null && run.Length > 0 && byte.TryParse(run, out tmp) && tmp < program.Length && File.Exists(program[tmp] + ".exe")) { this.buttonCancel.Enabled = true; this.buttonCancel.Text = "Run " + program[tmp]; if (updater.FOnlineCfg.GetValue("FOConfig", "SkipLogin", false)) { this.buttonCancel.Tag = new string[] { program[tmp], "-Start" } } ; else { this.buttonCancel.Tag = new string[] { program[tmp], null } }; } else { this.buttonCancel.SetEnabled(false); } } } else if (result == FOUpdaterResult.InvalidConfig) { this.buttonCancel.SetEnabled(false); this.buttonCancel.SetVisible(false); } else if (result == FOUpdaterResult.NoSource) { this.buttonCancel.SetEnabled(false); this.buttonCancel.SetVisible(false); } else { throw new NotImplementedException(Enum.GetName(typeof(FOUpdaterResult), result)); } this.buttonExit.SetEnabled(true); }
/// <summary> /// Core of FOUpdater, /// /// </summary> /// <param name="_message">callback for writing messages</param> /// <param name="_progress">callback for </param> /// <returns></returns> public FOUpdaterResult Update(UpdaterMessage _message, UpdaterProgress _progress, string defaultSource = null) { lock ( locker ) { this.message = _message; this.progress = _progress; this.SendMessage(FOUpdaterMessage.General, Strings.Initializing); } List <string> sources = new List <string>(); if (defaultSource != null) { if (this.GetUpdateType(defaultSource) != FOUpdateType.Unknown) { sources.Add(defaultSource); } if (this.FOnlineCfg == null && !File.Exists(Strings.ConfigFile)) { using (StreamWriter file = File.CreateText(Strings.ConfigFile)) { file.Flush(); file.Close(); } if (File.Exists(Strings.ConfigFile)) { this.FOnlineCfg = new IniFile(Strings.ConfigFile); this.FOnlineCfg.SetValue(Strings.Section, Strings.Source + "0", defaultSource); this.FOnlineCfg.Flush(); this.Sources.Add(defaultSource); } } } else // defaultSource == null { if (this.FOnlineCfg != null) { for (uint s = 0; s < uint.MaxValue; s++) { string source = this.FOnlineCfg.GetValue(Strings.Section, Strings.Source + s, (string)null); if (source == null || source.Length == 0) { break; } else if (this.GetUpdateType(source) != FOUpdateType.Unknown) { sources.Add(source); } } if (sources.Count == 0) { return(FOUpdaterResult.InvalidConfig); } } else { return(FOUpdaterResult.NoConfig); } } if (sources.Count == 0) { return(FOUpdaterResult.InvalidConfig); } if (this.FOnlineCfg.GetValue(FOUpdaterClient.Strings.Section, FOUpdaterClient.Strings.RandomSource, false)) { List <string> randomList = new List <string>(); Random random = new Random((int)DateTime.Now.Ticks); int count = sources.Count; while (randomList.Count != count) { string element = sources[random.Next(0, sources.Count)]; if (randomList.Contains(element)) { continue; } randomList.Add(element); sources.Remove(element); } sources = randomList; } this.Sources = sources; uint updated = 0, deleted = 0; bool foundSource = false; foreach (string source in this.Sources) { bool nextUpdateType = false; FOUpdateType type = this.GetUpdateType(source); UpdateInfo info = null; if (type == FOUpdateType.Stream) { info = new UpdateInfoStream(this); } else if (type == FOUpdateType.HTTP) { info = new UpdateInfoHTTP(this); } /* * else if( type == UpdateType.FTP ) * info = new UpdateInfoFTP( this ); */ else { continue; } if (info.Start(defaultSource)) { foundSource = true; lock (this.locker) { this.SendMessage(FOUpdaterMessage.General, Strings.CheckingFiles); } List <UpdateFile> needUpdate = new List <UpdateFile>(); this.SendProgress(FOUpdaterProgress.FileValue, 0); this.SendProgress(FOUpdaterProgress.FileMaximum, 0); this.SendProgress(FOUpdaterProgress.TotalValue, 0); this.SendProgress(FOUpdaterProgress.TotalMaximum, 0); uint progressMax = 0; foreach (UpdateFile file in info.Files) { lock (this.locker) { if (file.Delete) { if (File.Exists(file.FileName)) { File.Delete(file.FileName); deleted++; } continue; } if (file.NeedUpdate) { progressMax += file.Size; this.SendProgress(FOUpdaterProgress.TotalMaximum, progressMax); needUpdate.Add(file); } } } if (needUpdate.Count == 0) { lock (this.locker) { this.SendMessage(FOUpdaterMessage.General, (deleted > 0 ? Strings.DeletedFiles : Strings.UpdateNotNeeded )); } info.End(); return(FOUpdaterResult.OK); } foreach (UpdateFile file in needUpdate) { lock (this.locker) { if (this.Cancelled) { break; } this.SendProgress(FOUpdaterProgress.FileValue, 0); this.SendProgress(FOUpdaterProgress.FileMaximum, file.Size); this.SendMessage(FOUpdaterMessage.General, Strings.Downloading.Replace("%s", file.FileName)); } file.PrepareDirectory(); if (!file.Download(fileProgress, fileSave, fileComplete)) { if (this.Cancelled) { break; } else { nextUpdateType = true; } } else { updated++; } lock ( locker ) { this.progressTotal += file.Size; this.SendProgress(FOUpdaterProgress.TotalValue, this.progressTotal); } } info.End(); } else { nextUpdateType = true; } if (this.Cancelled || !nextUpdateType) { break; } } FOUpdaterResult result = FOUpdaterResult.OK; lock (this.locker) { this.SendMessage(FOUpdaterMessage.Detailed, null); if (!foundSource) { this.SendMessage(FOUpdaterMessage.General, Strings.NoSources); result = FOUpdaterResult.NoSource; } else if (this.Cancelled) { this.SendMessage(FOUpdaterMessage.General, Strings.Cancelled); result = FOUpdaterResult.Cancel; } else { this.SendProgress(FOUpdaterProgress.FileValue, 0); this.SendProgress(FOUpdaterProgress.FileMaximum, 0); this.SendMessage(FOUpdaterMessage.General, (deleted > 0 ? Strings.UpdatedDeletedFiles.Replace("%u", "" + updated).Replace("%d", "" + deleted) : Strings.UpdatedFiles.Replace("%u", "" + updated))); } } return(result); }