using Shared.Common; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter.HdlBackup { /// /// 网关备份的界面 /// public class HdlGatewayBackUpForm : UserCenterCommonForm { #region ■ 变量声明___________________________ /// /// 列表控件 /// private VerticalScrolViewLayout listView = null; /// /// 网关对象(这个是真实物理网关对象) /// private ZbGateway zbRealGateway = null; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// /// public void ShowForm(ZbGateway i_zbGateway) { this.zbRealGateway = i_zbGateway; //设置标题信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uBackupAndRecover)); //右上添加按钮 var btnTopIcon = new TopLayoutMostRightView(); btnTopIcon.UnSelectedImagePath = "Item/Add.png"; btnTopIcon.SelectedImagePath = "Item/AddSelected.png"; topFrameLayout.AddChidren(btnTopIcon); btnTopIcon.MouseUpEventHandler += (sender, e) => { //显示添加备考名画面 this.ShowAddBackupForm(); }; //初始化中部控件 this.InitMiddleFrame(); } /// /// 初始化中部控件 /// private void InitMiddleFrame() { listView = new VerticalScrolViewLayout(); listView.Height = bodyFrameLayout.Height; bodyFrameLayout.AddChidren(listView); new System.Threading.Thread(() => { //从云端获取数据 this.SetBackupInfoToForm(); }) { IsBackground = true }.Start(); } #endregion #region ■ 从云端获取数据_____________________ /// /// 从云端获取数据 /// private async void SetBackupInfoToForm() { //进度条 this.ShowProgressBar(); //从云端获取数据 var pageData = await HdlBackupLogic.Current.GetBackupListNameFromDB(2, Common.LocalGateway.Current.GetGatewayId(zbRealGateway)); //关闭 this.CloseProgressBar(); if (pageData == null) { return; } Application.RunOnMainThread(() => { listView.RemoveAll(); }); foreach (BackupListNameInfo fileInfo in pageData) { Application.RunOnMainThread(() => { //添加备份行 this.AddRowlayout(fileInfo); }); } } #endregion #region ■ 添加备份行_________________________ /// /// 添加备份行 /// /// private void AddRowlayout(BackupListNameInfo fileInfo) { //行 var rowLayout = new StatuRowLayout(listView); //图标 var btnPoint = new RowLeftIconView(); btnPoint.SelectedImagePath = "Center/BackupSelected.png"; btnPoint.UnSelectedImagePath = "Center/Backup.png"; rowLayout.AddChidren(btnPoint); //备份名字 var txtText = new RowCenterView(); txtText.Text = fileInfo.BackupName; rowLayout.AddChidren(txtText); txtText.X -= ControlCommonResourse.PointXXLeft; //编辑备注名 rowLayout.MouseUpEvent += (sender, e) => { //显示编辑备考名画面 this.ShowEditorBackupForm(fileInfo); }; //下载图标 var btnLoad = new MostRightEmptyView(); //启用点亮功能 btnLoad.UseClickStatu = true; btnLoad.UnSelectedImagePath = "Item/DownLoad.png"; btnLoad.SelectedImagePath = "Item/DownLoadSelected.png"; rowLayout.AddChidren(btnLoad, ChidrenBindMode.NotBind); //下载图标太右边不好看 btnLoad.X -= Application.GetRealWidth(50); btnLoad.MouseUpEventHandler += (sender, e) => { //是否要下载并恢复数据? string msg = Language.StringByID(R.MyInternationalizationString.uDownLoadAndRecoverMsg); this.ShowConfirmMsg(msg, "LoadBackupInfo", fileInfo.Id); }; //删除 var btnDelete = new RowDeleteButton(); rowLayout.AddRightView(btnDelete); btnDelete.MouseUpEventHandler += (sender, e) => { //确定要删除文件吗? string msg = Language.StringByID(R.MyInternationalizationString.uDoDeleteFileMsg); this.ShowConfirmMsg(msg, "DeleteBackInfo", fileInfo.Id, ShowErrorMode.YES); }; } #endregion #region ■ 读取备份文档_______________________ /// /// 读取备份文档 /// /// public void LoadBackupInfo(string BackupClassId) { new System.Threading.Thread(async () => { //获取网关上面存在的全部文件 var listFile = await this.GetGatewayFileFromGateway(); if (listFile == null) { return; } //从云端获取备份的文件 bool result = await HdlBackupLogic.Current.LoadGatewayBackupInfo(BackupClassId, zbRealGateway, listFile); if (result == false) { //网关恢复失败 string msg2 = Language.StringByID(R.MyInternationalizationString.uGatewayFileRecoverFail); this.ShowNormalMsg(msg2); return; } Application.RunOnMainThread(() => { //关闭自身 this.CloseForm(); }); //网关恢复成功 string msg = Language.StringByID(R.MyInternationalizationString.uGatewayFileRecoverSuccess); this.ShowNormalMsg(msg); }) { IsBackground = true }.Start(); } #endregion #region ■ 上传数据___________________________ /// /// 上传数据 /// /// private async void UpLoadBackInfo(string backName) { //展开进度条 this.ShowProgressBar(); //创建一个备份名字 string backupClassId = await HdlBackupLogic.Current.CreatNewBackupNameToDB(backName, 2, Common.LocalGateway.Current.GetGatewayId(zbRealGateway)); if (backupClassId == null) { //创建备份名字失败 string msg = Language.StringByID(R.MyInternationalizationString.uCreatBackupNameFail); this.ShowErrorMsg(msg); //关闭进度条 this.CloseProgressBar(); return; } //添加附加情报:获取网关数据 string appendText = Language.StringByID(R.MyInternationalizationString.uGetGatewayData); ProgressBar.SetAppendText(appendText); //这里是从网关获取备份文件:将网关文件存入到指定的路径下 string directory = await this.SetGatewayFileInDirectory(); //关闭进度条 this.CloseProgressBar(); if (directory == null) { //如果上传失败的话,就把它删除 this.DeleteBackInfo(backupClassId, ShowErrorMode.NO); return; } //添加附加情报:上传数据 appendText = Language.StringByID(R.MyInternationalizationString.uDataUpLoad); ProgressBar.SetAppendText(appendText); new System.Threading.Thread(async () => { //上传数据到云端 directory = UserCenterLogic.CombinePath(directory); bool result = await HdlBackupLogic.Current.UpLoadBackupFileToDB(backupClassId, 2, directory); //清空附加情报 ProgressBar.SetAppendText(string.Empty); if (result == false) { //文件上传失败 string msg = Language.StringByID(R.MyInternationalizationString.uFileUpLoadFail); this.ShowErrorMsg(msg); //如果上传失败的话,就把它删除 this.DeleteBackInfo(backupClassId, ShowErrorMode.NO); return; } //刷新画面 this.SetBackupInfoToForm(); }) { IsBackground = true }.Start(); } #endregion #region ■ 编辑备份名称_______________________ /// /// 编辑备份名称 /// /// /// private async void EditorBackInfo(string BackupClassId, string backName) { //开启进度条 this.ShowProgressBar(); var Pra = new EditorBackUpNamePra(); Pra.BackupClassId = BackupClassId; Pra.BackupName = backName; bool result = await UserCenterLogic.GetResultStatuByRequestHttps("App/UpdateHomeAppGatewayName", Pra); if (result == false) { //编辑备份名称失败 string msg = Language.StringByID(R.MyInternationalizationString.uEditorBackupNameFail); this.ShowErrorMsg(msg); //关闭进度条 this.CloseProgressBar(); return; } this.SetBackupInfoToForm(); } #endregion #region ■ 删除备份文档_______________________ /// /// 删除备份文档 /// /// /// public async void DeleteBackInfo(string BackupClassId, ShowErrorMode showMode = ShowErrorMode.YES) { //进度条 this.ShowProgressBar(); bool success = await HdlBackupLogic.Current.DeleteDbBackupData(BackupClassId); //关闭进度条 this.CloseProgressBar(); if (success == false) { if (showMode == ShowErrorMode.YES) { //删除备份失败 string msg = Language.StringByID(R.MyInternationalizationString.uDeleteBackupFail); this.ShowErrorMsg(msg); } return; } this.SetBackupInfoToForm(); } #endregion #region ■ 显示编辑备考名画面_________________ /// /// 显示编辑备考名画面 /// /// /// private void ShowEditorBackupForm(BackupListNameInfo fileInfo) { //生成一个弹窗画面 var dialogForm = new DialogInputFrameControl(this, DialogFrameMode.OnlyInput); //编辑备份 dialogForm.SetTitleText(Language.StringByID(R.MyInternationalizationString.uEditorBackup)); //请输入备注名称 dialogForm.SetTipText(Language.StringByID(R.MyInternationalizationString.uPleaseInpuBackup)); dialogForm.InputText = fileInfo.BackupName; //按下确认按钮 dialogForm.ComfirmClickEvent += (() => { string txtvalue = dialogForm.InputText; //检测备考名称 if (this.CheckBackupName(txtvalue) == false) { return; } //画面关闭 dialogForm.CloseDialog(); //名字一样时,不处理 if (txtvalue != fileInfo.BackupName) { //编辑备份名称 this.EditorBackInfo(fileInfo.Id, txtvalue); } }); } /// /// 显示添加备考名画面 /// /// private void ShowAddBackupForm() { //生成一个弹窗画面 var dialogForm = new DialogInputFrameControl(this, DialogFrameMode.OnlyInput); //添加备份 dialogForm.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddBackup)); //请输入备注名称 dialogForm.SetTipText(Language.StringByID(R.MyInternationalizationString.uPleaseInpuBackup)); //按下确认按钮 dialogForm.ComfirmClickEvent += (() => { string txtvalue = dialogForm.InputText; //检测备考名称 if (this.CheckBackupName(txtvalue) == false) { return; } //画面关闭 dialogForm.CloseDialog(); //上传备份 this.UpLoadBackInfo(txtvalue); }); } #endregion #region ■ 获取网关文件_______________________ /// /// 将网关文件存入到指定的路径下 /// /// private async Task SetGatewayFileInDirectory() { //上传网关备份文件到云端的临时【文件夹】 string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.GatewayBackupDirectory); Global.CreateEmptyDirectory(dir, true); //从网关获取它的文件 var listFile = await this.GetGatewayFileFromGateway(); if (listFile == null) { return null; } int timeOutCount = 0; bool receiving = false; string checkTopic = Common.LocalGateway.Current.GetGatewayId(zbRealGateway) + "/FileTransfer/DownloadFile"; var listByteSource = new List(); //接收数据 Action action = (topic, dataContent) => { string[] arry = topic.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); string checkValue = arry[0] + "/" + arry[1] + "/" + arry[2]; if (arry.Length < 3 || checkValue != checkTopic) { return; } //刷新超时时间 timeOutCount = 0; byte[] fileBytes = dataContent; if (fileBytes[5] != 1) { if (fileBytes.Length == 2056) { var tempBytes = new byte[2048]; System.Array.Copy(fileBytes, 8, tempBytes, 0, 2048); listByteSource.AddRange(tempBytes); } else { var tempBytes = new byte[fileBytes.Length - 8]; System.Array.Copy(fileBytes, 8, tempBytes, 0, tempBytes.Length); listByteSource.AddRange(tempBytes); } } else { var tempBytes = new byte[fileBytes.Length - 8]; System.Array.Copy(fileBytes, 8, tempBytes, 0, tempBytes.Length); listByteSource.AddRange(tempBytes); string [] Arryfile = listFile[0].Split(new string[] { "/" }, StringSplitOptions.None); string fileName = Arryfile[Arryfile.Length - 1]; //将输入写入本地的临时文件夹 Global.WriteFileToDirectoryByBytes(dir, fileName, listByteSource.ToArray()); listByteSource.Clear(); //移除死循环内的指定目标 listFile.RemoveAt(0); receiving = false; } }; zbRealGateway.FileContentAction += action; //设置进度条的最大值 this.SetProgressMax(listFile.Count); while (listFile.Count > 0) { timeOutCount++; if (timeOutCount == 150) { //30秒超时:响应超时,获取网关文件失败 string msg = Language.StringByID(R.MyInternationalizationString.uResponseTimeoutsAndGetGatewayFileFail); this.ShowErrorMsg(msg); zbRealGateway.FileContentAction -= action; return null; } //接收中 if (receiving == true) { await Task.Delay(200); continue; } receiving = true; string[] Arryfile = listFile[0].Split(new string[] { "/" }, StringSplitOptions.None); string fileName = Arryfile[Arryfile.Length - 1]; //下载文件 var saveFileName = await zbRealGateway.SetDownloadFileAsync(fileName); //检测网关返回的共通错误状态码 var error = UserCenterLogic.CheckCommonErrorCode(saveFileName); if (error != null) { this.ShowTip(error); zbRealGateway.FileContentAction -= action; return null; } if (saveFileName == null || saveFileName.setDownloadFileResponseData == null || saveFileName.setDownloadFileResponseData.Result != 0) { //获取网关文件失败 string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayFileFail); this.ShowErrorMsg(msg); zbRealGateway.FileContentAction -= action; return null; } //设置进度值 this.SetProgressValue(1); } zbRealGateway.FileContentAction -= action; return dir; } /// /// 从网关获取它的文件 /// /// private async Task> GetGatewayFileFromGateway() { var fileData = await zbRealGateway.FileTransferLsDirAsync(); //检测网关返回的共通错误状态码 string error = UserCenterLogic.CheckCommonErrorCode(fileData); if (error != null) { this.ShowErrorMsg(error); return null; } if (fileData == null || fileData.fileTransferLsDiResponseData == null || fileData.fileTransferLsDiResponseData.Result != 0) { //获取网关文件失败 string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayFileFail); this.ShowErrorMsg(msg); return null; } var listFile = new List(); foreach (var filedata in fileData.fileTransferLsDiResponseData.Dir) { listFile.Add(filedata.File); } return listFile; } #endregion #region ■ 一般方法___________________________ /// /// 检测备考名称 /// /// /// private bool CheckBackupName(string backName) { if (backName == string.Empty) { //请输入备注名称 string msg = Language.StringByID(R.MyInternationalizationString.uPleaseInpuBackup); this.ShowErrorMsg(msg); return false; } return true; } #endregion } }