void TFtp::Session::Task::PrintState() const { if (not file || not file->is_open()) { return; } const ssize_t kOff = file->tellg(); ShowPercentage("\t * Прогресс", (kOff > 0 ? ((kOff * 100) / file_sz) : 100)); }
bool YModem::SendFile(const std::string &path, YModem::SPort &out) { if (path.size() == 0 || not out.is_open()) return false; std::fstream firm_str(path.c_str()); if (not firm_str.is_open()) return false; firm_str.seekg(0, firm_str.end); const size_t kFileSize = firm_str.tellg(); firm_str.seekg(0, firm_str.beg); // ожидание запроса WaitForResponse(out, Packet::kRequest); Packet::Sequence seq(&out); // инициализация соединения char buf[24]; snprintf(buf, 24, "%u", (unsigned)kFileSize); const std::string kMsgs[] = {path, buf}; SendInitialPkt(seq, kMsgs, 2); if (not IsResponse(out, Packet::kRequest)) { firm_str.close(); return false; } // передача файла Array frame(NewFrame()); size_t was_send = 0; size_t last_percent = 0; do { firm_str.sync(); firm_str.read((char*)frame.get(), kFrameSize); const size_t kWasRead = firm_str.gcount(); if (kWasRead != kFrameSize) { memset(frame.get() + kWasRead, 0, kFrameSize - kWasRead); } seq.Send(Packet(Packet::kSTX, frame.get(), kFrameSize)); was_send += kWasRead; if (not IsResponse(out, Packet::kACK)) { std::cout << "\t ! Ошибка передачи данных" << std::endl; break; } const size_t kPercent = was_send * 100 / kFileSize; if (kPercent > last_percent) { ShowPercentage("\t * Прогресс", kPercent); last_percent = kPercent; } } while (was_send < kFileSize); std::cout << std::endl; seq.Send(Packet(Packet::kEOT)); IsResponse(out, Packet::kACK); seq.Send(Packet(Packet::kEOT)); IsResponse(out, Packet::kACK); IsResponse(out, Packet::kRequest); SendClosingPkt(seq); firm_str.close(); return true; }