fixed the file transfer
This commit is contained in:
parent
f2a7c39abe
commit
0a1afb82ae
6
native/serverconnection/exports/exports.d.ts
vendored
6
native/serverconnection/exports/exports.d.ts
vendored
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user