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
}
}