UpdatePage.xaml.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  1. using BellwetherBackend.Utility;
  2. using SocketTransfer;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Data;
  12. using System.Windows.Documents;
  13. using System.Windows.Input;
  14. using System.Windows.Media;
  15. using System.Windows.Media.Imaging;
  16. using System.Windows.Navigation;
  17. using System.Windows.Shapes;
  18. using System.IO;
  19. using System.Windows.Threading;
  20. using ICSharpCode.SharpZipLib.Zip;
  21. using System.Threading;
  22. using System.Net;
  23. namespace BellwetherBackend.SubPage
  24. {
  25. public enum UpdateState
  26. {
  27. TransferCompleted, Transferring, Disconnected, UpdateCompleted, UpdateFail, Abort, Connected
  28. }
  29. /// <summary>
  30. /// Interaction logic for UpdatePage.xaml
  31. /// </summary>
  32. public partial class UpdatePage : UserControl
  33. {
  34. private static SolidColorBrush IsConnectBrush = new SolidColorBrush(Colors.Green);
  35. private static SolidColorBrush IsDisconnectBrush = new SolidColorBrush(Colors.Red);
  36. private static string rootPath = System.AppDomain.CurrentDomain.BaseDirectory;
  37. private static string tempFolder = @"Temp\";
  38. private static string defaultZipFileName = @"Temp\Data.zip";
  39. private string ipAddress;
  40. public string IpAddress
  41. {
  42. get
  43. {
  44. if (CheckIpFormat(uxIp1Text.Text) && CheckIpFormat(uxIp2Text.Text) && CheckIpFormat(uxIp3Text.Text) && CheckIpFormat(uxIp4Text.Text))
  45. {
  46. ipAddress = String.Format("{0}.{1}.{2}.{3}", uxIp1Text.Text, uxIp2Text.Text, uxIp3Text.Text, uxIp4Text.Text);
  47. }
  48. else
  49. {
  50. ipAddress = "error format";
  51. }
  52. return ipAddress;
  53. }
  54. set
  55. {
  56. ipAddress = value;
  57. string[] str = ipAddress.Split('.');
  58. if (str.Length > 3)
  59. {
  60. for (int i = 0; i < ipTextBlock.Length; i++)
  61. {
  62. ipTextBlock[i].Text = str[i];
  63. }
  64. }
  65. this.Dispatcher.BeginInvoke((Action)delegate ()
  66. {
  67. CheckKioskConnect();
  68. });
  69. }
  70. }
  71. private int ipPort;
  72. public int IpPort
  73. {
  74. set { ipPort = value; }
  75. get { return ipPort; }
  76. }
  77. private bool isConnect;
  78. public bool IsConnect
  79. {
  80. get { return isConnect; }
  81. set
  82. {
  83. isConnect = value;
  84. if (isConnect)
  85. {
  86. uxConnectStateRect.Fill = IsConnectBrush;
  87. uxConnectBtn.IsEnabled = false;
  88. uxDisConnectBtn.IsEnabled = true;
  89. uxIpGrid.IsEnabled = false;
  90. uxUpdateBtn.IsEnabled = true;
  91. UpdatingState = UpdateState.Connected;
  92. }
  93. else
  94. {
  95. uxConnectStateRect.Fill = IsDisconnectBrush;
  96. uxConnectBtn.IsEnabled = true;
  97. uxDisConnectBtn.IsEnabled = false;
  98. uxIpGrid.IsEnabled = true;
  99. uxUpdateBtn.IsEnabled = false;
  100. UpdatingState = UpdateState.Disconnected;
  101. }
  102. }
  103. }
  104. private UpdateState updatingState;
  105. public UpdateState UpdatingState
  106. {
  107. get { return updatingState; }
  108. set
  109. {
  110. updatingState = value;
  111. }
  112. }
  113. private string localipAddress;
  114. private TextBox[] ipTextBlock;
  115. private BackgroundWorker connectWorker;
  116. private SocketClient KioskSocketClient;
  117. private bool canTransFileTag = false;
  118. private List<string> wholeDataFolder = new List<string>();
  119. private List<string> cutFilePaths = new List<string>();
  120. public UpdatePage()
  121. {
  122. InitializeComponent();
  123. CreateTempFolder();
  124. new GlobalFunction();
  125. uxConnectBtn.IconData = GlobalFunction.ConnectBtnData;
  126. uxDisConnectBtn.IconData = GlobalFunction.DisconnectBtnData;
  127. uxUpdateBtn.IconData = GlobalFunction.UpdateBtnData;
  128. localipAddress = GetLocalIpAddress();
  129. // 連線
  130. ipTextBlock = new TextBox[]
  131. {
  132. uxIp1Text, uxIp2Text, uxIp3Text, uxIp4Text
  133. };
  134. IpAddress = Properties.Settings.Default["ConnectIP"].ToString();
  135. IpPort = int.Parse(Properties.Settings.Default["ConnectPort"].ToString());
  136. connectWorker = new BackgroundWorker();
  137. connectWorker.WorkerSupportsCancellation = true;
  138. connectWorker.DoWork += connectWorker_DoWork;
  139. connectWorker.RunWorkerCompleted += connectWorker_RunWorkerCompleted;
  140. uxIp1Text.TextChanged += uxIp1Text_TextChanged;
  141. uxIp2Text.TextChanged += uxIp1Text_TextChanged;
  142. uxIp3Text.TextChanged += uxIp1Text_TextChanged;
  143. uxIp4Text.TextChanged += uxIp1Text_TextChanged;
  144. this.Loaded += UpdatePage_Loaded;
  145. }
  146. private void UpdatePage_Loaded(object sender, RoutedEventArgs e)
  147. {
  148. //Setting.PageNameList[x]
  149. List<CheckBox> checkBoxList = new List<CheckBox>();
  150. foreach (UIElement element in uxUpdateListPanel.Children)
  151. {
  152. if (element is CheckBox checkBox)
  153. checkBoxList.Add(checkBox);
  154. }
  155. //var visualElementCnt = checkBoxList.Count;
  156. //var dataStringCnt = Setting.PageNameList.Count;
  157. //for (int pageIndex = 0; pageIndex + 1 < visualElementCnt && pageIndex < dataStringCnt; pageIndex++)
  158. //{
  159. // checkBoxList[pageIndex + 1].Content = Setting.PageNameList[pageIndex];
  160. //}
  161. }
  162. public void CheckKioskConnect()
  163. {
  164. if (connectWorker.IsBusy)
  165. {
  166. connectWorker.CancelAsync();
  167. }
  168. connectWorker.RunWorkerAsync();
  169. }
  170. public void Disconnect()
  171. {
  172. DisconnectHandle();
  173. }
  174. private void StartLoading()
  175. {
  176. uxProgressBar.Visibility = Visibility.Visible;
  177. uxWorkingGrid.IsEnabled = false;
  178. uxWorkingGrid.Opacity = 0.3;
  179. }
  180. private void StopLoading()
  181. {
  182. uxProgressBar.Visibility = Visibility.Collapsed;
  183. uxWorkingGrid.IsEnabled = true;
  184. uxWorkingGrid.Opacity = 1.0;
  185. }
  186. private void CreateTempFolder()
  187. {
  188. string path = System.IO.Path.Combine(rootPath, tempFolder);
  189. if (Directory.Exists(path))
  190. {
  191. ClearTempFolder();
  192. }
  193. else
  194. {
  195. Directory.CreateDirectory(path);
  196. }
  197. }
  198. private void ClearTempFolder()
  199. {
  200. string path = System.IO.Path.Combine(rootPath, tempFolder);
  201. if (Directory.Exists(path))
  202. {
  203. string[] files = Directory.GetFiles(path);
  204. foreach (string file in files)
  205. {
  206. try
  207. {
  208. if (File.Exists(file))
  209. File.Delete(file);
  210. }
  211. catch { }
  212. }
  213. }
  214. }
  215. private string GetLocalIpAddress()
  216. {
  217. string result = "";
  218. string strHostName = Dns.GetHostName();
  219. IPHostEntry iphostentry = Dns.GetHostEntry(strHostName);
  220. foreach (IPAddress ipaddress in iphostentry.AddressList)
  221. {
  222. // 只取得IP V4的Address
  223. if (ipaddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  224. {
  225. result = ipaddress.ToString();
  226. }
  227. }
  228. return result;
  229. }
  230. private bool CheckIpFormat(string str)
  231. {
  232. byte checkPart = 0;
  233. if (!byte.TryParse(str, out checkPart))
  234. {
  235. return false;
  236. }
  237. return true;
  238. }
  239. private void InitialUpdateStatus()
  240. {
  241. this.Dispatcher.BeginInvoke((Action)delegate ()
  242. {
  243. uxStatus.Text = "";
  244. uxUpdateProgressBar.Value = 0;
  245. if (KioskSocketClient != null)
  246. uxUpdateBtn.IsEnabled = true;
  247. ClearTempFolder();
  248. }, DispatcherPriority.Background);
  249. }
  250. private void ChangeUpdateProgrssBarValue(double value)
  251. {
  252. this.Dispatcher.BeginInvoke((Action)delegate ()
  253. {
  254. uxUpdateProgressBar.Value += value;
  255. }, DispatcherPriority.Background);
  256. }
  257. private void uxIp1Text_TextChanged(object sender, TextChangedEventArgs e)
  258. {
  259. Properties.Settings.Default["ConnectIP"] = uxIp1Text.Text + "." + uxIp2Text.Text + "." + uxIp3Text.Text + "." + uxIp4Text.Text;
  260. }
  261. private void connectWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  262. {
  263. this.Dispatcher.BeginInvoke((Action)delegate ()
  264. {
  265. StopLoading();
  266. }, DispatcherPriority.Background);
  267. }
  268. private void connectWorker_DoWork(object sender, DoWorkEventArgs e)
  269. {
  270. this.Dispatcher.BeginInvoke((Action)delegate ()
  271. {
  272. // loading bar
  273. StartLoading();
  274. }, DispatcherPriority.Background);
  275. if (KioskSocketClient != null)
  276. {
  277. KioskSocketClient.ServerReady -= KioskSocketClient_ServerReady;
  278. KioskSocketClient.ServerClose -= KioskSocketClient_ServerClose;
  279. }
  280. string serverIp = String.Empty;
  281. this.Dispatcher.Invoke((Action)delegate ()
  282. {
  283. serverIp = IpAddress;
  284. if (serverIp != "error format")
  285. {
  286. KioskSocketClient = new SocketClient(IpAddress, IpPort, localipAddress);
  287. KioskSocketClient.ServerReady += KioskSocketClient_ServerReady;
  288. KioskSocketClient.ServerClose += KioskSocketClient_ServerClose;
  289. }
  290. }, DispatcherPriority.Background);
  291. if (serverIp != "error format")
  292. {
  293. try
  294. {
  295. KioskSocketClient.Connect();
  296. }
  297. catch
  298. {
  299. this.Dispatcher.BeginInvoke((Action)delegate ()
  300. {
  301. IsConnect = false;
  302. }, DispatcherPriority.Background);
  303. }
  304. }
  305. else
  306. {
  307. this.Dispatcher.BeginInvoke((Action)delegate ()
  308. {
  309. IsConnect = false;
  310. }, DispatcherPriority.Background);
  311. }
  312. }
  313. private void KioskSocketClient_ServerReady(string serverIP, string version)
  314. {
  315. this.Dispatcher.BeginInvoke((Action)delegate ()
  316. {
  317. IsConnect = true;
  318. }, DispatcherPriority.Background);
  319. }
  320. private void KioskSocketClient_ServerClose(string serverIP)
  321. {
  322. this.Dispatcher.BeginInvoke((Action)delegate ()
  323. {
  324. IsConnect = false;
  325. }, DispatcherPriority.Background);
  326. }
  327. private void uxConnect_Click(object sender, RoutedEventArgs e)
  328. {
  329. CheckKioskConnect();
  330. }
  331. private void uxDisConnectBtn_Click(object sender, RoutedEventArgs e)
  332. {
  333. DisconnectHandle();
  334. }
  335. private void DisconnectHandle()
  336. {
  337. if (KioskSocketClient != null)
  338. {
  339. KioskSocketClient.ServerReady -= KioskSocketClient_ServerReady;
  340. KioskSocketClient.ServerClose -= KioskSocketClient_ServerClose;
  341. KioskSocketClient.Close();
  342. KioskSocketClient = null;
  343. }
  344. IsConnect = false;
  345. UpdatingState = UpdateState.Abort;
  346. }
  347. #region 更新開始
  348. private void uxUpdateBtn_Click(object sender, RoutedEventArgs e)
  349. {
  350. List<string> packageFilePath = new List<string>();
  351. canTransFileTag = true;
  352. uxUpdateBtn.IsEnabled = false;
  353. // 收集欲打包的資料路徑
  354. StatusChange("收集打包資訊..");
  355. wholeDataFolder = GetPackageFolder();
  356. packageFilePath = GetUpdatePackageFilePath();
  357. if (wholeDataFolder.Count == 0)
  358. {
  359. StatusChange("沒有選擇任何傳送檔案..");
  360. // 所有狀態回復
  361. WpfDelayDoWork.DoBackgroundWork(InitialUpdateStatus, 3000);
  362. return;
  363. }
  364. // Step 1 : 打包
  365. uxUpdateProgressBar.Value = 0;
  366. StatusChange("開始打包..");
  367. BackgroundWorker zipWorker = new BackgroundWorker();
  368. zipWorker.WorkerSupportsCancellation = true;
  369. zipWorker.DoWork += zipWorker_DoWork;
  370. zipWorker.RunWorkerCompleted += zipWorker_RunWorkerCompleted;
  371. zipWorker.RunWorkerAsync(packageFilePath);
  372. }
  373. private void StatusChange(string status)
  374. {
  375. this.Dispatcher.BeginInvoke((Action)delegate ()
  376. {
  377. uxStatus.Text = status;
  378. }, DispatcherPriority.Background);
  379. }
  380. private void DivisionZipFile()
  381. {
  382. // Step 2 : 分割
  383. uxUpdateProgressBar.Value = 0;
  384. StatusChange("分割封裝檔..");
  385. BackgroundWorker divisionWorker = new BackgroundWorker();
  386. divisionWorker.WorkerSupportsCancellation = true;
  387. divisionWorker.DoWork += divisionWorker_DoWork;
  388. divisionWorker.RunWorkerCompleted += divisionWorker_RunWorkerCompleted;
  389. divisionWorker.RunWorkerAsync();
  390. }
  391. private void TransCutFile()
  392. {
  393. // Step 3 : 傳送
  394. uxUpdateProgressBar.Value = 0;
  395. StatusChange("檔案傳送中...");
  396. BackgroundWorker updateWorker = new BackgroundWorker();
  397. updateWorker.WorkerSupportsCancellation = true;
  398. updateWorker.DoWork += updateWorker_DoWork;
  399. updateWorker.RunWorkerCompleted += updateWorker_RunWorkerCompleted;
  400. updateWorker.RunWorkerAsync();
  401. }
  402. #endregion
  403. #region 收集欲打包的資料
  404. private List<string> GetPackageFolder()
  405. {
  406. List<string> resultPaceage = new List<string>();
  407. for (int i = 0; i < uxUpdateListPanel.Children.Count; i++)
  408. {
  409. CheckBox chkBtn = uxUpdateListPanel.Children[i] as CheckBox;
  410. if (chkBtn != null)
  411. {
  412. if (chkBtn.IsChecked == true)
  413. {
  414. if (chkBtn.Tag.ToString() != "")
  415. resultPaceage.Add(chkBtn.Tag.ToString());
  416. }
  417. }
  418. }
  419. return resultPaceage;
  420. }
  421. private List<string> GetUpdatePackageFilePath()
  422. {
  423. List<string> resultPackage = new List<string>();
  424. // 整理要打包的東西 : 所有要打包的檔案的相對根目錄底下路徑
  425. for (int i = 0; i < wholeDataFolder.Count; i++)
  426. {
  427. switch (wholeDataFolder[i])
  428. {
  429. case "Basic":
  430. PackageBasicSetting(resultPackage);
  431. break;
  432. case "FrontPage":
  433. PackageFrontPageSetting(resultPackage);
  434. break;
  435. case "History":
  436. PackageHistoryWall(resultPackage, Setting.PageType.History);
  437. break;
  438. case "Product":
  439. PackageHistoryWall(resultPackage, Setting.PageType.Product);
  440. break;
  441. case "CSR":
  442. PackageHistoryWall(resultPackage, Setting.PageType.CSR);
  443. break;
  444. }
  445. }
  446. return resultPackage;
  447. }
  448. private void PackageBasicSetting(List<string> resultPackage)
  449. {
  450. resultPackage.Add(Setting.settingJsonDataPath);
  451. }
  452. private void PackageFrontPageSetting(List<string> resultPackage)
  453. {
  454. string[] files = Directory.GetFiles(Setting.frontPageDirectory);
  455. resultPackage.AddRange(files);
  456. }
  457. private void PackageHistoryWall(List<string> resultPackage, Setting.PageType type)
  458. {
  459. string folderPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Data", Setting.PageFolderName[type]);
  460. string DataConfigFileName = System.IO.Path.Combine(folderPath, @"Setting\ConfigSetting.ini");
  461. string historyFileName = System.IO.Path.Combine(folderPath, @"HistoryWallData\HistoryFile.ini");
  462. string DataThumFileFolder = System.IO.Path.Combine(folderPath, @"Thumb\");
  463. string DataJsonImgFileFolder = System.IO.Path.Combine(folderPath, @"HistoryImage\");
  464. // History : 1. Setting\ConfigSetting.ini + 2. HistoryWallData\HistoryFile.ini + 3. Thumb\bgMap file and logoMap file + 4. HistoryImage 整包
  465. if (File.Exists(DataConfigFileName))
  466. {
  467. resultPackage.Add(DataConfigFileName);
  468. }
  469. if (File.Exists(historyFileName))
  470. {
  471. resultPackage.Add(historyFileName);
  472. }
  473. string[] files = Directory.GetFiles(DataThumFileFolder);
  474. foreach (string file in files)
  475. {
  476. // 只接受 bgMap 及 logoMap 兩個檔名檔案
  477. if (GlobalFunction.CheckFileIsImage(file) && (file.IndexOf("bgMap") != -1 || file.IndexOf("logoMap") != -1))
  478. {
  479. resultPackage.Add(file);
  480. }
  481. }
  482. if (Directory.Exists(DataJsonImgFileFolder))
  483. {
  484. List<string> dirs = new List<string>(Directory.EnumerateDirectories(DataJsonImgFileFolder));
  485. foreach (var dir in dirs)
  486. {
  487. string[] inforfiles = Directory.GetFiles(dir);
  488. foreach (string file in inforfiles)
  489. {
  490. // 接受圖片或影片
  491. if (GlobalFunction.CheckFileIsImage(file) || GlobalFunction.CheckFileIsVideo(file))
  492. {
  493. resultPackage.Add(file);
  494. }
  495. }
  496. }
  497. }
  498. }
  499. #endregion
  500. #region 打包
  501. private void zipWorker_DoWork(object sender, DoWorkEventArgs e)
  502. {
  503. List<string> packagePathList = e.Argument as List<string>;
  504. FileStream FS = File.Create(defaultZipFileName);
  505. ZipOutputStream s = new ZipOutputStream(FS);
  506. string currentPath = Directory.GetCurrentDirectory();
  507. s.SetLevel(9); //0 ~ 9
  508. double stepValue = 100 / packagePathList.Count;
  509. for (int i = 0; i < packagePathList.Count; i++)
  510. {
  511. FileStream fs = File.OpenRead(packagePathList[i]);
  512. byte[] buffer = new byte[fs.Length];
  513. fs.Read(buffer, 0, buffer.Length);
  514. string zipPath = packagePathList[i];
  515. if (packagePathList[i].Contains(currentPath))
  516. zipPath = zipPath.Remove(0, currentPath.Length + 1);
  517. ZipEntry entry = new ZipEntry(zipPath);
  518. entry.DateTime = DateTime.Now;
  519. entry.Size = fs.Length;
  520. fs.Close();
  521. s.PutNextEntry(entry);
  522. s.Write(buffer, 0, buffer.Length);
  523. ChangeUpdateProgrssBarValue(stepValue);
  524. }
  525. s.Dispose();
  526. s.Close();
  527. }
  528. private void zipWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  529. {
  530. StatusChange("打包完成..");
  531. uxUpdateProgressBar.Value = 100;
  532. //切割打包資料夾
  533. WpfDelayDoWork.DoBackgroundWork(DivisionZipFile, 1000);
  534. }
  535. #endregion
  536. #region 切割
  537. private void divisionWorker_DoWork(object sender, DoWorkEventArgs e)
  538. {
  539. string zipFilePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), defaultZipFileName);
  540. if (File.Exists(zipFilePath))
  541. {
  542. try
  543. {
  544. int segmentSize = 4194304; //4MB
  545. long fileSize = new FileInfo(zipFilePath).Length;
  546. int datas = 0;
  547. int segmentCount = (int)(fileSize / (long)segmentSize);
  548. int lastSegmentSize = (int)(fileSize % (long)segmentSize);
  549. segmentCount = lastSegmentSize > 0 ? segmentCount + 1 : segmentCount;
  550. double stepValue = 100 / segmentCount;
  551. FileStream fs = File.OpenRead(zipFilePath);
  552. cutFilePaths = new List<string>();
  553. for (int i = 0; i < segmentCount; i++)
  554. {
  555. byte[] binaryData;
  556. string segmentFileName = zipFilePath.Replace(".zip", String.Empty) + "[" + (i + 1) + "].cut";
  557. FileStream fOut = File.OpenWrite(segmentFileName);
  558. if (lastSegmentSize > 0 && i == segmentCount - 1)
  559. {
  560. binaryData = new byte[lastSegmentSize];
  561. datas = fs.Read(binaryData, 0, lastSegmentSize);
  562. fOut.Write(binaryData, 0, lastSegmentSize);
  563. }
  564. else
  565. {
  566. binaryData = new byte[segmentSize];
  567. datas = fs.Read(binaryData, 0, segmentSize);
  568. fOut.Write(binaryData, 0, segmentSize);
  569. }
  570. fOut.Flush();
  571. fOut.Close();
  572. ChangeUpdateProgrssBarValue(stepValue);
  573. cutFilePaths.Add(segmentFileName);
  574. }
  575. fs.Close();
  576. File.Delete(zipFilePath);
  577. canTransFileTag = true;
  578. }
  579. catch
  580. {
  581. canTransFileTag = false;
  582. }
  583. }
  584. else
  585. {
  586. canTransFileTag = false;
  587. }
  588. }
  589. private void divisionWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  590. {
  591. StatusChange("分割完成..");
  592. uxUpdateProgressBar.Value = 100;
  593. if (canTransFileTag)
  594. {
  595. //傳輸更新檔案開始
  596. WpfDelayDoWork.DoBackgroundWork(TransCutFile, 1000);
  597. return;
  598. }
  599. StatusChange("分割失敗..");
  600. // 所有狀態回復
  601. WpfDelayDoWork.DoBackgroundWork(InitialUpdateStatus, 3000);
  602. }
  603. #endregion
  604. #region 傳送
  605. bool isSendComplete = false;
  606. private void updateWorker_DoWork(object sender, DoWorkEventArgs e)
  607. {
  608. if (cutFilePaths.Count > 0)
  609. {
  610. try
  611. {
  612. isSendComplete = false;
  613. // 通知分割檔案總數
  614. KioskSocketClient.NotifyFileTransferStart(cutFilePaths.Count);
  615. // 掛上前台更新狀況事件
  616. KioskSocketClient.SendSegmentFileFinish += KioskSocketClient_SendSegmentFileFinish;
  617. KioskSocketClient.FailSendFile += KioskSocketClient_FailSendFile;
  618. KioskSocketClient.ReceiveServerNotify += KioskSocketClient_ReceiveServerNotify;
  619. //傳送 Cut File
  620. for (int i = 0; i < cutFilePaths.Count; i++)
  621. {
  622. while (isSendComplete)
  623. {
  624. Thread.Sleep(1000);
  625. }
  626. KioskSocketClient.SendFile(cutFilePaths[i], "0");
  627. isSendComplete = true;
  628. }
  629. }
  630. catch
  631. {
  632. KioskSocketClient = null;
  633. canTransFileTag = false;
  634. }
  635. }
  636. }
  637. private void updateWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  638. {
  639. if (canTransFileTag)
  640. {
  641. //傳輸更新檔案開始
  642. StatusChange("傳送完成..");
  643. uxUpdateProgressBar.Value = 100;
  644. return;
  645. }
  646. StatusChange("傳送失敗..");
  647. // 所有狀態回復
  648. WpfDelayDoWork.DoBackgroundWork(InitialUpdateStatus, 3000);
  649. }
  650. private void KioskSocketClient_SendSegmentFileFinish(string serverIP, string index)
  651. {
  652. double stepValue = 100 / cutFilePaths.Count;
  653. ChangeUpdateProgrssBarValue(stepValue);
  654. isSendComplete = false;
  655. }
  656. #endregion
  657. #region 前台更新狀況回報
  658. private void KioskSocketClient_FailSendFile(object sender, EventArgs e)
  659. {
  660. StatusChange("傳輸異常...");
  661. // 所有狀態回復
  662. WpfDelayDoWork.DoBackgroundWorkAsync(Dispatcher.CurrentDispatcher, InitialUpdateStatus, 3000);
  663. }
  664. private void KioskSocketClient_ReceiveServerNotify(string serverIP, string message)
  665. {
  666. if (message.Equals("Success"))
  667. {
  668. StatusChange("前台更新完成重新啟動中...");
  669. // 所有狀態回復
  670. WpfDelayDoWork.DoBackgroundWorkAsync(Dispatcher.CurrentDispatcher, InitialUpdateStatus, 3000);
  671. }
  672. else if (message.Equals("Fail"))
  673. {
  674. StatusChange("傳輸異常...");
  675. // 所有狀態回復
  676. WpfDelayDoWork.DoBackgroundWorkAsync(Dispatcher.CurrentDispatcher, InitialUpdateStatus, 3000);
  677. }
  678. }
  679. #endregion
  680. }
  681. public class WpfDelayDoWork
  682. {
  683. public static void DoWork(Action action, int millisecond = 300)
  684. {
  685. new Action<Dispatcher, Action, int>(DoWorkAsync).BeginInvoke(Dispatcher.CurrentDispatcher, action, millisecond, null, null);
  686. }
  687. public static void DoBackgroundWork(Action action, int millisecond = 300)
  688. {
  689. new Action<Dispatcher, Action, int>(DoBackgroundWorkAsync).BeginInvoke(Dispatcher.CurrentDispatcher, action, millisecond, null, null);
  690. }
  691. public static void DoWorkAsync(Dispatcher dispatcher, Action action, int millisecond)
  692. {
  693. System.Threading.Thread.Sleep(millisecond);
  694. dispatcher.BeginInvoke(action);
  695. }
  696. public static void DoBackgroundWorkAsync(Dispatcher dispatcher, Action action, int millisecond)
  697. {
  698. System.Threading.Thread.Sleep(millisecond);
  699. dispatcher.Invoke(action, DispatcherPriority.Background);
  700. }
  701. }
  702. }