using SuperMap.RealEstate.Launcher_WinForm; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; using System.Windows.Forms; namespace SuperMap.RealEstate.Launcher { public class LauncherApplication : BackgroundDownload { LauncherInfo _LauncherInfo; string _TempGuidDirectory; string _TempDirectory; public LauncherApplication(LauncherInfo launcherInfo) : base() { _TempDirectory = AppDomain.CurrentDomain.BaseDirectory + "Temp\\"; _TempGuidDirectory = _TempDirectory + Guid.NewGuid().ToString() + "\\"; _LauncherInfo = launcherInfo; LoadingHelper.Init(_TempDirectory); } Dictionary _DownLoadList = new Dictionary(); #region CheckMainVersion private bool CheckMainVersionEx(StreamReader _StreamReader) { string _LineString; _LineString = _StreamReader.ReadLine(); if (_LineString == "[Error]") { StringBuilder _StringBuilder = new StringBuilder(); while (!_StreamReader.EndOfStream) _StringBuilder.AppendLine(_StreamReader.ReadLine()); ShowError(_StringBuilder.ToString()); return false; } if (_LineString != "[Launcher]") { ShowError("服务器的Launcher.ini文件首行必须为\"[Launcher]\"!"); return false; } string[] _KeyValue = _StreamReader.ReadLine().Split(':'); if (_KeyValue.Length != 2 && _KeyValue[0] != "Version") { ShowError("服务器的Launcher.ini文件[Launcher]节点异常!"); return false; } string _Version = GetFileVersion(Application.ExecutablePath); if (_KeyValue[1] != GetFileVersion(Application.ExecutablePath)) { //this.ProgressBarHide(); //#if DEBUG //MessageBox.Show("主程序版本不一致,点击“确定”将自动升级。\r\n" + // "本地版本:" + _Version + ";\r\n" + // "服务版本:" + _KeyValue[1] + ";", "驿商科技", MessageBoxButtons.OK, // MessageBoxIcon.Warning); //#endif this.ProgressBarText = "更新 版本 v" + _KeyValue[1] + "..."; string _UrlAddress = string.Format(LaunchHelper.Launcher_DownLoadUrl, _LauncherInfo.HostUrl, LaunchHelper.Launcher_FileName); string _FileName = _TempGuidDirectory + LaunchHelper.Launcher_UpdateFileName; DownloadFileAsync(_UrlAddress, _FileName); WaitingForDownloadFileAsyncCompleted(); string _UpdateFileName = AppDomain.CurrentDomain.BaseDirectory + LaunchHelper.Launcher_UpdateFileName; if (File.Exists(_UpdateFileName)) File.Delete(_UpdateFileName); File.Move(_FileName, _UpdateFileName); LaunchHelper.Start(_UpdateFileName, _LauncherInfo.SourceArguments); return false; } _KeyValue = _StreamReader.ReadLine().Split(':'); if (_KeyValue.Length != 2 && _KeyValue[0] != "DateTime") { ShowError("服务器的Launcher.ini文件[Launcher]节点未配置DateTime!"); return false; } //MessageBox.Show(_KeyValue[1]); return LocalTimeHelper.SetLocalTime(_KeyValue[1]); } #endregion #region CheckCoreFile private bool CheckCoreFileEx(StreamReader _StreamReader) { string _LineString, _FileName, _AppPath; string[] _KeyValue; _AppPath = AppDomain.CurrentDomain.BaseDirectory; _LineString = _StreamReader.ReadLine(); while (!_StreamReader.EndOfStream) { if (_LineString.Equals("[Core]", StringComparison.CurrentCultureIgnoreCase)) break; _LineString = _StreamReader.ReadLine(); } //[Core] if (!_LineString.Equals("[Core]", StringComparison.CurrentCultureIgnoreCase)) { ShowError("无法获取节点[Core],请检查配置!"); return false; } //File: _LineString = _StreamReader.ReadLine(); _DownLoadList.Clear(); while (!string.IsNullOrEmpty(_LineString)) { _KeyValue = _LineString.Split(':'); _FileName = _AppPath + _KeyValue[1].Replace("Core\\", "Bin\\"); //Version: _LineString = _StreamReader.ReadLine(); //_KeyValue = _LineString.Split(':'); if (!File.Exists(_FileName) || GetFileVersion(_FileName) != _LineString.Split(':')[1]) { //Deploy: _LineString = _StreamReader.ReadLine(); if (!_DownLoadList.ContainsKey(_KeyValue[1])) { _DownLoadList.Add(_KeyValue[1], _LineString.Split(':')[1]); } } else { //Deploy: _LineString = _StreamReader.ReadLine(); } //File: if (!_StreamReader.EndOfStream) _LineString = _StreamReader.ReadLine(); else _LineString = string.Empty; } bool _Result = DownLoadFileFromServer(_DownLoadList); if (_Result) { string _CorePath = _TempGuidDirectory + "Core"; if (Directory.Exists(_CorePath)) { string _BinPath = AppDomain.CurrentDomain.BaseDirectory + "Bin\\"; if (!Directory.Exists(_BinPath)) Directory.CreateDirectory(_BinPath); string[] _CoreFiles = Directory.GetFiles(_CorePath); int _LoadMessageHandle = 0; foreach (string _File in _CoreFiles) { this.ProgressBarText = "更新 " + Path.GetFileName(_File) + " ..."; if (_File.EndsWith(LaunchHelper.Loading_FileName)) _LoadMessageHandle = LoadingHelper.SaveMessage(); if (File.Exists(_BinPath + Path.GetFileName(_File))) File.Delete(_BinPath + Path.GetFileName(_File)); File.Copy(_File, _BinPath + Path.GetFileName(_File), true); File.Delete(_File); if (_LoadMessageHandle > 0) LoadingHelper.LoadMessage(_LoadMessageHandle); } Directory.Delete(_TempGuidDirectory + "Core", true); } } return _Result; } #endregion bool DownLoadFileFromServer(Dictionary FileDictionary) { Progress2Value = 0; Progress1Value = 100; SetProgress2Maximum(FileDictionary.Count); if (FileDictionary.Count == 0) { return true; } foreach (KeyValuePair _KeyValuePair in FileDictionary) { Progress1Value = 0; string _UrlAddress = string.Format(LaunchHelper.Launcher_DownLoadUrl, _LauncherInfo.HostUrl, _KeyValuePair.Value); string _FileName = _TempGuidDirectory + _KeyValuePair.Key; this.ProgressBarText = "下载 " + Path.GetFileName(_FileName) + " ..."; this.DownloadFileAsync(_UrlAddress, _FileName); this.WaitingForDownloadFileAsyncCompleted(); Progress1Value = 100; Progress2Value++; } return true; } #region CheckAppRuns public bool CheckAppRuns(string FileName) { using (StreamReader _StreamReader = File.OpenText(FileName)) { try { //检查主版本 if (!CheckMainVersionEx(_StreamReader)) return false; //检查核心文件 if (!CheckCoreFileEx(_StreamReader)) return false; //检查AppRuns if (!CheckAppRunsEx(_StreamReader)) return false; } catch (Exception ex) { ShowError(ex.Message); return false; } finally { _StreamReader.Close(); File.Delete(FileName); } } return true; } private bool CheckAppRunsEx(StreamReader _StreamReader) { string _LineString, _Path, _AppPath; string[] _KeyValue; _AppPath = AppDomain.CurrentDomain.BaseDirectory; _DownLoadList.Clear(); _LineString = _StreamReader.ReadLine(); while (!_StreamReader.EndOfStream) { if (_LineString.Equals("[AppRuns]", StringComparison.CurrentCultureIgnoreCase)) break; _LineString = _StreamReader.ReadLine(); } //[AppRuns] if (!_LineString.Equals("[AppRuns]", StringComparison.CurrentCultureIgnoreCase)) { ShowError("无法获取节点[AppRuns],请检查配置!"); return false; } //Name: _LineString = _StreamReader.ReadLine(); _KeyValue = _LineString.Split(':'); if (_LauncherInfo.AppName != _KeyValue[1]) { ShowError("错误的Name关键字,请检查环境配置!"); return false; } //Desc _LineString = _StreamReader.ReadLine(); //Path _LineString = _StreamReader.ReadLine(); _AppPath += _LauncherInfo.Type + "\\"; _LauncherInfo.PathName = _AppPath + _LineString.Split(':')[1]; _LineString = _StreamReader.ReadLine(); //File: _KeyValue = _LineString.Split(':'); _Path = _AppPath + _KeyValue[1]; _LauncherInfo.FileName = _Path; //Version _LineString = _StreamReader.ReadLine(); if (!File.Exists(_Path)) { //Deploy _LineString = _StreamReader.ReadLine(); _KeyValue = _LineString.Split(':'); _LineString = _LauncherInfo.Type + "\\" + _LauncherInfo.AppName + ".7z"; if (!_DownLoadList.ContainsKey(_LineString)) { _DownLoadList.Add(_LineString, _KeyValue[1]); } } else { //检查版本 if (GetFileVersion(_Path) != _LineString.Split(':')[1]) { //MessageBox.Show("版本不一致。"); //Deploy _LineString = _StreamReader.ReadLine(); _KeyValue = _LineString.Split(':'); _LineString = _LauncherInfo.Type + "\\" + _LauncherInfo.AppName + ".7z"; if (!_DownLoadList.ContainsKey(_LineString)) { _DownLoadList.Add(_LineString, _KeyValue[1]); } } else { //Deploy _LineString = _StreamReader.ReadLine(); } //[ServerFileCollection] _LineString = _StreamReader.ReadLine(); int _Number = 1; while (!_StreamReader.EndOfStream) { _LineString = _StreamReader.ReadLine(); if (String.IsNullOrEmpty(_LineString)) continue; _KeyValue = _LineString.Split(':'); _Path = _AppPath + _KeyValue[0]; _LineString = _LauncherInfo.Type + "\\ServerFile_" + _Number + ".7z"; if (File.Exists(_Path) && _KeyValue[1] == LaunchHelper.GetMD5HashFromFile(_Path)) continue; if (!_DownLoadList.ContainsKey(_LineString)) { _LauncherInfo.HashDictionary.Add(_KeyValue[0], _LineString); _DownLoadList.Add(_LineString, _KeyValue[2]); _Number++; } } } bool _Result = DownLoadFileFromServer(_DownLoadList); if (_Result) { string _AppRunsPath = _TempGuidDirectory + _LauncherInfo.Type + "\\" + _LauncherInfo.AppName + ".7z"; if (File.Exists(_AppRunsPath)) { this.ProgressBarText = "更新 " + _LauncherInfo.AppName; if (Directory.Exists(_LauncherInfo.PathName)) Directory.Delete(_LauncherInfo.PathName, true); Compress7z.UnZip(_AppRunsPath, _LauncherInfo.PathName); //this.ProgressBarText = "更新文件..."; File.Delete(_AppRunsPath); } //检查配置 foreach (KeyValuePair _KeyValuePair in _LauncherInfo.HashDictionary) { _AppRunsPath = _TempGuidDirectory + _KeyValuePair.Value; this.ProgressBarText = "更新 " + Path.GetFileName(_KeyValuePair.Key); Compress7z.UnZip(_AppRunsPath, Path.GetDirectoryName(_AppRunsPath)); File.Delete(_AppRunsPath); _AppRunsPath = AppDomain.CurrentDomain.BaseDirectory + _LauncherInfo.Type + "\\" + _KeyValuePair.Key; string _SourceFileName = _TempGuidDirectory + _LauncherInfo.Type + "\\" + Path.GetFileName(_AppRunsPath); File.Copy(_SourceFileName, _AppRunsPath, true); File.Delete(_SourceFileName); } } return _Result; } #endregion #region CheckInstall public bool CheckInstall(string FileName) { using (StreamReader _StreamReader = File.OpenText(FileName)) { try { //检查主版本 if (!CheckMainVersionEx(_StreamReader)) return false; //检查核心文件 if (!CheckCoreFileEx(_StreamReader)) return false; this.ProgressBarText = "加载 组件清单..."; //检查Install if (!CheckInstallEx(_StreamReader)) return false; //启动Install } catch (Exception ex) { ShowError(ex.Message); return false; } finally { _StreamReader.Close(); File.Delete(FileName); } } return true; } private bool CheckInstallEx(StreamReader _StreamReader) { string _LineString, _AppPath; _AppPath = AppDomain.CurrentDomain.BaseDirectory; string _Group, _Name; bool _Include = false; StringBuilder _StringBuilder, _StringBuilderAll; _StringBuilderAll = new StringBuilder(); while (!_StreamReader.EndOfStream) { _LineString = _StreamReader.ReadLine(); if (!_LineString.Equals("[Install]", StringComparison.CurrentCultureIgnoreCase)) continue; _Include = false; _StringBuilder = new StringBuilder(); _LineString = _StreamReader.ReadLine(); _StringBuilder.AppendLine(_LineString); _Group = _LineString.Split(':')[1]; _LineString = _StreamReader.ReadLine(); _StringBuilder.AppendLine(_LineString); _Name = _LineString.Split(':')[1]; if (String.IsNullOrEmpty(_LauncherInfo.GroupName) && String.IsNullOrEmpty(_LauncherInfo.AppName)) _Include = true; if (!_Include) { if (_Group.Equals(_LauncherInfo.GroupName, StringComparison.CurrentCultureIgnoreCase)) _Include = true; if (_Name.Equals(_LauncherInfo.AppName, StringComparison.CurrentCultureIgnoreCase)) _Include = true; } if (!_Include) continue; while (!_StreamReader.EndOfStream) { _LineString = _StreamReader.ReadLine(); if (String.IsNullOrEmpty(_LineString)) break; if (_LineString.StartsWith("Deploy:")) _StringBuilder.AppendLine("Deploy:" + _LauncherInfo.HostUrl + "/SoftWare/" + _LineString.Split(':')[1]); else _StringBuilder.AppendLine(_LineString); } _StringBuilderAll.AppendLine(_StringBuilder.ToString()); } //if (_StringBuilderAll.Length > 0) //{ _LineString = _TempGuidDirectory + "CurrInstall.ini"; using (StreamWriter _StreamWriter = File.CreateText(_LineString)) { _StreamWriter.Write(_StringBuilderAll.ToString()); _StreamWriter.Close(); } _LauncherInfo.Arguments = _LineString; _LauncherInfo.FileName = _AppPath + "Bin\\" + LaunchHelper.Installer_FileName; return true; //} //else //{ // //File.Delete(_TempGuidDirectory + LaunchHelper.Installer_FileName); // return true; //} } #endregion private void ShowError(string message) { LoadingHelper.ForceExit(); MessageBox.Show(message, "驿商科技", MessageBoxButtons.OK, MessageBoxIcon.Error); } private string GetFileVersion(string filePath) { if (!File.Exists(filePath)) return "不存在"; FileVersionInfo _FileVersionInfo = FileVersionInfo.GetVersionInfo(filePath); if (String.IsNullOrEmpty(_FileVersionInfo.FileVersion)) return "无版本"; else return _FileVersionInfo.FileVersion.Split(' ')[0]; } public void AppRuns() { //ProgressBarText = "正在初始化..."; string _UrlAddress = string.Format(LaunchHelper.Launcher_RequestUrl, _LauncherInfo.HostUrl, _LauncherInfo.Type, _LauncherInfo.AppName); string _FileName = _TempGuidDirectory + LaunchHelper.Launcher_IniFileName; ProgressBarText = "检查 版本..."; DownloadFileAsync(_UrlAddress, _FileName); WaitingForDownloadFileAsyncCompleted(); if (CheckAppRuns(_FileName)) { this.ProgressBarText = "启动 " + _LauncherInfo.AppName + "..."; _LauncherInfo.ProcessStart(); LoadingHelper.Close(); } } public void Installer() { //ProgressBarText = "正在初始化..."; string _UrlAddress = string.Format(LaunchHelper.Installer_RequestUrl, _LauncherInfo.HostUrl, _LauncherInfo.Type); string _FileName = _TempGuidDirectory + LaunchHelper.Installer_IniFileName; ProgressBarText = "检查 版本..."; DownloadFileAsync(_UrlAddress, _FileName); WaitingForDownloadFileAsyncCompleted(); Progress1Value = 100; if (CheckInstall(_FileName)) { _LauncherInfo.ProcessStart(); Thread.Sleep(5000); } } protected override void Dispose(bool disposing) { if (disposing) { //#if DEBUG //#else if (Directory.Exists(_TempGuidDirectory)) Directory.Delete(_TempGuidDirectory, true); //#endif } base.Dispose(disposing); } } }