private void MenuItem_Click(object sender, RoutedEventArgs e) { if (lstvClients.SelectedItem == null) { return; } OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.CheckFileExists = dlgOpen.CheckPathExists = true; if (dlgOpen.ShowDialog() != true) { return; } var bw = new BinaryWriter(tcpClient.GetStream()); bw.Write((byte)Command.SendFile); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(tcpClient.GetStream(), lstvClients.SelectedItem); byte[] bytes; using (FileStream file = new FileStream(dlgOpen.FileName, FileMode.Open, FileAccess.Read)) { bytes = new byte[file.Length]; file.Read(bytes, 0, (int)file.Length); } string ext = dlgOpen.FileName.Substring(dlgOpen.FileName.LastIndexOf(".")); bf.Serialize(tcpClient.GetStream(), ext); bf.Serialize(tcpClient.GetStream(), bytes); ChatListItem newItem = new ChatListItem() { messageDate = DateTime.Now.ToString(), messageSender = login, messageContent = SendFileFlowDoc("") }; lstChat.Items.Add(newItem); }
private void ListenToServer(Object obj) { var client = obj as TcpClient; bool isContinue = true; BinaryFormatter bf = new BinaryFormatter(); while (isContinue) { var r = new BinaryReader(client.GetStream()); switch ((Command)r.ReadByte()) { case Command.RefreshClientList: List <string> lst = bf.Deserialize(tcpClient.GetStream()) as List <string>; Application.Current.Dispatcher.Invoke(() => { lstvClients.ItemsSource = lst; }); break; case Command.Receive: ChatMessage message = bf.Deserialize(tcpClient.GetStream()) as ChatMessage; Application.Current.Dispatcher.Invoke(() => { FlowDocument newDoc = new FlowDocument(); newDoc.FontFamily = new FontFamilyConverter().ConvertFrom("Segoe UI") as FontFamily; newDoc.FontSize = 12; newDoc.PagePadding = new Thickness() { Left = 0, Right = 0, Bottom = 0, Top = 0 }; newDoc.Blocks.Add(new Paragraph()); newDoc.LineHeight = 20; var inlines = (newDoc.Blocks.FirstBlock as Paragraph).Inlines; for (int i = 0; i < message.Content.Count; i++) { if (message.Content[i].StartsWith("::smile::")) { inlines.Add(new Image()); var newImage = ((inlines.LastInline as InlineUIContainer).Child as Image); newImage.Source = new ImageSourceConverter().ConvertFrom(smiles[message.Content[i].Substring(9)]) as ImageSource; newImage.Height = 16; Thickness thick = new Thickness() { Left = 3, Top = 0, Right = 3, Bottom = -4 }; newImage.Margin = thick; newImage.VerticalAlignment = VerticalAlignment.Bottom; } else { inlines.Add(new Run(message.Content[i])); } } lstChat.Items.Add( new ChatListItem() { messageDate = message.DateAndTime, messageSender = message.Sender, messageContent = newDoc } ); }); break; case Command.ReceiveFile: string fileSender = bf.Deserialize(tcpClient.GetStream()) as string; fileExt = bf.Deserialize(tcpClient.GetStream()) as string; file = bf.Deserialize(tcpClient.GetStream()) as byte[]; Application.Current.Dispatcher.Invoke(() => { ChatListItem newItem = new ChatListItem() { messageDate = DateTime.Now.ToString(), messageSender = fileSender, messageContent = SendFileFlowDoc("sendfile") }; lstChat.Items.Add(newItem); }); break; case Command.Error: string error = bf.Deserialize(tcpClient.GetStream()) as string; Application.Current.Dispatcher.Invoke(() => { MessageBox.Show(error); }); break; case Command.Exit: MessageBox.Show("Connection to Server terminated"); tcpClient.Close(); tcpClient = null; Application.Current.Dispatcher.Invoke(() => { Close(); }); break; } } }