using System; using System.Collections.Generic; namespace Shared.SimpleControl.Phone { public class Databackup : FrameLayout { //WebServiceBackup service_backup = new WebServiceBackup (); VerticalScrolViewLayout VerticalScrolViewMiddle; /// /// 构造函数 /// public Databackup () { BackgroundColor = SkinStyle.Current.MainColor; } public void DatabackupShow () { this.RemoveAll (); #region 标题 var topView = new FrameLayout () { Y = Application.GetRealHeight (36), Height = Application.GetRealHeight (90), BackgroundColor = SkinStyle.Current.MainColor }; AddChidren (topView); var title = new Button () { X = Application.GetRealWidth (90), Width = Application.GetRealWidth (640 - 180), TextAlignment = TextAlignment.Center, Text = UserConfig.Instance.CurrentRegion.Name + " " + Language.StringByID (R.MyInternationalizationString.Backup), TextSize = 19, TextColor = SkinStyle.Current.TextColor1, }; topView.AddChidren (title); title.MouseUpEventHandler += (sdf, asf) => { Dialog dialog = new Dialog (); FrameLayout bodyView = new FrameLayout (); dialog.AddChidren (bodyView); bodyView.MouseUpEventHandler += (lkj, oiu) => { dialog.Close (); }; VerticalScrolViewLayout dialogBodyView = new VerticalScrolViewLayout () { Y = Application.GetRealHeight (126), Gravity = Gravity.CenterHorizontal, Width = Application.GetRealWidth (500), Height = Application.GetRealHeight (360), BackgroundColor = SkinStyle.Current.MainColor, Radius = 5, BorderColor = SkinStyle.Current.Transparent, BorderWidth = 0 }; bodyView.AddChidren (dialogBodyView); foreach (var homeTemp in UserConfig.Instance.HomeLists) { var rowView = new RowLayout () { Height = Application.GetRealHeight (110), }; dialogBodyView.AddChidren (rowView); Button btnRowLine = new Button () { Y = Application.GetRealHeight (107), Height = Application.GetRealHeight (3), BackgroundColor = SkinStyle.Current.Black50Transparent }; rowView.AddChidren (btnRowLine); var btnPoint = new Button () { Width = Application.GetRealWidth (10), Height = Application.GetRealWidth (10), X = Application.GetRealWidth (50), Gravity = Gravity.CenterVertical, UnSelectedImagePath = "Item/Point.png", SelectedImagePath = "Item/Point.png", Visible = homeTemp.Id != UserConfig.Instance.CurrentRegion.Id }; rowView.AddChidren (btnPoint); var btnName = new Button () { Width = Application.GetRealWidth (550), Text = homeTemp.Name, TextAlignment = TextAlignment.CenterLeft, X = Application.GetRealWidth (90), TextColor = SkinStyle.Current.TextColor1, }; rowView.AddChidren (btnName); if (homeTemp.Id == UserConfig.Instance.CurrentRegion.Id) { Button btnCheck = new Button () { X = Application.GetRealWidth (20), Y = Application.GetRealHeight (25), Width = Application.GetRealWidth (72), Height = Application.GetRealHeight (61), UnSelectedImagePath = "Skin/Check.png", }; rowView.AddChidren (btnCheck); } btnName.MouseUpEventHandler += (ss, ee) => { if (UserConfig.Instance.CurrentRegion == homeTemp) { dialog.Close (); return; } MainPage.Loading.Start ("Please wait..."); System.Threading.Tasks.Task.Run (() => { try { var backuplist = IO.FileUtils.ReadFiles (); int index = 0; string oldRegionRootPath = IO.FileUtils.CreateRegionBackup (UserConfig.Instance.CurrentRegion.Id); IO.FileUtils.DeleteRegionFiles (oldRegionRootPath); foreach (var fileName in backuplist) { System.IO.FileInfo fileInfo = new System.IO.FileInfo (IO.FileUtils.RootPath + fileName); if (fileInfo.Exists) { fileInfo.MoveTo (oldRegionRootPath + fileName); Utlis.WriteLine ("move file : " + fileName); } index++; Application.RunOnMainThread (() => { int pro = (int)(index * 1.0 / backuplist.Count * 50); MainPage.Loading.Text = pro.ToString () + "%"; }); } IO.FileUtils.DeleteAllFile (); string newRegionRootPath = IO.FileUtils.CreateRegionBackup (homeTemp.Id); IO.FileUtils.RestoreRegionFiles (newRegionRootPath); UserConfig.Instance.RefreshUserConfig (); UserConfig.Instance.CurrentRegion = homeTemp; UserConfig.Instance.SaveUserConfig (); Room.InitAllRoom (); //UserConfig.Instance.RefreshUserConfig (); //MainPage.LoginUser.SaveUserInfo (); Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (R.MyInternationalizationString.SwitchRegionSuccessfully), Language.StringByID (R.MyInternationalizationString.Close)).Show (); this.DatabackupShow (); EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus); }); } catch (Exception ex) { Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); Utlis.WriteLine (ex.Message); } finally { Application.RunOnMainThread (() => { MainPage.Loading.Hide (); dialog.Close (); }); } }); }; } dialog.Show (); }; Button ItemButton = new Button () { Width = Application.GetRealWidth (55), Height = Application.GetRealHeight (55), UnSelectedImagePath = "Item/+.png", SelectedImagePath = "Item/+.png", Y = Application.GetRealHeight (15), X = Application.GetRealWidth (640 - 80), }; topView.AddChidren (ItemButton); ItemButton.MouseUpEventHandler += (sender, e) => { Dialog dialog = new Dialog (); FrameLayout dialogBodyView = new FrameLayout () { Gravity = Gravity.Center, Width = Application.GetRealWidth (500), Height = Application.GetRealHeight (500), BackgroundColor = SkinStyle.Current.DialogColor, Radius = 5, BorderColor = SkinStyle.Current.Transparent, BorderWidth = 0, }; dialog.AddChidren (dialogBodyView); Button btnTitle = new Button () { Height = Application.GetRealHeight (80), BackgroundColor = SkinStyle.Current.DialogTitle, TextAlignment = TextAlignment.Center, TextID = R.MyInternationalizationString.Backup, TextColor = SkinStyle.Current.DialogTextColor }; dialogBodyView.AddChidren (btnTitle); Button btnackupRemark = new Button () { Gravity = Gravity.CenterHorizontal, Y = Application.GetRealHeight (100), Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), TextID = R.MyInternationalizationString.Remark, TextAlignment = TextAlignment.CenterLeft, TextColor = SkinStyle.Current.TextColor, }; dialogBodyView.AddChidren (btnackupRemark); EditText etBackupRemark = new EditText () { Gravity = Gravity.CenterHorizontal, Y = btnackupRemark.Bottom, Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), TextAlignment = TextAlignment.Center, Radius = 5, BorderColor = SkinStyle.Current.BorderColor, BorderWidth = 1, TextColor = SkinStyle.Current.TextColor, }; dialogBodyView.AddChidren (etBackupRemark); etBackupRemark.EditorEnterAction += (obj) => { Application.HideSoftInput (); }; FrameLayout bottomView = new FrameLayout () { Y = Application.GetRealHeight (420), Height = Application.GetRealHeight (85), BackgroundColor = SkinStyle.Current.DialogTitle }; dialogBodyView.AddChidren (bottomView); Button btnClose = new Button () { Width = Application.GetRealWidth (249), TextID = R.MyInternationalizationString.Close, TextAlignment = TextAlignment.Center }; bottomView.AddChidren (btnClose); btnClose.MouseUpEventHandler += (send2er, e2) => { dialog.Close (); }; Button btnBottomLine = new Button () { X = btnClose.Right, Width = 1, BackgroundColor = SkinStyle.Current.Black50Transparent, }; bottomView.AddChidren (btnBottomLine); Button btnSave = new Button () { X = btnBottomLine.Right, Width = Application.GetRealWidth (249), TextID = R.MyInternationalizationString.SAVE, TextAlignment = TextAlignment.Center }; bottomView.AddChidren (btnSave); btnSave.MouseUpEventHandler += (sender2, e2) => { if (etBackupRemark.Text.Trim () == "") { new Alert ("", Language.StringByID (R.MyInternationalizationString.InputNewBakeUpFilesName), Language.StringByID (R.MyInternationalizationString.Close)).Show (); return; } if (MainPage.LoginUser == null) { new Alert ("", Language.StringByID (R.MyInternationalizationString.PleaseLoginSystem), Language.StringByID (R.MyInternationalizationString.Close)).Show (); return; } userBakeupFile (etBackupRemark.Text.Trim ()); dialog.Close (); }; dialog.Show (); }; var back = new Button () { Height = Application.GetRealHeight (90), Width = Application.GetRealWidth (85), UnSelectedImagePath = "Item/Back.png", Gravity = Gravity.CenterVertical, }; topView.AddChidren (back); back.MouseUpEventHandler += (sender, e) => { (Parent as PageLayout).PageIndex -= 1; }; #endregion var FrameLayoutView = new FrameLayout () { Width = LayoutParams.MatchParent, Height = Application.GetRealHeight (1136 - 126), Y = topView.Bottom, BackgroundColor = SkinStyle.Current.ViewColor, }; AddChidren (FrameLayoutView); VerticalScrolViewMiddle = new VerticalScrolViewLayout (); VerticalScrolViewMiddle.RemoveAll (); FrameLayoutView.AddChidren (VerticalScrolViewMiddle); System.Threading.Tasks.Task.Run (() => { try { Application.RunOnMainThread (() => { MainPage.Loading.Start ("Please wait..."); }); var requestObj = new GetHomeDataBackupPaggerObj () { HomeId = UserConfig.Instance.CurrentRegion.Id, LoginAccessToken = MainPage.LoginUser.LoginTokenString }; string urlHead = MainPage.RequestHttpsHost; if (requestObj.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } //GetUserFolderObj requestObj = new GetUserFolderObj () { LevelID = UserConfig.Instance.CurrentRegion.Id }; var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); var revertObj = MainPage.RequestHttps (API.GetHomeDataBackupPagger, requestJson, urlHead); if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) { var data = Newtonsoft.Json.JsonConvert.DeserializeObject (revertObj.ResponseData.ToString ()); //var list = new List (); //foreach (var data2 in data.PageData) { // if (ZigbeeUniqueId != null && data2.GatewayUniqueId != ZigbeeUniqueId) { // continue; // } // if (getLogBackup == false && data2.BackupName == LogBackupName) { // //不获取Log备份 // continue; // } // list.Add (data2); //} //var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject> (revertObj.ResponseData.ToString ()); if (data == null) return; Application.RunOnMainThread (() => { foreach (var folder in data.PageData) { addRow (folder.BackupName, folder.Id); } }); } else { //2020-01-11 刷新一次MasterToken if (requestObj.IsOtherAccountCtrl) { //if (revertObj.StateCode == "ParameterOrEmpty" || revertObj.StateCode == "NoLogin" || revertObj.StateCode == "HomeIdAndTokenNoConsistent") { if (revertObj.StateCode != ErrorCode.NetworkError) { UserConfig.Instance.CheckIfNeedGetMasterAccountToken (); } } MainPage.ShowAlertOnMainThread ("Failed to get backup data list!"); } //var groupNames = service_backup.GetUserGroup (MainPage.LoginUser.MasterID, 0); //Application.RunOnMainThread (() => { // foreach (UserBackup groupName in groupNames) { // addRow (groupName.UserGroup); // } //}); } catch { Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); } finally { Application.RunOnMainThread (() => { MainPage.Loading.Hide (); }); } }); } void addRow (string groupName, string folderID) { var rowView = new RowLayout () { Height = Application.GetRealHeight (110), }; VerticalScrolViewMiddle.AddChidren (rowView); Button btnRowLine = new Button () { Y = Application.GetRealHeight (107), Height = Application.GetRealHeight (3), BackgroundColor = SkinStyle.Current.Black50Transparent }; rowView.AddChidren (btnRowLine); var btnDelFile = new Button () { TextID = R.MyInternationalizationString.Del, BackgroundColor = SkinStyle.Current.DelColor }; btnDelFile.MouseUpEventHandler += (sender, e) => { Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.AreYouSureToDeleteFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim)); alert.ResultEventHandler += (sender2, e2) => { if (e2) { DeleteFolderData (folderID); } }; alert.Show (); }; //if (MainPage.LoginUser.AccountType != 1) { // rowView.AddRightView (btnDelFile); //} //2020-07-01 当前住宅属于自己的 允许删除备份 if (!MainPage.IsAdministrator) { rowView.AddRightView (btnDelFile); } var btnPoint = new Button () { Width = Application.GetRealWidth (10), Height = Application.GetRealWidth (10), X = Application.GetRealWidth (25), Gravity = Gravity.CenterVertical, UnSelectedImagePath = "Item/Point.png", SelectedImagePath = "Item/Point.png", }; rowView.AddChidren (btnPoint); var btnName = new Button () { Width = Application.GetRealWidth (342), Height = LayoutParams.MatchParent, Text = groupName.Trim (), TextAlignment = TextAlignment.CenterLeft, X = Application.GetRealWidth (50), TextColor = SkinStyle.Current.TextColor1, }; rowView.AddChidren (btnName); btnName.MouseLongEventHandler += (sender, e) => { Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.AreYouSureToDeleteFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim)); alert.ResultEventHandler += (sender2, e2) => { if (e2) { DeleteFolderData (folderID); } }; alert.Show (); }; var backupIcon = new Button () { Width = Application.GetRealWidth (72), Height = Application.GetRealHeight (57), X = Application.GetRealWidth (452), }; rowView.AddChidren (backupIcon); var Backup_restores = new Button () { Width = Application.GetMinRealAverage (56), Height = Application.GetMinRealAverage (57), X = backupIcon.Right + Application.GetRealWidth (20), UnSelectedImagePath = "Register/Backup_ restores.png", SelectedImagePath = "Register/Backup_ restores_on.png", Gravity = Gravity.CenterVertical, }; rowView.AddChidren (Backup_restores); Backup_restores.MouseDownEventHandler += (sender, e) => { Backup_restores.IsSelected = true; }; Backup_restores.MouseUpEventHandler += (sender, e) => { Backup_restores.IsSelected = false; UserBakeupFileDetailedInformation (folderID); }; } /// /// 删除某个备份 /// /// void DeleteFolderData (string folderID) { MainPage.Loading.Start ("Please wait..."); System.Threading.Tasks.Task.Run (() => { try { var requestObj = new DelHomeAppGatewayNameObj () { BackupClassId = folderID, HomeId = UserConfig.Instance.CurrentRegion.Id, LoginAccessToken = MainPage.LoginUser.LoginTokenString }; string urlHead = MainPage.RequestHttpsHost; if (requestObj.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } //DeleteFolderDataObj requestObj = new DeleteFolderDataObj () { Id = folderID }; var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); var revertObj = MainPage.RequestHttps (API.DelHomeAppGatewayName, requestJson, urlHead); if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) { Application.RunOnMainThread (() => { DatabackupShow (); }); } else { ShowDelErrorInfo (revertObj.StateCode); } } catch { } finally { Application.RunOnMainThread (() => { MainPage.Loading.Hide (); }); } }); } //2020-01-11 /// /// 删除某个备份 /// /// void DeleteFolderDataAfterUploadFailed (string folderID) { Application.RunOnMainThread (() => { MainPage.Loading.Start ("Please wait..."); }); try { var requestObj = new DelHomeAppGatewayNameObj () { BackupClassId = folderID, HomeId = UserConfig.Instance.CurrentRegion.Id, LoginAccessToken = MainPage.LoginUser.LoginTokenString }; string urlHead = MainPage.RequestHttpsHost; if (requestObj.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } //DeleteFolderDataObj requestObj = new DeleteFolderDataObj () { Id = folderID }; var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); var revertObj = MainPage.RequestHttps (API.DelHomeAppGatewayName, requestJson, urlHead); if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) { //删除成功 } else { //删除失败 } } catch { } finally { Application.RunOnMainThread (() => { MainPage.Loading.Hide (); }); } } /// /// (2)ParameterOrEmpty,则响应字段中[ErrorInfo]为错误信息,ResponseData则为null //3)NoLogin,则响应字段中 [ErrorInfo] 为错误信息为 [无效登录Token!] //(5)NoRecord,则响应字段中 [ErrorInfo] 为错误信息为 [确保您所提交 [项目 (住宅)Id不存在!] //(6)BackupClassIdNoIsYou, 则响应字段中 [ErrorInfo]为错误信息为 [您所备注名主键 = XXXX并不属于您当前住宅:XXXX] //(7)NoPermission, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的权限!] //(8)InsufficientAuthority, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的完全控制权限!] //(9)HomeIdAndTokenNoConsistent, 则响应字段中 [ErrorInfo]为错误信息为 [您当前Token与你当前控制的HomeId不一致!] //(10)DeliveryBackNoUpdateDel, 则响应字段中 [ErrorInfo]为错误信息为 [此前提交文件夹Id是属于交付备份, 不能进行更新删除!] /// /// void ShowDelErrorInfo (string stateCodeStr) { string mes = ""; if (stateCodeStr == "HomeIdAndTokenNoConsistent") { //Token 验证失败 mes = ErrorCode.HomeIdAndTokenNoConsistent; } else if (stateCodeStr == "DeliveryBackNoUpdateDel") { //交付备份, 不能删除! mes = ErrorCode.DeliveryBackNoUpdateDel; } else if (stateCodeStr == ErrorCode.NetworkError) { mes = ErrorCode.NetworkError; } else { mes = ErrorCode.OperationFailed + ErrorCode.Reason + stateCodeStr; } if (!string.IsNullOrEmpty (mes)) { Application.RunOnMainThread (() => { new Alert ("", mes, Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); } } /// /// 用户备份文件 /// void userBakeupFile (string groupName) { //确定要备份该文件的数据 //Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.SureToBackupYourthisFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim)); //alert.ResultEventHandler += (object sender2, bool e2) => { //if (e2) { MainPage.Loading.Start ("Upload..."); System.Threading.Tasks.Task.Run (() => { try { //if (string.IsNullOrEmpty (UserConfig.Instance.GatewayMAC)) return; //2020-01-11 没绑定MAC不允许上传备份 if (!UserConfig.Instance.CheckHomeGatewaysNotEmpty()) { MainPage.ShowAlertOnMainThread (ErrorCode.BindGatewayFirst); return; } var requestObj = new AddHomeAppGatewayNameObj () { HomeId = UserConfig.Instance.CurrentRegion.Id, BackupName = groupName, LoginAccessToken = MainPage.LoginUser.LoginTokenString, GatewayUniqueId = UserConfig.Instance.GatewayMAC }; string urlHead = MainPage.RequestHttpsHost; if (requestObj.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } //AddFolderObj requestObj = new AddFolderObj () { LevelID = UserConfig.Instance.CurrentRegion.Id ,Name = groupName }; var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); var revertObj = MainPage.RequestHttps (API.AddHomeAppGatewayName, requestJson, urlHead); if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) { var DATA = Newtonsoft.Json.JsonConvert.DeserializeObject (revertObj.ResponseData.ToString ()); var addFolderID = DATA.BackupClassId; //UpLoadBackupFileToDB (addFolderID); UpLoadBackupFileToDBNew (addFolderID); } else { ShowAddHomeAppGatewayNameErrorInfo (revertObj.StateCode); } } catch (Exception ex) { Shared.Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show (); Utlis.WriteLine (ex.Message); }); } finally { Shared.Application.RunOnMainThread (() => { MainPage.Loading.Hide (); DatabackupShow (); }); } }); // } //}; //alert.Show (); } /// ///(1)Success 则[调用此接口操作成功],ResponseData则为null //(2)ParameterOrEmpty,则响应字段中 [ErrorInfo] 为错误信息, ResponseData则为null //(3)NoLogin,则响应字段中 [ErrorInfo] 为错误信息为 [无效登录Token!] //(4)NoRecord,则响应字段中 [ErrorInfo] 为错误信息为 [确保您所提交 [项目 (住宅)Id不存在!] //(5)Exist, 则响应字段中 [ErrorInfo]为错误信息为 [您在住宅: XXX, 当前备份名: XXXX已存在, 请换个备份再提交!] //(6)NoBind, 则响应字段中 [ErrorInfo]为错误信息为 [网关的唯一Id = XXX,与住宅: XXXX并不存在绑定关系!] //(7)NoPermission, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的权限!] //(8)InsufficientAuthority, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的完全控制权限!] //(9)HomeIdAndTokenNoConsistent, 则响应字段中 [ErrorInfo]为错误信息为 [您当前Token与你当前控制的HomeId不一致!] /// /// void ShowAddHomeAppGatewayNameErrorInfo (string stateCodeStr) { string mes = ""; if (stateCodeStr == "Exist") { //备份名已存在 mes = ErrorCode.NameExist; } else if (stateCodeStr == "HomeIdAndTokenNoConsistent") { //Token 验证失败 mes = ErrorCode.HomeIdAndTokenNoConsistent; } else if (stateCodeStr == ErrorCode.NetworkError) { mes = ErrorCode.NetworkError; } else { mes = ErrorCode.OperationFailed + ErrorCode.Reason + stateCodeStr; } if (!string.IsNullOrEmpty (mes)) { Application.RunOnMainThread (() => { new Alert ("", mes, Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); } } ///// ///// 上传备份文件 ///// ///// //void UpLoadBackupFileToDB (string mBackupClassId) //{ // var backuplist = IO.FileUtils.ReadFiles (); // int index = 0; // foreach (var fileName in backuplist) { // index++; // /// // /// 如果是特殊的注册登陆文件,则不需要备份到服务器 // /// // if (fileName == UserInfo.GlobalRegisterFile) { // continue; // } // //整理数据 // var datainfo = new FileInfoData (); // datainfo.BackupFileName = fileName; // datainfo.BackupFileContent = Shared.IO.FileUtils.ReadFile (fileName); // var list = new List (); // list.Add (datainfo); // var upData = new UploadHomeAppGatewaySubFilesObj (); // upData.HomeId = UserConfig.Instance.CurrentRegion.Id; // upData.BackupClassId = mBackupClassId; // upData.UploadSubFileLists = list; // //获取控制主人账号的Token // upData.LoginAccessToken = MainPage.LoginUser.LoginTokenString; // string urlHead = MainPage.RequestHttpsHost; // if (upData.IsOtherAccountCtrl) { // urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; // upData.LoginAccessToken = UserConfig.Instance.MasterAccountToken; // } // //AddUserBackupObj requestObj2 = new AddUserBackupObj () { LevelID = Convert.ToInt32 (revertObj.ResponseData), Name = fileName, DetailByte = IO.FileUtils.ReadFile (fileName) }; // var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (upData); // var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, urlHead); // if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) { // //index++; // Application.RunOnMainThread (() => { // int pro = (int)(index * 1.0 / backuplist.Count * 100); // MainPage.Loading.Text = pro.ToString () + "%"; // }); // } else { // //提示错误 // break; // } // } // if (index != backuplist.Count) { // //2020-01-11 // DeleteFolderDataAfterUploadFailed (mBackupClassId); // Shared.Application.RunOnMainThread (() => { // new Alert ("", "Upload failed!", Language.StringByID (R.MyInternationalizationString.Close)).Show (); // MainPage.Loading.Hide (); // }); // } // //Shared.Application.RunOnMainThread (() => { // // if (index == 0) { // // new Alert ("", "Upload failed!", Language.StringByID (R.MyInternationalizationString.Close)).Show (); // // } // // MainPage.Loading.Hide (); // //}); //} /// /// 用户恢复文件 /// public void UserBakeupFileDetailedInformation (string BackupClassId) { //是否确定恢复该文件数据信息 Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.SureToRestoreFileInformation), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim)); alert.ResultEventHandler += (sender2, e2) => { if (e2) { MainPage.Loading.Start ("Download..."); System.Threading.Tasks.Task.Run (() => { try { var fileNames = IO.FileUtils.ReadFiles (); foreach (var fileName in fileNames) { if (fileName == UserInfo.GlobalRegisterFile) { continue; } IO.FileUtils.DeleteFile (fileName); } var requestObj2 = new GetHomeDataBackupUploadListPaggerObj (); requestObj2.HomeId = UserConfig.Instance.CurrentRegion.Id; requestObj2.BackupClassId = BackupClassId; requestObj2.PageSetting.PageSize = 999999; requestObj2.PageSetting.Page = 1; //获取控制主人账号的Token requestObj2.LoginAccessToken = MainPage.LoginUser.LoginTokenString; string urlHead = MainPage.RequestHttpsHost; if (requestObj2.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; requestObj2.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } //获取所有文件组名 //var requestObj2 = new UserBackupListObj () { LevelID = folderID }; var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj2); var revertObj2 = MainPage.RequestHttps (API.GetHomeDataBackupUploadListPagger, requestJson2, urlHead); if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) { var fileListData = Newtonsoft.Json.JsonConvert.DeserializeObject (revertObj2.ResponseData.ToString ()); var responseDataObj = fileListData.PageData; ////获取文件名字 //List listFileName = new List (); //foreach (LoadBackupFileNameInfo file in fileListData.PageData) { // listFileName.Add (file.BackupFileName); //} //var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject> (revertObj2.ResponseData.ToString ()); var mDownLoad = new DownloadSomeDataBackupObj (); mDownLoad.HomeId = UserConfig.Instance.CurrentRegion.Id; mDownLoad.BackupClassId = BackupClassId; //获取控制主人账号的Token mDownLoad.LoginAccessToken = MainPage.LoginUser.LoginTokenString; string mUrlHead = MainPage.RequestHttpsHost; if (mDownLoad.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; mDownLoad.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } MultiThreadDownload (responseDataObj, mDownLoad, mUrlHead); //int index = 0; //foreach (var file in responseDataObj) { // index++; // if (file.BackupFileName == "null" || "UserConfig" == file.BackupFileName) { // continue; // } // mDownLoad.BackupFileName = file.BackupFileName; // //var requestObj3 = new BackupDetailObj () { Id = file.Id }; // var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (mDownLoad); // var revertObj3 = MainPage.RequestHttpsReturnByte (API.DownloadSomeDataBackup, requestJson3, false, mUrlHead); // if (revertObj3 != null) { // IO.FileUtils.WriteFileByBytes (file.BackupFileName, revertObj3); // Application.RunOnMainThread (() => { // int pro = (int)(index * 1.0 / responseDataObj.Count * 100); // MainPage.Loading.Text = pro.ToString () + "%"; // }); // } else { // break; // } //} //if (index != responseDataObj.Count) { // //删除已经下载的文件个数错误 // var fileNames2 = IO.FileUtils.ReadFiles (); // foreach (var fileName in fileNames2) { // if (fileName == UserInfo.GlobalRegisterFile) { // continue; // } // IO.FileUtils.DeleteFile (fileName); // } // MainPage.ShowAlertOnMainThread ("Download failed!"); // return; //} //MainPage.LoginUser.SaveUserInfo (); //Room.InitAllRoom (); //Application.RunOnMainThread (() => { // this.RemoveFromParent (); // CommonPage.IsRemote = false; // UserMiddle.Init (); // EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus); // new Alert ("", Language.StringByID (R.MyInternationalizationString.RestoreFileIsSuccessfull), // Language.StringByID (R.MyInternationalizationString.Close)).Show (); //}); //MainPage.LoginUser = Newtonsoft.Json.JsonConvert.DeserializeObject (System.Text.Encoding.UTF8.GetString (Shared.IO.FileUtils.ReadFile (UserInfo.GlobalRegisterFile))); //if (MainPage.LoginUser != null) { // MainPage.LoginUser.LastTime = System.DateTime.Now; // MainPage.LoginUser.SaveUserInfo (); //} } } catch (Exception ex) { Shared.Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); Utlis.WriteLine (ex.ToString ()); } finally { Shared.Application.RunOnMainThread (() => { MainPage.Loading.Hide (); }); } }); } }; alert.Show (); } bool DownloadSomeDataBackup (DownloadSomeDataBackupObj mmDownLoad, string mUrlHead, LoadBackupFileNameInfo file) { DownloadSomeDataBackupObj mDownLoad = mmDownLoad; mDownLoad.BackupFileName = file.BackupFileName; //var requestObj3 = new BackupDetailObj () { Id = file.Id }; var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (mDownLoad); var revertObj3 = MainPage.RequestHttpsReturnByteNew (API.DownloadSomeDataBackup, requestJson3, mUrlHead); if (revertObj3 != null) { IO.FileUtils.WriteFileByBytes (file.BackupFileName, revertObj3); return true; } else { return false; } } /// /// 删除本地文件 /// void ReadFilesAndDelete () { var fileNames = IO.FileUtils.ReadFiles (); foreach (var fileName in fileNames) { if (fileName == UserInfo.GlobalRegisterFile || fileName == UserConfig.configFile) { continue; } IO.FileUtils.DeleteFile (fileName); } } private readonly object SendLocker = new object (); private readonly object DownloadLocker = new object (); /// /// 多线程下载 /// void MultiThreadDownload (List dataList, DownloadSomeDataBackupObj mDownLoad, string mUrlHead, int maxThreads = 5) { int index = 0; int indexCount = 0; var mFileList = dataList.FindAll ((obj) => obj.BackupFileName != "null" && obj.BackupFileName != UserConfig.configFile && obj.BackupFileName != UserInfo.GlobalRegisterFile && obj.BackupFileName != "AccountListDB" && obj.BackupFileName != CommonConfig.ConfigFile); if (maxThreads > mFileList.Count) { maxThreads = mFileList.Count; } if (mFileList.Count <= 0) return; int resultCount = mFileList.Count / maxThreads; //int residue = mFileList.Count % maxThreads; /*开启若干线程,分别下载对应的资源*/ for (int i = 1; i <= maxThreads; i++) { int startIndex = ((i - 1) * resultCount + 0); int endIndex = resultCount * i - 1; if (i == maxThreads) { /* * 最后一个线程 * */ endIndex = mFileList.Count - 1; } var id = i; var startIndex1 = startIndex; var endIndex1 = endIndex; //Utlis.WriteLine ($"下载线程:{id} startIndex1:{startIndex1} endIndex1:{endIndex1}"); new System.Threading.Thread (() => { for (var j = startIndex1; j <= endIndex1; j++) { try { //如果失败重新下载,重复3次 int errorCount = 0; while (errorCount < 3) { var result = DownloadSomeDataBackup (mDownLoad, mUrlHead, mFileList [j]); if (result) { lock (DownloadLocker) { index++; } Application.RunOnMainThread (() => { int pro = (int)(index * 1.0 / mFileList.Count * 100); MainPage.Loading.Text = pro.ToString () + "%"; }); errorCount = 3; } else { errorCount++; Utlis.WriteLine ($"下载失败: {mFileList [j].BackupFileName} 次数:{errorCount}"); } } } catch { } finally { lock (SendLocker) { indexCount++; } } //var t1 = DateTime.Now.Second; //var result = DownloadSomeDataBackup (mDownLoad, mUrlHead, mFileList [j]); //if (result) { // index++; // Application.RunOnMainThread (() => { // int pro = (int)(index * 1.0 / mFileList.Count * 100); // MainPage.Loading.Text = pro.ToString () + "%"; // }); //} else { // Utlis.WriteLine ($"下载失败: {mFileList [j].BackupFileName} 时间:{DateTime.Now.Second - t1}S"); //} //indexCount++; //Utlis.WriteLine ($"下载线程:{id} 完成index:{j} indexCount: {indexCount}"); } }) { IsBackground = true }.Start (); System.Threading.Thread.Sleep (100); } while (indexCount < mFileList.Count) { System.Threading.Thread.Sleep (200); } Utlis.WriteLine ($"下载完成"); if (index != mFileList.Count) { //删除已经下载的文件个数错误 ReadFilesAndDelete (); Application.RunOnMainThread (() => { new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.DownloadFailed), Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); return; } MainPage.LoginUser.SaveUserInfo (); Room.InitAllRoom (); Application.RunOnMainThread (() => { this.RemoveFromParent (); //CommonPage.IsRemote = false; UserMiddle.Init (); EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus); new Alert ("", Language.StringByID (R.MyInternationalizationString.RestoreFileIsSuccessfull), Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); MainPage.LoginUser = Newtonsoft.Json.JsonConvert.DeserializeObject (System.Text.Encoding.UTF8.GetString (Shared.IO.FileUtils.ReadFile (UserInfo.GlobalRegisterFile))); if (MainPage.LoginUser != null) { MainPage.LoginUser.LastTime = System.DateTime.Now; MainPage.LoginUser.SaveUserInfo (); } } bool UploadDataBackup (UploadHomeAppGatewaySubFilesObj upData, string mUrlHead, List fileList, int startIndex1, int endIndex1) { try { var list = new List (); for (var j = startIndex1; j <= endIndex1; j++) { var datainfo = new FileInfoData (); datainfo.BackupFileName = fileList [j]; datainfo.BackupFileContent = Shared.IO.FileUtils.ReadFile (fileList [j]); list.Add (datainfo); } //整理数据 UploadHomeAppGatewaySubFilesObj mUpData = upData; mUpData.UploadSubFileLists = list; var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (mUpData); var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, mUrlHead); if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) { return true; } else { //提示错误 return false; } } catch { return false; } } /// /// 上传备份文件 /// 多次上传多个文件 /// /// void UpLoadBackupFileToDBNew (string mBackupClassId, int maxThreads = 20) { var backuplist = IO.FileUtils.ReadFiles (); var mFileList = backuplist.FindAll ((obj) => obj != "null" && obj != UserConfig.configFile && obj != UserInfo.GlobalRegisterFile && obj != "AccountListDB" && obj != CommonConfig.ConfigFile); if (mFileList.Count <= 0) return; if (maxThreads > mFileList.Count) { maxThreads = mFileList.Count; } int index = 0; int indexCount = 0; int resultCount = mFileList.Count / maxThreads; var upData = new UploadHomeAppGatewaySubFilesObj (); upData.HomeId = UserConfig.Instance.CurrentRegion.Id; upData.BackupClassId = mBackupClassId; //获取控制主人账号的Token upData.LoginAccessToken = MainPage.LoginUser.LoginTokenString; string urlHead = MainPage.RequestHttpsHost; if (upData.IsOtherAccountCtrl) { urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl; upData.LoginAccessToken = UserConfig.Instance.MasterAccountToken; } for (int i = 1; i <= resultCount; i++) { int startIndex = ((i - 1) * maxThreads + 0); int endIndex = maxThreads * i - 1; if (i == resultCount) { /*最后一个线程* */ endIndex = mFileList.Count - 1; } var id = i; var startIndex1 = startIndex; var endIndex1 = endIndex; //2020-06-10 修改大图片大文件处理 var result = UploadDataBackupNew (upData, urlHead, mFileList, startIndex1, endIndex1); if (result) { index++; Application.RunOnMainThread (() => { int pro = (int)(index * 1.0 / resultCount * 100); MainPage.Loading.Text = pro.ToString () + "%"; }); } indexCount++; } Utlis.WriteLine ($"上传完成"); if (index != resultCount) { //2020-01-11 备份失败 DeleteFolderDataAfterUploadFailed (mBackupClassId); Shared.Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (R.MyInternationalizationString.FailedToBackupFile), Language.StringByID (R.MyInternationalizationString.Close)).Show (); MainPage.Loading.Hide (); }); return; } Application.RunOnMainThread (() => { //MainPage.Loading.Text = "100%"; new Alert ("", Language.StringByID (R.MyInternationalizationString.BackupFileIsSuccessful), Language.StringByID (R.MyInternationalizationString.Close)).Show (); }); } /// /// 2020-06-05 需要等待云端增加接口 /// 处理大文件和图片上传 /// /// /// /// /// /// /// /// bool UploadDataBackupNew (UploadHomeAppGatewaySubFilesObj upData, string mUrlHead, List fileList, int startIndex1, int endIndex1) { try { var list = new List (); for (var j = startIndex1; j <= endIndex1; j++) { var datainfo = new FileInfoData (); datainfo.BackupFileName = fileList [j]; datainfo.BackupFileContent = Shared.IO.FileUtils.ReadFile (fileList [j]); if (datainfo.BackupFileContent.Length > 1024 * 10) { var upDataBig = new UploadHomeAppGatewaySubFilesBigObj (); upDataBig.RequestVersion = upData.RequestVersion; upDataBig.HomeId = upData.HomeId; upDataBig.BackupClassId = upData.BackupClassId; upDataBig.FileName = fileList [j]; upDataBig.IsOtherAccountCtrl = upData.IsOtherAccountCtrl; var revertObj5 = MainPage.RequestHttpsNewBig (API.UploadHomeAppGatewaySingleSubFile, datainfo.BackupFileContent, upDataBig, mUrlHead); } else { list.Add (datainfo); } } //整理数据 UploadHomeAppGatewaySubFilesObj mUpData = upData; mUpData.UploadSubFileLists = list; //var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (mUpData); //var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, mUrlHead); //if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) { // return true; //} else { // //提示错误 // return false; //} //2020-11-16 如果失败重新上传,重复3次 int errorCount = 0; var result = false; while (errorCount < 3) { var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (mUpData); var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, mUrlHead, MainPage.TIME_OUT_20); if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) { result = true; errorCount = 3; } else { errorCount++; //Utlis.WriteLine ($"上传失败({startIndex1}-{endIndex1}),次数:{errorCount}"); } } return result; } catch { return false; } } } }