/// <summary> /// Handles message receiving and decryption of incoming messages. /// </summary> /// <param name="msg"></param> public void Receive(Message msg) { foreach (SharedComponents.Client c in _onlineClients.Values) { if (c.Name == msg.Sender) { string output = ""; switch (_viewModel.SelectedCypher) { case (int)Cyphers.SimpleEncryption: var cypher1 = new SimpleEncryption(); output = msg.Sender + " : " + cypher1.DecryptMessage(msg.Content, _viewModel.Key); break; case (int)Cyphers.Rijndael: var cypher2 = new Rijndael(); output = msg.Sender + " : " + cypher2.DecryptMessage(msg.Content, _viewModel.Key); break; } ListBoxItem item = MakeItem(c.AvatarID, output); _viewModel.ChatMsgs.Add(item); _messages.Add(msg.Content); using (var terr = new ChatDataContainer()) { var sender = terr.ChatUsersSet.Where(s => s.Username == msg.Sender).ToList(); var curUser = terr.ChatUsersSet.Where(s => s.Username == _viewModel.Name).ToList(); ChatData temp = new ChatData { Id = curUser[0].Id, Sender = sender[0].Id, Message = msg.Content, RecTime = msg.Time, ChatUsers = curUser[0] }; _msgIds.Add(msg.Sender); try { terr.ChatDataSet.Add(temp); terr.SaveChanges(); } catch (Exception e) { _viewModel.Name = e.ToString(); } } } } _viewModel.ScrollDown(); }
/// <summary> /// This is the second important method, which creates /// the proxy, subscribe to connection state events /// and open a connection with the service /// </summary> public void Connect() { if (_channel == null) { try { _localClient = new SharedComponents.Client { Name = _viewModel.Name, AvatarID = _viewModel.SelectedIndex }; InstanceContext context = new InstanceContext(this); //As the address in the configuration file is set to localhost //we want to change it so we can call a service in internal //network, or over internet string servicePath = "/WPFHost/tcp"; string[] address = _viewModel.ConnectionIP.Split(':'); var binding = new NetTcpBinding("NetTcpBinding"); var endAdd = new EndpointAddress("net.tcp://" + address[0] + ":" + address[1] + servicePath); _channel = new WcfChatClient(context, binding, endAdd); _channel.Open(); _channel.InnerDuplexChannel.Faulted += InnerDuplexChannel_Faulted; _channel.InnerDuplexChannel.Opened += InnerDuplexChannel_Opened; _channel.InnerDuplexChannel.Closed += InnerDuplexChannel_Closed; _channel.SetProxy(_channel.ChannelFactory.CreateChannel()); _channel.ConnectCompleted += proxy_ConnectCompleted; //_channel.Connect(_localClient); //_channel.ConnectCompleted += (proxy_ConnectCompleted); _messages.Clear(); _msgIds.Clear(); //load all previous messages from database _channel.ConnectAsync(_localClient); //proxy_ConnectCompleted(output); using (var temp = new ChatDataContainer()) { var user = temp.ChatUsersSet.Where(s => s.Username == _viewModel.Name).ToList(); if (user.Count == 0) { var newuser = new ChatUsers { AvatarID = _viewModel.SelectedIndex, Username = _viewModel.Name }; temp.ChatUsersSet.Add(newuser); temp.SaveChanges(); } var cur = temp.ChatUsersSet.SingleOrDefault(t => t.Username == _viewModel.Name); if (cur != null) { long id = cur.Id; var userlist = temp.ChatUsersSet.Select(s => new { ID = s.Id, Avatar = s.AvatarID, Name = s.Username }); foreach (var row in temp.ChatDataSet.Where(s => s.Id == id)) { var currentUser = userlist.Where(s => s.ID == row.Id).ToList(); ListBoxItem item = MakeItem(currentUser[0].Avatar, currentUser[0].Name + " : " + row.Message); _viewModel.ChatMsgs.Add(item); _messages.Add(row.Message); _msgIds.Add(currentUser[0].Name); _viewModel.ScrollDown(); } } } } catch (Exception ex) { _viewModel.Name = ex.Message; _viewModel.ChatStatusLabel = "Offline"; _viewModel.ConnectButtonIsEnabled = true; } } else { HandleProxy(); } }