| 32 | } |
| 33 | |
| 34 | void FileTransferChannel::ParseBinaryMessage(std::string_view _data) { |
| 35 | auto msg = std::make_shared<tc::Message>(); |
| 36 | std::string data(_data.data(), _data.size()); |
| 37 | if (!msg->ParseFromString(data)) { |
| 38 | LOGE("Parse proto message failed"); |
| 39 | return; |
| 40 | } |
| 41 | |
| 42 | if (msg->type() == MessageType::kFileTransfer) { |
| 43 | auto fs = msg->file_transfer(); |
| 44 | |
| 45 | auto func_transfer_failed = [=, this]() { |
| 46 | tc::Message resp_msg; |
| 47 | resp_msg.set_type(MessageType::kRespFileTransfer); |
| 48 | auto resp_file_transfer = resp_msg.mutable_resp_file_transfer(); |
| 49 | resp_file_transfer->set_id(fs.id()); |
| 50 | resp_file_transfer->set_state(RespFileTransfer::kTransferFailed); |
| 51 | resp_file_transfer->set_filename(fs.filename()); |
| 52 | PostBinaryMessage(resp_msg.SerializeAsString()); |
| 53 | }; |
| 54 | |
| 55 | if (fs.state() == FileTransfer::kRequestFileTransfer) { |
| 56 | LOGI("Ref folder: {}", fs.ref_folder()); |
| 57 | std::string file_path; |
| 58 | // with folder ? |
| 59 | if (!fs.ref_folder().empty()) { |
| 60 | QString folder_path = QString::fromStdString(settings_->file_transfer_folder_ + "/" + fs.ref_folder()); |
| 61 | QDir dir(folder_path); |
| 62 | if (!dir.exists()) { |
| 63 | if (dir.mkpath(".")) { |
| 64 | } else { |
| 65 | LOGE("Create folder failed: {}", folder_path.toStdString()); |
| 66 | return; |
| 67 | } |
| 68 | } |
| 69 | file_path = settings_->file_transfer_folder_ + "/" + fs.ref_path(); |
| 70 | } else { |
| 71 | // 1. check file state |
| 72 | file_path = settings_->file_transfer_folder_ + "/" + fs.filename(); |
| 73 | } |
| 74 | bool ready_to_transfer; |
| 75 | if (!QFile::exists(file_path.c_str())) { |
| 76 | ready_to_transfer = true; |
| 77 | } else { |
| 78 | if (File::Delete(file_path)) { |
| 79 | ready_to_transfer = true; |
| 80 | } else { |
| 81 | ready_to_transfer = false; |
| 82 | LOGE("Delete file failed: {}", file_path); |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | // 2. response |
| 87 | tc::Message resp_msg; |
| 88 | resp_msg.set_type(MessageType::kRespFileTransfer); |
| 89 | auto resp_file_transfer = resp_msg.mutable_resp_file_transfer(); |
| 90 | resp_file_transfer->set_id(fs.id()); |
| 91 | if (ready_to_transfer) { |
no test coverage detected