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]; } }
// Метод обработки запроса на передачу 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]; } }