Compare commits

..

No commits in common. "main" and "v0.5.5" have entirely different histories.
main ... v0.5.5

5 changed files with 127 additions and 220 deletions

178
Cargo.lock generated
View file

@ -4,9 +4,9 @@ version = 3
[[package]]
name = "addr2line"
version = "0.20.0"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3"
checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
dependencies = [
"gimli",
]
@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "1.0.4"
version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
dependencies = [
"memchr",
]
@ -48,9 +48,9 @@ dependencies = [
[[package]]
name = "backtrace"
version = "0.3.68"
version = "0.3.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12"
checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7"
dependencies = [
"addr2line",
"cc",
@ -93,12 +93,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cc"
version = "1.0.82"
version = "1.0.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01"
dependencies = [
"libc",
]
checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
[[package]]
name = "cexpr"
@ -147,17 +144,11 @@ dependencies = [
"vec_map",
]
[[package]]
name = "deranged"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929"
[[package]]
name = "embed-resource"
version = "1.8.0"
version = "1.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e62abb876c07e4754fae5c14cafa77937841f01740637e17d78dc04352f32a5e"
checksum = "936c1354206a875581696369aef920e12396e93bbd251c43a7a3f3fa85023a7d"
dependencies = [
"cc",
"rustc_version",
@ -203,9 +194,9 @@ dependencies = [
[[package]]
name = "getrandom"
version = "0.2.10"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
dependencies = [
"cfg-if 1.0.0",
"libc",
@ -214,15 +205,15 @@ dependencies = [
[[package]]
name = "gimli"
version = "0.27.3"
version = "0.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
[[package]]
name = "glob"
version = "0.3.1"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "hermit-abi"
@ -245,11 +236,13 @@ dependencies = [
[[package]]
name = "iui"
version = "0.3.0"
source = "git+https://github.com/rust-native-ui/libui-rs#3496903ae9c4fd68731587dc11739da90a4f0e12"
source = "git+https://github.com/rust-native-ui/libui-rs#6ff94425b341cf718e29d07067dbf82f9215a6d5"
dependencies = [
"bitflags",
"failure",
"lazy_static",
"libc",
"regex",
"ui-sys",
]
@ -267,9 +260,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.147"
version = "0.2.132"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
[[package]]
name = "libloading"
@ -283,9 +276,12 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.20"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if 1.0.0",
]
[[package]]
name = "memchr"
@ -295,28 +291,37 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "miniz_oxide"
version = "0.7.1"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc"
dependencies = [
"adler",
]
[[package]]
name = "nom"
version = "5.1.3"
version = "5.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b"
checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
dependencies = [
"memchr",
"version_check",
]
[[package]]
name = "object"
version = "0.31.1"
name = "num_threads"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1"
checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
dependencies = [
"libc",
]
[[package]]
name = "object"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53"
dependencies = [
"memchr",
]
@ -329,28 +334,28 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]]
name = "pkg-config"
version = "0.3.27"
version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
[[package]]
name = "ppv-lite86"
version = "0.2.17"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
[[package]]
name = "proc-macro2"
version = "1.0.66"
version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
dependencies = [
"unicode-ident",
]
[[package]]
name = "qft"
version = "0.5.6"
version = "0.5.5"
dependencies = [
"iui",
"rand",
@ -365,9 +370,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]]
name = "quote"
version = "1.0.33"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
"proc-macro2",
]
@ -395,30 +400,18 @@ dependencies = [
[[package]]
name = "rand_core"
version = "0.6.4"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
dependencies = [
"getrandom",
]
[[package]]
name = "regex"
version = "1.9.3"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69"
checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
dependencies = [
"aho-corasick",
"memchr",
@ -427,15 +420,15 @@ dependencies = [
[[package]]
name = "regex-syntax"
version = "0.7.4"
version = "0.6.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
[[package]]
name = "rustc-demangle"
version = "0.1.23"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
[[package]]
name = "rustc-hash"
@ -454,15 +447,15 @@ dependencies = [
[[package]]
name = "semver"
version = "1.0.18"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711"
[[package]]
name = "serde"
version = "1.0.171"
version = "1.0.143"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9"
checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553"
[[package]]
name = "shlex"
@ -478,9 +471,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "syn"
version = "1.0.109"
version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13"
dependencies = [
"proc-macro2",
"quote",
@ -501,9 +494,9 @@ dependencies = [
[[package]]
name = "termcolor"
version = "1.2.0"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
dependencies = [
"winapi-util",
]
@ -519,26 +512,19 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.26"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a79d09ac6b08c1ab3906a2f7cc2e81a0e27c7ae89c63812df75e52bef0751e07"
checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b"
dependencies = [
"deranged",
"serde",
"time-core",
"libc",
"num_threads",
]
[[package]]
name = "time-core"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
[[package]]
name = "toml"
version = "0.5.11"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
dependencies = [
"serde",
]
@ -546,7 +532,7 @@ dependencies = [
[[package]]
name = "ui-sys"
version = "0.2.1"
source = "git+https://github.com/rust-native-ui/libui-rs#3496903ae9c4fd68731587dc11739da90a4f0e12"
source = "git+https://github.com/rust-native-ui/libui-rs#6ff94425b341cf718e29d07067dbf82f9215a6d5"
dependencies = [
"bindgen",
"cc",
@ -557,21 +543,21 @@ dependencies = [
[[package]]
name = "unicode-ident"
version = "1.0.11"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
[[package]]
name = "unicode-width"
version = "0.1.10"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
[[package]]
name = "unicode-xid"
version = "0.2.4"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
[[package]]
name = "vec_map"
@ -597,9 +583,9 @@ dependencies = [
[[package]]
name = "vswhom-sys"
version = "0.1.2"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18"
checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39"
dependencies = [
"cc",
"libc",

View file

@ -1,14 +1,11 @@
[package]
name = "qft"
version = "0.5.6"
version = "0.5.5"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
iui = { git = "https://github.com/rust-native-ui/libui-rs", optional = true, version = "0.3" }
rand = { version = "0.8", optional = true }
time = "0.3"
[features]
gui = [ "dep:iui", "dep:rand" ]
iui.git = "https://github.com/rust-native-ui/libui-rs"
rand = "0"
time = "0"

View file

@ -6,7 +6,7 @@ QFT is a small application for Quick (and really reliable) Peer-To-Peer UDP file
...look at the "Releases" section on the sidebar. You should see a link titled vX.Y.Z. Click on
that, and then choose the right file for your OS: `qft` for Linux, `qft-mac` for Mac, and `qft.exe`
for Windows. Download this file, make it executable in case of Linux or Mac, and then follow your
for Windows (currently unavailable, sorry.). Download this file, make it executable in case of Linux or Mac, and then follow your
friend's instructions on how to receive the file they wanted to send you.
## Usage:
@ -19,13 +19,13 @@ OR
- On both PCs, enter `qft gui`.
- Select mode
- Select file to send and file to save to
- Update the shared phrases and bitrate to match
- Update the shared phrases to match
- Click start
### Arguments:
```
qft helper <bind-port>
qft sender <helper-address>:<helper-port> <phrase> <filename> [send-delay] [bitrate] [skip]
qft sender <helper-address>:<helper-port> <phrase> <filename> [bitrate] [skip]
qft receiver <helper-address>:<helper-port> <phrase> <filename> [bitrate] [skip]
```
@ -72,11 +72,8 @@ here as an indicator that no more data will be exchanged between the "previously
## Tips 'n Tricks
- You can add a number to the end of both of your commands (after the filename) to
boost transfer speeds (lower = faster), but a too small number might cause unreliability
due to local network conditions, VPNs, etc (default is 500). This will modify the delay between
packets sent.
- You can also add a number *after that*. It will modify packet size, and a higher number here has
similar effects as a lower one in the previous arg.
boost transfer speeds (higher = faster), but a too large number might cause unreliability
due to local network conditions or VPNs. The maximum possible is 65532 (65535 - 3).
- You can run a helper yourself, as the "helper" mode argument suggests. This helper should simply
be run on a server which is reachable from all over the web (a cheap VPS will definitely do).
- Helpers don't **have to** be run on a public server, they work in LAN too, but that way, only

View file

@ -116,41 +116,8 @@ pub fn gui() -> Result<(), iui::UIError> {
LayoutStrategy::Compact,
);
let mut delay = VerticalBox::new(&ui);
let mut delay_slider = Slider::new(&ui, 100, 3_000);
let delayb = Ref::new(&delay_slider);
let mut delay_box = Entry::new(&ui);
delay_slider.set_value(&ui, 500);
delay_box.set_value(&ui, "500");
// We know that ui.main() will wait until the UI is dead, so these are safe.
let sb = RefMut::new(&mut delay_slider);
let bb = RefMut::new(&mut delay_box);
let uib = Ref::new(&ui);
let uib1 = uib.clone();
delay_box.on_changed(&ui, move |val| {
sb.get().set_value(
uib.get(),
u16::from_str_radix(val.as_str(), 10).unwrap_or(256) as i32,
);
});
delay_slider.on_changed(&ui, move |val| {
bb.get().set_value(uib1.get(), val.to_string().as_str());
});
delay.set_padded(&ui, true);
delay.append(&ui, delay_slider, LayoutStrategy::Compact);
delay.append(&ui, delay_box, LayoutStrategy::Compact);
vbox.append(
&ui,
wrap(
&ui,
"Delay in µs: (higher = more reliable, lower = faster)",
delay,
),
LayoutStrategy::Compact,
);
let mut speed = VerticalBox::new(&ui);
let mut speed_slider = Slider::new(&ui, 100, 3_000);
let mut speed_slider = Slider::new(&ui, 100, 10_000);
let speedb = Ref::new(&speed_slider);
let mut speed_box = Entry::new(&ui);
speed_slider.set_value(&ui, 256);
@ -216,10 +183,6 @@ pub fn gui() -> Result<(), iui::UIError> {
args.push(a);
let a = pathb.get().clone();
args.push(a);
if modeb.get().selected(uib.get()) == 1 {
let a = delayb.get().value(uib.get()).to_string();
args.push(a);
}
let a = speedb.get().value(uib.get()).to_string();
args.push(a);
let a = skipb.get().value(uib.get());

View file

@ -1,4 +1,3 @@
#[cfg(feature = "gui")]
mod gui;
use std::{
@ -52,12 +51,12 @@ impl SafeReadWrite {
}
}
pub fn write_safe(&mut self, buf: &[u8], delay: u64) -> Result<(), Error> {
self.write_flush_safe(buf, false, delay)
pub fn write_safe(&mut self, buf: &[u8]) -> Result<(), Error> {
self.write_flush_safe(buf, false)
}
pub fn write_flush_safe(&mut self, buf: &[u8], flush: bool, delay: u64) -> Result<(), Error> {
self.internal_write_safe(buf, Write, flush, false, delay)
pub fn write_flush_safe(&mut self, buf: &[u8], flush: bool) -> Result<(), Error> {
self.internal_write_safe(buf, Write, flush, false)
}
pub fn read_safe(&mut self, buf: &[u8]) -> Result<(Vec<u8>, usize), Error> {
@ -129,7 +128,7 @@ impl SafeReadWrite {
}
pub fn end(mut self) -> UdpSocket {
let _ = self.internal_write_safe(&mut [], End, true, true, 3000);
let _ = self.internal_write_safe(&mut [], End, true, true);
self.socket
}
@ -140,7 +139,6 @@ impl SafeReadWrite {
packet: SafeReadWritePacket,
flush: bool,
exit_on_lost: bool,
delay: u64,
) -> Result<(), Error> {
if buf.len() > 0xfffc {
panic!(
@ -170,7 +168,6 @@ impl SafeReadWrite {
continue;
}
}
thread::sleep(Duration::from_micros(delay));
self.last_transmitted.insert(idn, vbuf);
break;
}
@ -189,17 +186,7 @@ impl SafeReadWrite {
}
let mut is_catching_up = false;
loop {
match (
if !wait {
self.socket.set_nonblocking(true).unwrap()
} else {
()
},
self.socket.recv(&mut buf).ok(),
self.socket.set_nonblocking(false).unwrap(),
)
.1
{
match self.socket.recv(&mut buf).ok() {
Some(x) => {
if x != 3 {
continue;
@ -218,38 +205,33 @@ impl SafeReadWrite {
}
if buf[2] == ResendRequest as u8 {
let mut n = u16::from_be_bytes([buf[0], buf[1]]);
thread::sleep(Duration::from_millis(100));
while let Some(_) = self.socket.recv(&mut buf).ok() {}
if !is_catching_up && !env::var("QFT_HIDE_DROPS").is_ok() {
println!("\r\x1b[KA packet dropped: {}", &n);
}
if !is_catching_up {
wait = true;
is_catching_up = true;
while n <= idn && !(idn == 0xffff && n == 0) {
let buf = self.last_transmitted.get(&n);
if let Some(buf) = buf {
loop {
// resend until success
match self.socket.send(&buf.as_slice()) {
Ok(x) => {
if x != buf.len() {
continue;
}
}
Err(_) => {
wait = true;
is_catching_up = true;
while n <= idn && !(idn == 0xffff && n == 0) {
let buf = self.last_transmitted.get(&n);
if let Some(buf) = buf {
loop {
// resend until success
match self.socket.send(&buf.as_slice()) {
Ok(x) => {
if x != buf.len() {
continue;
}
};
thread::sleep(Duration::from_millis(4));
break;
}
} else {
}
Err(_) => {
continue;
}
};
break;
}
// do NOT remove from last_transmitted yet, wait for Ack to do that.
n += 1;
} else {
break;
}
// do NOT remove from last_transmitted yet, wait for Ack to do that.
n += 1;
}
}
}
@ -271,7 +253,6 @@ impl SafeReadWrite {
continue;
}
}
thread::sleep(Duration::from_millis(4));
break;
}
start = unix_millis();
@ -298,13 +279,10 @@ fn main() {
panic!("no args");
}
if args.len() == 1 {
#[cfg(feature = "gui")]
match gui::gui() {
Ok(_) => (),
Err(_) => print_args(&args),
}
#[cfg(not(feature = "gui"))]
print_args(&args)
}
match args
.get(1)
@ -314,10 +292,7 @@ fn main() {
"helper" => helper(&args),
"sender" => sender(&args, |_| {}),
"receiver" => receiver(&args, |_| {}),
#[cfg(feature = "gui")]
"gui" => gui::gui().expect("can't use gui"),
#[cfg(not(feature = "gui"))]
"gui" => println!("Feature 'gui' was not enabled during compilation. GUI not available."),
"version" => println!("QFT version: {}", env!("CARGO_PKG_VERSION")),
_ => print_args(&args),
}
@ -393,18 +368,13 @@ pub fn helper(args: &Vec<String>) {
pub fn sender<F: Fn(f32)>(args: &Vec<String>, on_progress: F) {
let connection = holepunch(args);
let dly = args
.get(5)
.map(|s| u64::from_str_radix(s, 10))
.unwrap_or(Ok(500))
.expect("bad delay operand");
let br = args
.get(6)
.get(5)
.map(|s| u32::from_str_radix(s, 10))
.unwrap_or(Ok(256))
.expect("bad bitrate argument");
let begin = args
.get(7)
.get(6)
.map(|s| u64::from_str_radix(s, 10))
.unwrap_or(Ok(0))
.expect("bad begin operand");
@ -427,7 +397,7 @@ pub fn sender<F: Fn(f32)>(args: &Vec<String>, on_progress: F) {
let mut bytes_sent: u64 = 0;
let mut last_update = unix_millis();
let len = file.metadata().expect("bad metadata").len();
sc.write_safe(&len.to_be_bytes(), 3000)
sc.write_safe(&len.to_be_bytes())
.expect("unable to send file length");
println!("Length: {}", &len);
let mut time = unix_millis();
@ -440,17 +410,14 @@ pub fn sender<F: Fn(f32)>(args: &Vec<String>, on_progress: F) {
return;
}
sc.write_safe(&buf[..read], dly).expect("send error");
sc.write_safe(&buf[..read]).expect("send error");
bytes_sent += read as u64;
if (bytes_sent % (br * 20) as u64) < (br as u64) {
let elapsed = unix_millis() - time;
let elapsed = if elapsed == 0 { 1 } else { elapsed };
print!(
"\r\x1b[KSent {} bytes; Speed: {} kb/s",
bytes_sent,
br as usize * 20 / elapsed as usize
);
print!("\r\x1b[KSent {} bytes; Speed: {} kb/s",
bytes_sent, br as usize * 20 / elapsed as usize );
stdout().flush().unwrap();
time = unix_millis();
}
@ -503,7 +470,7 @@ pub fn receiver<F: Fn(f32)>(args: &Vec<String>, on_progress: F) {
let len = u64::from_be_bytes([
len[0], len[1], len[2], len[3], len[4], len[5], len[6], len[7],
]);
let _ = file.set_len(len);
file.set_len(len).expect("unable to set file length");
println!("Length: {}", &len);
let mut time = unix_millis();
loop {
@ -522,11 +489,8 @@ pub fn receiver<F: Fn(f32)>(args: &Vec<String>, on_progress: F) {
let elapsed = unix_millis() - time;
let elapsed = if elapsed == 0 { 1 } else { elapsed };
print!(
"\r\x1b[KReceived {} bytes; Speed: {} kb/s",
bytes_received,
br as usize * 20 / elapsed as usize
);
print!("\r\x1b[KReceived {} bytes; Speed: {} kb/s",
bytes_received, br as usize * 20 / elapsed as usize );
stdout().flush().unwrap();
time = unix_millis();
}
@ -630,7 +594,7 @@ fn print_args(args: &Vec<String>) {
println!(
"No arguments. Needed: \n\
| {} helper <bind-port>\n\
| {} sender <helper-address>:<helper-port> <phrase> <filename> [send-dly] [bitrate] [skip]\n\
| {} sender <helper-address>:<helper-port> <phrase> <filename> [bitrate] [skip]\n\
| {} receiver <helper-address>:<helper-port> <phrase> <filename> [bitrate] [skip]\n\
| {} gui\n\
| {} version\n",