Ejemplo n.º 1
0
        MessagesPack GetInboxMessages(string currentUsername, MessageTypes messageTypes, Byte[] recentVersion)
        {
            List <Message> recievedMessages = new List <Message>();
            Message        result;
            bool           deleted = messageTypes.HasFlag(MessageTypes.Deleted);
            bool           viewed  = messageTypes.HasFlag(MessageTypes.Viewed);
            ///Ищем в получателях
            List <Recipient> recipients = RecipientGateway.Select(currentUsername, currentUsername, deleted, viewed);

            foreach (Recipient item in recipients)
            {
                result = MessageGateway.Select((int)item.MessageId, currentUsername);
                recievedMessages.Add(result);
            }
            MessagesPack messagesPack = new MessagesPack();

            //Сумма Id всех полученных сообщений
            messagesPack.CountInDB = recievedMessages.Count();
            ///Сообщения с версией выше чем у клиента
            messagesPack.Messages = GetRecentVersionMessages(recievedMessages, recentVersion);
            ///Звполнить Sender, Recipients
            foreach (Message item in messagesPack.Messages)
            {
                FillMessage(item, currentUsername);
            }
            return(messagesPack);
        }
Ejemplo n.º 2
0
        public void Send(byte[] serializedContainer, IPEndPoint endPoint)
        {
            Console.WriteLine("Отправка контейнера размером " + serializedContainer.Length + "\n\n\n\n");
            MessagesPack container = ZeroFormatterSerializer
                                     .Deserialize <MessagesPack>(serializedContainer);

            if (container.Messages == null)
            {
                throw new Exception("Пустой контейнер");
            }
            containers.Add(container);
        }
Ejemplo n.º 3
0
        MessagesPack GetSentboxMessages(string currentUsername, MessageTypes messageTypes, Byte[] recentVersion)
        {
            bool           deleted      = messageTypes.HasFlag(MessageTypes.Deleted);
            List <Message> sentMessages = MessageGateway.Select(currentUsername, currentUsername, deleted);
            MessagesPack   messagesPack = new MessagesPack();

            messagesPack.CountInDB = sentMessages.Count();
            messagesPack.Messages  = GetRecentVersionMessages(sentMessages, recentVersion);
            foreach (Message item in messagesPack.Messages)
            {
                FillMessage(item, currentUsername);
            }
            return(messagesPack);
        }
Ejemplo n.º 4
0
        protected void UpdateMessages(FolderType folderType, MessageTypes messageTypes, List <Message> messages)
        {
            List <Entity> entities = new List <Entity>();

            entities.AddRange(messages);
            byte[]         recentVersion = AdditionalTools.GetMaxTimestamp(entities);
            MessagesPack   pack          = App.proxy.GetMessages(folderType, messageTypes, recentVersion);
            List <Message> messagesBuf   = new List <Message>();

            messagesBuf.AddRange(messages);
            if (!UpdateMessagesByPack(pack, messagesBuf))
            {
                TrimMessages(messagesBuf, folderType, messageTypes);
            }
            UploadFromMessagesBuf(messages, messagesBuf);
        }
Ejemplo n.º 5
0
        public void HandleBytes(byte[] datagram)
        {
            //Для отладки на компьютере специально пропуская пакеты
#if UNITY_EDITOR
            if (packetLossEvent.IsEventHappened())
            {
                return;
            }
#endif

            MessagesPack messagesContainer = ZeroFormatterSerializer.Deserialize <MessagesPack>(datagram);
            NetworkStatisticsStorage.Instance.RegisterDatagram(datagram.Length, messagesContainer.Id);
            foreach (byte[] data in messagesContainer.Messages)
            {
                MessageWrapper message = ZeroFormatterSerializer.Deserialize <MessageWrapper>(data);
                NetworkStatisticsStorage.Instance.RegisterMessage(data.Length, message.MessageType);
                messageProcessor.Handle(message);
            }
        }
        private void SendDatagram(IPEndPoint ipEndPoint, List <byte[]> messages, int startMessageIndex,
                                  int messagesCount, int packId)
        {
            if (messagesCount == 0)
            {
                throw new Exception("Нельзя отправлять пустые контейнеры");
            }

            //Положить сообщения в контейнер
            MessagesPack messagesPack = new MessagesPack();

            messagesPack.Messages = new byte[messagesCount][];
            messages.CopyTo(startMessageIndex, messagesPack.Messages, 0, messagesCount);
            //Установить номер контейнера для игрока
            messagesPack.Id = packId;
            //Сериализовать контейнер
            byte[] serializedDatagram = ZeroFormatterSerializer.Serialize(messagesPack);
            //Отправить контейнер
            udpSender.Send(serializedDatagram, ipEndPoint);
        }
Ejemplo n.º 7
0
 bool UpdateMessagesByPack(MessagesPack pack, List <Message> messagesBuf)
 {
     if (pack.Messages.Count > 0)
     {
         Message message;
         foreach (Message item in pack.Messages)
         {
             message = messagesBuf.FirstOrDefault(row => row.Id == item.Id);
             if (message == null)
             {
                 messagesBuf.Add(item);
             }
             else
             {
                 messagesBuf.Remove(message);
                 messagesBuf.Add(item);
             }
         }
         /// Восстанавливаем нормальный порядок
         messagesBuf = messagesBuf.OrderBy(row => row.Date).ToList();
     }
     return(messagesBuf.Count == pack.CountInDB);
 }
Ejemplo n.º 8
0
        public void Connect(string Port, string IP, string Id, string Name, string Password, Color color, bool IsNewUser)
        {
            if (Connected)
            {
                return;
            }
            bool validPort     = int.TryParse(Port, out _port);
            bool validIP       = IPAddress.TryParse(IP, out _ip);
            bool validName     = Name != null;
            bool EmptyPassword = string.IsNullOrWhiteSpace(Password);
            bool EmptyId       = string.IsNullOrWhiteSpace(Id);



            if (validIP == false && validPort == true)
            {
                throw new SpecialException('A');
            }
            else if (validPort == false && validIP == true)
            {
                throw new SpecialException('B');
            }
            else if (validIP == false && validPort == false)
            {
                throw new SpecialException('C');
            }

            if (validPort && validIP && validName)
            {
                if (EmptyId)
                {
                    throw new SpecialException('E');
                }
                if (String.IsNullOrWhiteSpace(Name))
                {
                    throw new SpecialException('F');
                }
                char[] arrOfTxtName = Name.ToCharArray();
                for (int i = 0; i < arrOfTxtName.Length; i++)
                {
                    if (!char.IsLetter(arrOfTxtName[i]))
                    {
                        throw new SpecialException('G');
                    }
                }
                if (EmptyPassword)
                {
                    throw new SpecialException('H');
                }
                else if (!regularEx.IsMatch(Password))
                {
                    throw new SpecialException('I');
                }

                try
                {
                    _currentUser             = new User();
                    _currentUser.ID          = Id;
                    _currentUser.Name        = Name;
                    _currentUser.Password    = Password;
                    _currentUser.Color       = color;
                    _currentUser.IsNew       = IsNewUser;
                    _currentUser.IsConnected = true;
                    _mb = new MessageBase()
                    {
                        CurrentTime = DateTime.Now, CurrenUser = _currentUser,
                    };

                    _tcpClient = new TcpClient();
                    _tcpClient.Connect(_ip, _port);
                    _stream = _tcpClient.GetStream();

                    t = new Thread(() =>
                    {
                        _bf.Serialize(_stream, _mb);

                        MessageBase m = (MessageBase)_bf.Deserialize(_stream);

                        if (m is MessageBase)
                        {
                            MessagesPack mp = new MessagesPack();
                            //***i must use an event. because its inside thread. when abort function will call it will wipe out all details
                            if (m.op.NewUserIdlsAlreadyExistInDB)
                            {
                                OnMustThrowMessagesFromThread(mp.message4, EventArgs.Empty);
                                t.Abort();
                                return;
                            }
                            if (m.op.ErrorState == 'd')
                            {
                                OnMustThrowMessagesFromThread(mp.message1, EventArgs.Empty);
                                t.Abort();
                                return;
                            }
                            if (m.op.ErrorState == 'a')
                            {
                                OnMustThrowMessagesFromThread(mp.message2, EventArgs.Empty);
                                t.Abort();
                                return;
                            }
                            if (m.op.ErrorState == 'b')
                            {
                                OnMustThrowMessagesFromThread(mp.message3, EventArgs.Empty);
                                t.Abort();
                                return;
                            }
                            Connected = true;
                            OnSetConnected(this, EventArgs.Empty);
                            this._currentUser.ID = (string)m.CurrenUser.ID;
                            StartRecieveMessages();
                        }
                    });
                    t.Start();
                }


                catch (SocketException)
                {
                    throw new SpecialException('J');
                }
                catch (ArgumentException)
                {
                    throw new ArgumentException();
                }
                catch (SpecialException)
                {
                }
                catch (Exception)
                {
                    //throw new Exception();
                }
            }
        }