private void RefreshContacts(RefreshContactsTemplate refrC) { Task.Factory.StartNew(() => { ObservableCollection <MessageUI> tempMessagesUI; List <ContactUI> RefreshedContacts = new List <ContactUI>(); MessageUI tempMessageUI; foreach (Contact contact in refrC.Contacts) { tempMessagesUI = new ObservableCollection <MessageUI>(); Application.Current.Dispatcher.Invoke(new Action(() => { MemoryStream memoryStream = new MemoryStream(contact.AvatarImage); BitmapImage chatAvatar = Converters.BitmapToImageSource(new Bitmap(memoryStream)); switch (contact.ContactType) { case ContactType.Chat: foreach (Message i in contact.Messages) { tempMessageUI = new MessageUI(mainPageViewModel, refrC.ContactsOwner == i.SenderID, refrC.ContactsOwner == i.SenderID ? mainPageViewModel.MainViewModel.UserInfo.Avatar : chatAvatar, refrC.ContactsOwner == i.SenderID ? mainPageViewModel.MainViewModel.UserInfo.Info.Status : contact.Status, i.MessageType, i.MessageState, i.Time, i.MessageBody, i.SenderName, contact.ChatId, i.MessageID, i.SenderID, i.FileName, i.FileSize); tempMessagesUI.Insert(0, tempMessageUI); } RefreshedContacts.Add(new ContactUI(contact.AppName, "", chatAvatar, contact.Status, contact.UserId, contact.ChatId, tempMessagesUI, contact.IsBlocked)); break; case ContactType.Conversation: foreach (Message i in contact.Messages) { Status memberStatus = Status.Offline; BitmapImage memberImage = null; bool isUserLeaveConv = false; foreach (Contact member in contact.Members) { if (member.UserId == i.SenderID) { memberStatus = member.Status; MemoryStream ms = new MemoryStream(member.AvatarImage); memberImage = Converters.BitmapToImageSource(new Bitmap(ms)); i.SenderName = member.AppName; break; } } if (memberImage == null) { memberImage = Converters.BitmapToImageSource(Resources.Katran); isUserLeaveConv = true; } tempMessageUI = new MessageUI(mainPageViewModel, refrC.ContactsOwner == i.SenderID, refrC.ContactsOwner == i.SenderID ? mainPageViewModel.MainViewModel.UserInfo.Avatar : memberImage, refrC.ContactsOwner == i.SenderID ? mainPageViewModel.MainViewModel.UserInfo.Info.Status : memberStatus, i.MessageType, i.MessageState, i.Time, i.MessageBody, i.SenderName, contact.ChatId, i.MessageID, i.SenderID, i.FileName, i.FileSize); if (isUserLeaveConv) { tempMessageUI.UserName = (string)Application.Current.FindResource("l_UserLoggedOut"); } tempMessagesUI.Insert(0, tempMessageUI); } RefreshedContacts.Add(new ContactUI(contact.AppName, contact.Members.Count.ToString() + ' ' + (string)Application.Current.FindResource("l_Members"), chatAvatar, contact.Status, contact.UserId, contact.ChatId, tempMessagesUI, false, ContactType.Conversation, new ObservableCollection <Contact>(contact.Members))); break; default: break; } } )); } Application.Current.Dispatcher.Invoke(new Action(() => { mainPageViewModel.ContactsTab.Contacts.Clear(); foreach (ContactUI item in RefreshedContacts) { mainPageViewModel.ContactsTab.Contacts.Add(item); } } )); }); }
void NotifyHandling() { BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream()) { while (true) { try { memoryStream.Flush(); memoryStream.Position = 0; do { byte[] buffer = new byte[256]; int bytes; bytes = clientStream.Read(buffer, 0, buffer.Length); memoryStream.Write(buffer, 0, bytes); buffer = new byte[256]; }while (clientStream.DataAvailable); memoryStream.Position = 0; RRTemplate serverResponse = formatter.Deserialize(memoryStream) as RRTemplate; if (serverResponse != null) { switch (serverResponse.RRType) { case RRType.AddContact: AddRemoveContactTemplate aContT = serverResponse.RRObject as AddRemoveContactTemplate; if (aContT != null) { AddContact(aContT); } break; case RRType.RemoveContact: AddRemoveContactTemplate rContT = serverResponse.RRObject as AddRemoveContactTemplate; if (rContT != null) { RemoveContact(rContT); } break; case RRType.RefreshContacts: RefreshContactsTemplate refrC = serverResponse.RRObject as RefreshContactsTemplate; if (refrC != null) { RefreshContacts(refrC); } break; case RRType.SearchOutContacts: SearchOutContactsTemplate searchOutC = serverResponse.RRObject as SearchOutContactsTemplate; if (searchOutC != null) { SearchOutContacts(searchOutC); } break; case RRType.SendMessage: SendMessageTemplate sMessT = serverResponse.RRObject as SendMessageTemplate; if (sMessT != null) { SendMessageReceive(sMessT); } break; case RRType.RefreshContactStatus: RefreshContactStatusTemplate refrContStT = serverResponse.RRObject as RefreshContactStatusTemplate; if (refrContStT != null) { RefreshContactStatus(refrContStT); } break; case RRType.AddContactTarget: AddRemoveContactTargetTemplate aconttT = serverResponse.RRObject as AddRemoveContactTargetTemplate; if (aconttT != null) { AddContactTarget(aconttT); } break; case RRType.RemoveContactTarget: AddRemoveContactTargetTemplate rconttT = serverResponse.RRObject as AddRemoveContactTargetTemplate; if (rconttT != null) { RemoveContactTarget(rconttT); } break; case RRType.RefreshMessageState: RefreshMessageStateTemplate refrmsT = serverResponse.RRObject as RefreshMessageStateTemplate; if (refrmsT != null) { RefreshMessageState(refrmsT); } break; case RRType.CreateConv: CreateConvTemplate crconvT = serverResponse.RRObject as CreateConvTemplate; if (crconvT != null) { AddConv(crconvT); } break; case RRType.RemoveConv: RemoveConvTemplate rconvT = serverResponse.RRObject as RemoveConvTemplate; if (rconvT != null) { RemoveConv(rconvT); } break; case RRType.RemoveConvTarget: RemoveConvTemplate rconvtT = serverResponse.RRObject as RemoveConvTemplate; if (rconvtT != null) { RemoveConvTarget(rconvtT); } break; case RRType.BlockUnblockUserTarget: BlockUnblockUserTemplate bunbUT = serverResponse.RRObject as BlockUnblockUserTemplate; if (bunbUT != null) { ChangeBlockUserStatusTarget(bunbUT); } break; default: if (client.Connected) { mainPageViewModel.MainViewModel.ErrorService(new ErrorReportTemplate(ErrorType.Other, new Exception("Unknown problem"))); } else { return; } break; } } else { if (client.Connected) { mainPageViewModel.MainViewModel.ErrorService(new ErrorReportTemplate(ErrorType.UnCorrectServerResponse, new Exception("Uncorrect server response"))); } else { return; } } } catch (SocketException ex) { if (client.Connected) { mainPageViewModel.MainViewModel.ErrorService(new ErrorReportTemplate(ErrorType.NoConnectionWithServer, ex)); } else { return; } } catch (Exception ex) { if (client.Connected) { mainPageViewModel.MainViewModel.ErrorService(new ErrorReportTemplate(ErrorType.Other, ex)); } else { return; } } } } }