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;
                        }
                    }
                }
            }
        }