private void SendTheme_PostExecute(SendThemeResults obj) { IsBusy = false; if (obj.Sent) { MessageBox.Show(MainResources.Message_ThemeSent, WINDOW_TITLE, MessageBoxButton.OK, MessageBoxImage.Information); } }
private Task <SendThemeResults> SendTheme_Execute(string ip, bool start) { var sendingTheme = MainResources.Busy_Sender_SendingTheme; var connecting = MainResources.Busy_Sender_Connecting; var connectionError = MainResources.Busy_Sender_ConnectionError; var bgmPath = Path.Combine(Path.GetDirectoryName(ThemePath), BGM_FILE_NAME); var zipThemeTask = ZipTheme_Execute(bgmPath, false); var task = new Task <SendThemeResults>(() => { var result = new SendThemeResults { IP = ip, Sent = false, }; IPAddress addr; if (!IPAddress.TryParse(ip, out addr)) { return(result); } var endPoint = new IPEndPoint(addr, 5000); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); zipThemeTask.Start(); result.Zip = zipThemeTask.Result; var tries = 0; var maxTries = Settings.Default.SocketMaxTries; var connected = false; while (!connected) { try { BusyText = connecting + $" [{++tries}/{maxTries}]"; socket.Connect(endPoint); connected = true; } catch (SocketException) { if (tries >= maxTries) { return(result); } } } BusyText = sendingTheme; byte[] socketBuffer = new byte[16]; socket.Receive(socketBuffer, 11, SocketFlags.None); if (Encoding.ASCII.GetString(socketBuffer, 0, 11) != "YATA SENDER") { BusyText = connectionError; socket.Close(); return(result); } var toWrite = result.Zip.Data.Length; var offset = 0; var fLen = (float)result.Zip.Data.Length / 100; Stopwatch sw = new Stopwatch(); sw.Start(); float averageSample = 0; var lastOffset = 0; while (true) { var step = Math.Min(toWrite, 8192); socket.Send(result.Zip.Data, offset, step, 0); toWrite -= step; offset += step; if (sw.ElapsedMilliseconds > 100) { float trans = sw.ElapsedMilliseconds; var delta = (offset - lastOffset); lastOffset = offset; averageSample = (averageSample * 0.75f) + (delta / trans * 0.25f); BusyText = $"Sending: {offset / fLen:f2}%" + Environment.NewLine + $"Rate: {(int)(averageSample / 1.024)}KB/s"; sw.Restart(); } if (toWrite <= 0) { break; } } sw.Stop(); socket.Receive(socketBuffer, 9, SocketFlags.None); if (Encoding.ASCII.GetString(socketBuffer, 0, 9) != "YATA TERM") { BusyText = connectionError; socket.Close(); return(result); } socket.Close(); result.Sent = true; return(result); }); if (start) { task.Start(); } return(task); }
private Task<SendThemeResults> SendTheme_Execute(string ip, bool start) { var sendingTheme = MainResources.Busy_Sender_SendingTheme; var connecting = MainResources.Busy_Sender_Connecting; var connectionError = MainResources.Busy_Sender_ConnectionError; var bgmPath = Path.Combine(Path.GetDirectoryName(ThemePath), BGM_FILE_NAME); var zipThemeTask = ZipTheme_Execute(bgmPath, false); var task = new Task<SendThemeResults>(() => { var result = new SendThemeResults { IP = ip, Sent = false, }; IPAddress addr; if (!IPAddress.TryParse(ip, out addr)) return result; var endPoint = new IPEndPoint(addr, 5000); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); zipThemeTask.Start(); result.Zip = zipThemeTask.Result; var tries = 0; var maxTries = Settings.Default.SocketMaxTries; var connected = false; while (!connected) { try { BusyText = connecting + $" [{++tries}/{maxTries}]"; socket.Connect(endPoint); connected = true; } catch (SocketException) { if (tries >= maxTries) return result; } } BusyText = sendingTheme; byte[] socketBuffer = new byte[16]; socket.Receive(socketBuffer, 11, SocketFlags.None); if (Encoding.ASCII.GetString(socketBuffer, 0, 11) != "YATA SENDER") { BusyText = connectionError; socket.Close(); return result; } var toWrite = result.Zip.Data.Length; var offset = 0; var fLen = (float) result.Zip.Data.Length / 100; Stopwatch sw = new Stopwatch(); sw.Start(); float averageSample = 0; var lastOffset = 0; while (true) { var step = Math.Min(toWrite, 8192); socket.Send(result.Zip.Data, offset, step, 0); toWrite -= step; offset += step; if (sw.ElapsedMilliseconds > 100) { float trans = sw.ElapsedMilliseconds; var delta = (offset - lastOffset); lastOffset = offset; averageSample = (averageSample * 0.75f) + (delta / trans * 0.25f); BusyText = $"Sending: {offset / fLen:f2}%" + Environment.NewLine + $"Rate: {(int)(averageSample / 1.024)}KB/s"; sw.Restart(); } if (toWrite <= 0) break; } sw.Stop(); socket.Receive(socketBuffer, 9, SocketFlags.None); if (Encoding.ASCII.GetString(socketBuffer, 0, 9) != "YATA TERM") { BusyText = connectionError; socket.Close(); return result; } socket.Close(); result.Sent = true; return result; }); if (start) task.Start(); return task; }