StableVersion4.3/AppAutoUpdater/AutoUpdater/AutoUpdateHelper/AutoUpdater.cs

192 lines
12 KiB
C#
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*****************************************************************
* Copyright (C) Knights Warrior Corporation. All rights reserved.
*
* Author: 圣殿骑士Knights Warrior
* Email: KnightsWarrior@msn.com
* Website: http://www.cnblogs.com/KnightsWarrior/ https://github.com/knightswarrior
* Create Date: 5/8/2010
* Usage:
*
* RevisionHistory
* Date Author Description
*
*****************************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;
namespace KnightsWarriorAutoupdater
{
#region The delegate
public delegate void ShowHandler();
#endregion
public class AutoUpdater : IAutoUpdater
{
#region The private fields
private Config config = null;
private bool bNeedRestart = false;
private bool bDownload = false;
List<DownloadFileInfo> downloadFileListTemp = null;
#endregion
#region The public event
public event ShowHandler OnShow;
#endregion
#region The constructor of AutoUpdater
public AutoUpdater()
{
config = Config.LoadConfig(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConstFile.FILENAME));
}
#endregion
#region The public method
public void Update()
{
if (!config.Enabled)
return;
Dictionary<string, RemoteFile> listRemotFile = ParseRemoteXml(config.ServerUrl);
List<DownloadFileInfo> downloadList = new List<DownloadFileInfo>();
foreach (LocalFile file in config.UpdateFileList)
{
if (listRemotFile.ContainsKey(file.Path))
{
RemoteFile rf = listRemotFile[file.Path];
Version v1 = new Version(rf.LastVer);
Version v2 = new Version(file.LastVer);
if (v1 > v2)
{
downloadList.Add(new DownloadFileInfo(rf.Url, file.Path, rf.LastVer, rf.Size));
file.LastVer = rf.LastVer;
file.Size = rf.Size;
if (rf.NeedRestart)
bNeedRestart = true;
bDownload = true;
}
listRemotFile.Remove(file.Path);
}
}
foreach (RemoteFile file in listRemotFile.Values)
{
downloadList.Add(new DownloadFileInfo(file.Url, file.Path, file.LastVer, file.Size));
if (file.NeedRestart)
bNeedRestart = true;
}
downloadFileListTemp = downloadList;
if (bDownload)
{
DownloadConfirm dc = new DownloadConfirm(downloadList);
if (this.OnShow != null)
this.OnShow();
if (DialogResult.OK == dc.ShowDialog())
{
StartDownload(downloadList);
}
}
}
public void RollBack()
{
foreach (DownloadFileInfo file in downloadFileListTemp)
{
string tempUrlPath = CommonUnitity.GetFolderUrl(file);
string oldPath = string.Empty;
try
{
if (!string.IsNullOrEmpty(tempUrlPath))
{
oldPath = Path.Combine(CommonUnitity.SystemBinUrl + tempUrlPath.Substring(1), file.FileName);
}
else
{
oldPath = Path.Combine(CommonUnitity.SystemBinUrl, file.FileName);
}
if (oldPath.EndsWith("_"))
oldPath = oldPath.Substring(0, oldPath.Length - 1);
MoveFolderToOld(oldPath + ".old", oldPath);
}
catch (Exception ex)
{
//log the error message,you can use the application's log code
}
}
}
#endregion
#region The private method
string newfilepath = string.Empty;
private void MoveFolderToOld(string oldPath, string newPath)
{
if (File.Exists(oldPath) && File.Exists(newPath))
{
System.IO.File.Copy(oldPath, newPath, true);
}
}
private void StartDownload(List<DownloadFileInfo> downloadList)
{
DownloadProgress dp = new DownloadProgress(downloadList);
if (dp.ShowDialog() == DialogResult.OK)
{
//
if (DialogResult.Cancel == dp.ShowDialog())
{
return;
}
//Update successfully
config.SaveConfig(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConstFile.FILENAME));
if (bNeedRestart)
{
//Delete the temp folder
Directory.Delete(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConstFile.TEMPFOLDERNAME), true);
MessageBox.Show(ConstFile.APPLYTHEUPDATE, ConstFile.MESSAGETITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);
CommonUnitity.RestartApplication();
}
}
}
private Dictionary<string, RemoteFile> ParseRemoteXml(string xml)
{
XmlDocument document = new XmlDocument();
document.Load(xml);
Dictionary<string, RemoteFile> list = new Dictionary<string, RemoteFile>();
foreach (XmlNode node in document.DocumentElement.ChildNodes)
{
list.Add(node.Attributes["path"].Value, new RemoteFile(node));
}
return list;
}
#endregion
}
}