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_progress: (current: number, max: number) => any;
callback_failed: (message: string) => 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 { export interface TransferOptions {

View File

@ -1,6 +1,7 @@
#include "FileTransferManager.h" #include "FileTransferManager.h"
#include "FileTransferObject.h" #include "FileTransferObject.h"
#include <misc/net.h>
#include <algorithm> #include <algorithm>
#include <fcntl.h> #include <fcntl.h>
#include <iostream> #include <iostream>
@ -8,6 +9,7 @@
#ifndef WIN32 #ifndef WIN32
#include <unistd.h> #include <unistd.h>
#include <misc/net.h> #include <misc/net.h>
#define IPPROTO_TCP (0)
#else #else
#include <ws2tcpip.h> #include <ws2tcpip.h>
#define SOCK_NONBLOCK (0) #define SOCK_NONBLOCK (0)
@ -56,14 +58,17 @@ bool Transfer::initialize(std::string &error) {
switch(this->remote_address.ss_family) { switch(this->remote_address.ss_family) {
case AF_INET: case AF_INET:
((sockaddr_in*) &this->remote_address)->sin_port = htons(this->_options->remote_port); ((sockaddr_in*) &this->remote_address)->sin_port = htons(this->_options->remote_port);
break;
case AF_INET6: case AF_INET6:
((sockaddr_in6*) &this->remote_address)->sin6_port = htons(this->_options->remote_port); ((sockaddr_in6*) &this->remote_address)->sin6_port = htons(this->_options->remote_port);
break;
default: default:
log_warn(category::file_transfer, tr("getaddrinfo() returns unknown address family ({})"), this->remote_address.ss_family);
break; break;
} }
log_info(category::file_transfer, tr("Setting remote port to {}"), this->_options->remote_port); 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, 0); this->_socket = (int) ::socket(this->remote_address.ss_family, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
if(this->_socket < 0) { if(this->_socket < 0) {
this->finalize(); this->finalize();
error = tr("failed to spawn socket"); error = tr("failed to spawn socket");
@ -106,13 +111,20 @@ bool Transfer::connect() {
0, 0,
nullptr 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); LocalFree(s);
this->finalize();
return false; return false;
} }
#else #else
if(errno != EINPROGRESS) { if(errno != EINPROGRESS) {
log_error(category::file_transfer, tr("Failed to connect with code: {} => {}/{}"), result, errno, strerror(errno)); 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(); this->finalize();
return false; return false;
} }
@ -709,11 +721,14 @@ NAN_METHOD(JSTransfer::_start) {
} }
NAN_METHOD(JSTransfer::start) { NAN_METHOD(JSTransfer::start) {
if(!this->_transfer->connect()) { 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; return;
} }
log_info(category::file_transfer, tr("Connecting to {}:{}"), this->_transfer->options().remote_address, this->_transfer->options().remote_port); 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) { NAN_METHOD(JSTransfer::_abort) {
@ -721,6 +736,7 @@ NAN_METHOD(JSTransfer::_abort) {
} }
NAN_METHOD(JSTransfer::abort) { NAN_METHOD(JSTransfer::abort) {
//TODO! //TODO!
Nan::ThrowError("Not implemented");
} }
void JSTransfer::callback_finished(bool flag) { 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 { uint64_t TransferFileSource::byte_length() const {
if(file_size.has_value()) if(file_size.has_value())
return file_size.value(); return file_size.value();

View File

@ -4,15 +4,17 @@ module.paths.push("../../build/win32_64");
import * as fs from "fs"; import * as fs from "fs";
import * as net from "net"; import * as net from "net";
import * as os from "os";
import * as path from "path";
const original_require = require; 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"; import * as handle from "teaclient_connection";
require = original_require; require = original_require;
const buffer_size = 24; const buffer_size = 24;
const start_server = async () => { const start_server = async () => {
const server = net.createServer(); const server: net.Server = net.createServer();
await new Promise(resolve => server.listen(30303, "localhost", resolve)); await new Promise(resolve => server.listen(30303, "localhost", resolve));
server.on('connection', socket => { server.on('connection', socket => {
@ -40,6 +42,10 @@ const start_server = async () => {
//console.log("[SERVER] Received data: %s", buffer.toString()); //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) { function str2ab(str) {
@ -53,13 +59,14 @@ function str2ab(str) {
start_server().catch(error => { start_server().catch(error => {
console.error("Failed to start FT server (%o)", error); console.error("Failed to start FT server (%o)", error);
}).then(() => { }).then(address => {
const target_buffer = new Uint8Array(buffer_size); const target_buffer = new Uint8Array(buffer_size);
const destination = handle.ft.download_transfer_object_from_buffer(target_buffer.buffer); const destination = handle.ft.download_transfer_object_from_buffer(target_buffer.buffer);
//const source = handle.ft.upload_transfer_object_from_buffer(str2ab("Hello World")); //const source = handle.ft.upload_transfer_object_from_buffer(str2ab("Hello World"));
//console.log(source); //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(__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); console.log(source);
const upload = true; const upload = true;
@ -71,7 +78,7 @@ start_server().catch(error => {
object: upload ? source : destination, object: upload ? source : destination,
transfer_key: upload ? "ft_upload_data__" : "ft_download_data", transfer_key: upload ? "ft_upload_data__" : "ft_download_data",
remote_address: "localhost", remote_address: address,
remote_port: 30303 remote_port: 30303
}); });