private void OnFileRequestRecived(FileRequestRecivedEventArgs e)
 {
     EventHandler<FileRequestRecivedEventArgs> handler = FileRequestRecived;
     if (handler != null) handler(this, e);
 }
        private void ParsePacket(Packet.Packet packet)
        {
            // Функция вовращает true если найдена опция и дальнейший разбор данных не требуется.
                if (ParseOptions(packet))
                {
                    return;
                }

            switch (packet.Data.Type)
            {
                // Обработка пакета текстового сообщения
                case  DataType.Text:
                    {
                        var text = StructConvertor.FromBytes<Text>(packet.Data.Content);

                        // Определяет необходимость разархивирования
                        if (packet.Header.Option2 == PacketOption2.Compressed)
                        {
                            text.Content = Compressor.Unzip(packet.Data.Content);
                        }

                        // Событие передает тип пакета и текст для пользователя
                        OnMessageRecived(new MessageRecivedEventArgs(MessageType.Text, Encoding.UTF8.GetString(text.Content), packet.Header.Sender, packet.Header.Recipient));

                        // Выслать ACK
                        SendAcknowledge(packet);
                    }
                    break;

                // Обработка пакета текстового сообщения
                case DataType.BroadcastText:
                    {
                        var broabroadcastText = StructConvertor.FromBytes<BroadcastText>(packet.Data.Content);

                        // Определяет необходимость разархивирования
                        if (packet.Header.Option2 == PacketOption2.Compressed)
                        {
                            broabroadcastText.Content = Compressor.Unzip(packet.Data.Content);
                        }

                        // Событие передает тип пакета и текст для пользователя
                        OnMessageRecived(new MessageRecivedEventArgs(MessageType.BroadcastText, Encoding.UTF8.GetString(broabroadcastText.Content), packet.Header.Sender, packet.Header.Recipient));

                        // Выслать ACK
                        SendAcknowledge(packet);
                    }
                    break;

                // Обработка пакета запроса на передачу файла
                case DataType.FileRequest:
                    {
                        var fileRequest = StructConvertor.FromBytes<FileRequest>(packet.Data.Content);

                            // Выслать подверждение получения пакета
                            SendAcknowledge(packet);

                            // Если не принимается и не передается файл
                            if (!Client.IsSendingFile && !IsRecivingFile)
                            {
                                var ea = new FileRequestRecivedEventArgs(fileRequest.FileName, fileRequest.FileLenght, packet.Header.Sender);

                                OnFileRequestRecived(ea);

                                _waitFileTransferAnswer = true;

                                // Сохраняет параметры файла
                                _receivingFileName = fileRequest.FileName;
                                ReceivingFileSize = fileRequest.FileLenght;
                                // Сохраняет id отправителя файла
                                _fileSender = packet.Header.Sender;

                                _waitFileTransferAnswerTimer.Change(_waitFileTransferAnswerTimeOut, Timeout.Infinite);
                            }
                            else
                            {
                                SendFileTransferCancel(packet.Header.Sender);

                                // Событие - сообщение о ошибке
                                OnMessageRecived(new MessageRecivedEventArgs(MessageType.Error,
                                                                             "Клиенту № " + packet.Header.Sender +
                                                                             " Было отказано в передачи файла "
                                                                             + fileRequest.FileName + " размером " +
                                                                             fileRequest.FileLenght / 1024 / 1024
                                                                             +
                                                                             "МБ, так как в данный момент уже осуществляется прием другого файла ",
                                                                             0, 0));
                            }
                    }
                        break;

                    // Обработка пакета файла
                    case DataType.FileData :
                    {
                        var fileData = StructConvertor.FromBytes<FileData>(packet.Data.Content);

                        // Если совпал номер пакета и разрешено получение файлов и файл существует и id отправителя совпал с id отправителя файла
                            if (Client.CountOfFilePackets == fileData.PacketNumber && IsRecivingFile &&
                            File.Exists(ReceivingFileFullName) && packet.Header.Sender == _fileSender)
                        {
                            ProcessedFileSize += _filePacketSize;
                            // Устанавливает что пакет получен
                            _waitForFilePacketEvent.Set();
                            // Выслать подверждение получения пакета
                            SendAcknowledge(packet);

                            // Разархивация данных
                          //  fileData.Content = Compressor.Unzip(packet.Data.Content);
                           // var unzipContent = Compressor.Unzip(packet.Data.Content);

                            // Запись данных в файл
                            if (!ByteArrayToFile(ReceivingFileFullName, fileData.Content))
                            {
                                OnMessageRecived(new MessageRecivedEventArgs(MessageType.Error,
                                                                             "Ошибка при записи в файл",
                                                                             packet.Header.Sender, 0));
                                OnMessageRecived(
                                    new MessageRecivedEventArgs(MessageType.FileTransferCanceledRecipientSide,
                                                                _receivingFileName, _fileSender, 0));
                                CancelRecivingFile();
                                break;
                            }

                            // Инкрементирует число принятых пакетов
                            Client.CountOfFilePackets++;
                            // Если пакет последний в цепочке
                            if (fileData.LastPacket)
                            {
                                // Событие о заверщении приема файла
                                OnMessageRecived(new MessageRecivedEventArgs(MessageType.FileReceivingComplete,
                                                                             _receivingFileName, packet.Header.Sender,
                                                                             packet.Header.Recipient));
                                SendFileTransferCompleted(packet.Header.Sender);
                                // Закрывает поток записи файла
                                _fileStream.Close();
                                IsRecivingFile = false;
                            }
                        }
                        else
                        {
            #if DEBUG
                            // Событие - сообщение о ошибке
                            OnMessageRecived(new MessageRecivedEventArgs(MessageType.Error,
                                                                         "Пакет файла: не совпал номер пакета, принятый номер " +
                                                                         fileData.PacketNumber +
                                                                         "сохраненый номер " + Client.CountOfFilePackets,
                                                                         packet.Header.Sender, 0));
            #endif
                        }

            }
                        break;

                case DataType.Initialization:
                    {
                        // Выслать подверждение получения пакета
                        SendAcknowledge(packet);
                    }
                    break;

            }
        }
 // Получение данных и вызов обработчика запроса на передачу
 void ComPortFileRequestRecived(object sender, FileRequestRecivedEventArgs e)
 {
     // ivoke вызывает в том же потоке, beginionvoke в новом
     BeginInvoke(new ReciveFileRequestDelegate(ReciveFileRequest), e);
 }
        // Метод обработки запроса на передачу
        void ReciveFileRequest(FileRequestRecivedEventArgs e)
        {
            //  MessageBox.Show("Запрос на передачу файла " + fileName + " размером " + fileLenght / 1024 / 1024 + "МБ" + " от клиента " + sender);

            // // Сообщения о том надо ли принимать файл
            // DialogResult dialogResult = MessageBox.Show("Прниять файл " +e.FileName  +
            //        "от клиента № " + e.Sender + " размером " + e.FileLenght / 1024 / 1024 + "МБ?",
            //        "Передача файла", MessageBoxButtons.YesNo);
            //
            // e.FileTransferAllowed = dialogResult == DialogResult.Yes;

            float filesize = (float)e.FileLenght / 1024 / 1024;

               // _richEditControls[e.Sender].SelectionAlignment = HorizontalAlignment.Left;
               // _richEditControls[e.Sender].SelectionColor = Color.SteelBlue;
               // _richEditControls[e.Sender].AppendText("Прниять файл " + e.FileName + " размером " + filesize.ToString("0.00") + "МБ?" + '\n');

            AppendLine("Прниять файл " + e.FileName + " размером " + filesize.ToString("0.00") + "МБ?", _richEditControls[e.Sender], _defaultFont, _systemColor, ParagraphAlignment.Left);

            // Скрол вниз
               // if (_richEditControls[e.Sender].Document.Text.Length > 0)
               //     _richEditControls[e.Sender].Select(_richEditControls[e.Sender].TextLength - 1, 0);
            //_richEditControls[e.Sender].ScrollToCaret();

            try
            {
                _richEditControls[e.Sender].ScrollToCaret();
            }
            catch (Exception)
            {

            }

            FileBut.Visible = false;

            AllowBut.Visible = true;
            DenyBut.Visible = true;
            FileRequestLabel.Visible = true;

            if (Convert.ToByte(xtraTabControl1.SelectedTabPage.Tag) != e.Sender)
            {
                _tabPages[e.Sender].Text = _tabsNames[e.Sender] + " +" + ++_newMessageCount[e.Sender];
            }
        }
Example #5
0
        // Метод обработки запроса на передачу
        void ReciveFileRequest(FileRequestRecivedEventArgs e)
        {
            //  MessageBox.Show("Запрос на передачу файла " + fileName + " размером " + fileLenght / 1024 / 1024 + "МБ" + " от клиента " + sender);

               // // Сообщения о том надо ли принимать файл
               // DialogResult dialogResult = MessageBox.Show("Прниять файл " +e.FileName  +
               //        "от клиента № " + e.Sender + " размером " + e.FileLenght / 1024 / 1024 + "МБ?",
               //        "Передача файла", MessageBoxButtons.YesNo);
               //
               // e.FileTransferAllowed = dialogResult == DialogResult.Yes;

            float filesize = (float)e.FileLenght / 1024 / 1024;

            _richTextBoxs[e.Sender].SelectionAlignment = HorizontalAlignment.Left;
            _richTextBoxs[e.Sender].SelectionColor = Color.SteelBlue;
            _richTextBoxs[e.Sender].AppendText("Прниять файл " + e.FileName + " размером " + filesize.ToString("0.00") + "МБ?" + '\n');

            // Скрол вниз
            if (_richTextBoxs[e.Sender].TextLength > 0)
                _richTextBoxs[e.Sender].Select(_richTextBoxs[e.Sender].TextLength - 1, 0);
            _richTextBoxs[e.Sender].ScrollToCaret();

            FileBut.Visible = false;

            AllowBut.Visible = true;
            DenyBut.Visible = true;
            FileLabel.Visible = true;

            if (tabControl1.SelectedTab.TabIndex != e.Sender)
            {
                _tabPages[e.Sender].Text = "Клиент " + e.Sender + " +" + ++_newMessageCount[e.Sender];
            }
        }