fixed the file transfer

This commit is contained in:
WolverinDEV 2019-10-29 18:11:47 +01:00
parent f2a7c39abe
commit 0a1afb82ae
4 changed files with 37 additions and 14 deletions

View File

@ -106,7 +106,11 @@ declare module "teaclient_connection" {
callback_progress: (current: number, max: number) => any;
callback_failed: (message: string) => any;
start();
/**
* @return true if the connect method has been executed successfully
* false if the connect fails, callback_failed will be called with the exact reason
*/
start() : boolean;
}
export interface TransferOptions {

View File

@ -1,6 +1,7 @@
#include "FileTransferManager.h"
#include "FileTransferObject.h"
#include <misc/net.h>
#include <algorithm>
#include <fcntl.h>
#include <iostream>
@ -8,6 +9,7 @@
#ifndef WIN32
#include <unistd.h>
#include <misc/net.h>
#define IPPROTO_TCP (0)
#else
#include <ws2tcpip.h>
#define SOCK_NONBLOCK (0)
@ -56,14 +58,17 @@ bool Transfer::initialize(std::string &error) {
switch(this->remote_address.ss_family) {
case AF_INET:
((sockaddr_in*) &this->remote_address)->sin_port = htons(this->_options->remote_port);
break;
case AF_INET6:
((sockaddr_in6*) &this->remote_address)->sin6_port = htons(this->_options->remote_port);
break;
default:
log_warn(category::file_transfer, tr("getaddrinfo() returns unknown address family ({})"), this->remote_address.ss_family);
break;
}
log_info(category::file_transfer, tr("Setting remote port to {}"), this->_options->remote_port);
this->_socket = (int) ::socket(this->remote_address.ss_family, SOCK_STREAM | SOCK_NONBLOCK, 0);
log_info(category::file_transfer, tr("Setting remote port to {}"), net::to_string(this->remote_address));
this->_socket = (int) ::socket(this->remote_address.ss_family, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
if(this->_socket < 0) {
this->finalize();
error = tr("failed to spawn socket");
@ -106,13 +111,20 @@ bool Transfer::connect() {
0,
nullptr
);
fprintf(stdout, "Connect failed with code %d. Error: %ld/%S\n", result, error, s);
auto r = wcschr(s, L'\r');
if(r) *r = L'\0';
this->call_callback_failed(to_string(error) + "/" + std::string{s, s + wcslen(s)});
log_trace(category::file_transfer, tr("Failed to connect with code: {} => {}/{}"), result, error, std::string{s, s + wcslen(s)}.c_str());
LocalFree(s);
this->finalize();
return false;
}
#else
if(errno != EINPROGRESS) {
log_error(category::file_transfer, tr("Failed to connect with code: {} => {}/{}"), result, errno, strerror(errno));
this->call_callback_failed(to_string(errno) + "/" + strerror(errno));
this->finalize();
return false;
}
@ -709,11 +721,14 @@ NAN_METHOD(JSTransfer::_start) {
}
NAN_METHOD(JSTransfer::start) {
if(!this->_transfer->connect()) {
Nan::ThrowError("failed to connect");
log_debug(category::file_transfer, tr("Failed to start file transfer. Error callback should be called!"));
info.GetReturnValue().Set(Nan::New<v8::Boolean>(false));
return;
}
log_info(category::file_transfer, tr("Connecting to {}:{}"), this->_transfer->options().remote_address, this->_transfer->options().remote_port);
info.GetReturnValue().Set(Nan::New<v8::Boolean>(true));
return;
}
NAN_METHOD(JSTransfer::_abort) {
@ -721,6 +736,7 @@ NAN_METHOD(JSTransfer::_abort) {
}
NAN_METHOD(JSTransfer::abort) {
//TODO!
Nan::ThrowError("Not implemented");
}
void JSTransfer::callback_finished(bool flag) {

View File

@ -189,10 +189,6 @@ TransferFileSource::TransferFileSource(std::string path, std::string name) : _pa
}
}
#ifdef WIN32
#define u8path path
#endif
uint64_t TransferFileSource::byte_length() const {
if(file_size.has_value())
return file_size.value();

View File

@ -4,15 +4,17 @@ module.paths.push("../../build/win32_64");
import * as fs from "fs";
import * as net from "net";
import * as os from "os";
import * as path from "path";
const original_require = require;
require = (module => original_require("/home/wolverindev/TeaSpeak-Client/client/native/build/linux_x64/" + module + ".node")) as any;
require = (module => original_require(path.join(__dirname, "..", "..", "..", "build", os.platform() + "_" + os.arch(), module + ".node"))) as any;
import * as handle from "teaclient_connection";
require = original_require;
const buffer_size = 24;
const start_server = async () => {
const server = net.createServer();
const server: net.Server = net.createServer();
await new Promise(resolve => server.listen(30303, "localhost", resolve));
server.on('connection', socket => {
@ -40,6 +42,10 @@ const start_server = async () => {
//console.log("[SERVER] Received data: %s", buffer.toString());
});
});
const address = server.address();
console.log("[SERVER] Listening on %o", address);
return typeof address === "string" ? address : address.address;
};
function str2ab(str) {
@ -53,13 +59,14 @@ function str2ab(str) {
start_server().catch(error => {
console.error("Failed to start FT server (%o)", error);
}).then(() => {
}).then(address => {
const target_buffer = new Uint8Array(buffer_size);
const destination = handle.ft.download_transfer_object_from_buffer(target_buffer.buffer);
//const source = handle.ft.upload_transfer_object_from_buffer(str2ab("Hello World"));
//console.log(source);
//const source = handle.ft.upload_transfer_object_from_file(__dirname, "test_upload.txt");
const source = handle.ft.upload_transfer_object_from_file("/home/wolverindev/Downloads", "xxx.iso");
//const source = handle.ft.upload_transfer_object_from_file("/home/wolverindev/Downloads", "xxx.iso");
const source = handle.ft.upload_transfer_object_from_file("C:\\Users\\WolverinDEV\\Downloads", "ütest.txt");
console.log(source);
const upload = true;
@ -71,7 +78,7 @@ start_server().catch(error => {
object: upload ? source : destination,
transfer_key: upload ? "ft_upload_data__" : "ft_download_data",
remote_address: "localhost",
remote_address: address,
remote_port: 30303
});