Skip to content

Commit

Permalink
VENOM-302: Dummy file transfers working
Browse files Browse the repository at this point in the history
* Small changes in settingswidget
  • Loading branch information
naxuroqa committed Apr 8, 2018
1 parent 0e7828d commit 5620826
Show file tree
Hide file tree
Showing 9 changed files with 303 additions and 49 deletions.
6 changes: 2 additions & 4 deletions src/core/ObservableList.vala
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,12 @@ namespace Venom {
public signal void removed(T item, uint index);

private GLib.List<T> list;
public ObservableList() {
}

public void set_list(owned GLib.List<T> list) {
this.list = (owned) list;
}

public void append(T item) {
public void append(owned T item) {
var idx = list.length();
list.append(item);
added(item, idx);
Expand All @@ -51,7 +49,7 @@ namespace Venom {
public uint index(T item) {
return list.index(item);
}
public T nth_data(uint index) {
public unowned T nth_data(uint index) {
return list.nth_data(index);
}
}
Expand Down
9 changes: 8 additions & 1 deletion src/db/SqliteSettingsDatabase.vala
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
namespace Venom {
public class SqliteSettingsDatabase : ISettingsDatabase, Object {
public bool enable_dark_theme { get; set; default = false; }
public bool enable_animations { get; set; default = true; }
public bool enable_logging { get; set; default = false; }
public bool enable_urgency_notification { get; set; default = true; }
public bool enable_tray { get; set; default = false; }
Expand All @@ -38,6 +39,7 @@ namespace Venom {
CREATE TABLE IF NOT EXISTS Settings (
id INTEGER PRIMARY KEY NOT NULL DEFAULT 0,
darktheme INTEGER NOT NULL,
animations INTEGER NOT NULL,
logging INTEGER NOT NULL,
urgencynotification INTEGER NOT NULL,
tray INTEGER NOT NULL,
Expand All @@ -55,6 +57,7 @@ namespace Venom {
private enum SettingsColumn {
ID,
DARKTHEME,
ANIMATIONS,
LOGGING,
URGENCYNOTIFICATIONS,
TRAY,
Expand All @@ -70,6 +73,7 @@ namespace Venom {

private const string TABLE_ID = "$ID";
private const string TABLE_DARKTHEME = "$DARKTHEME";
private const string TABLE_ANIMATIONS = "$ANIMATIONS";
private const string TABLE_LOGGING = "$LOGGING";
private const string TABLE_URGENCYNOTIFICATIONS = "$URGENCYNOTIFICATIONS";
private const string TABLE_TRAY = "$TRAY";
Expand All @@ -83,9 +87,10 @@ namespace Venom {
private const string TABLE_CUSTOM_PROXY_PORT = "$CUSTOMPROXYPORT";

private static string STATEMENT_INSERT_SETTINGS =
"INSERT OR REPLACE INTO Settings (id, darktheme, logging, urgencynotification, tray, notify, infinitelog, sendtyping, daystolog, enableproxy, enablecustomproxy, customproxyhost, customproxyport)"
"INSERT OR REPLACE INTO Settings (id, darktheme, animations, logging, urgencynotification, tray, notify, infinitelog, sendtyping, daystolog, enableproxy, enablecustomproxy, customproxyhost, customproxyport)"
+ " VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);".printf(TABLE_ID,
TABLE_DARKTHEME,
TABLE_ANIMATIONS,
TABLE_LOGGING,
TABLE_URGENCYNOTIFICATIONS,
TABLE_TRAY,
Expand Down Expand Up @@ -133,6 +138,7 @@ namespace Venom {
try {
if (selectStatement.step() == DatabaseResult.ROW) {
enable_dark_theme = selectStatement.column_bool(SettingsColumn.DARKTHEME);
enable_animations = selectStatement.column_bool(SettingsColumn.ANIMATIONS);
enable_logging = selectStatement.column_bool(SettingsColumn.LOGGING);
enable_urgency_notification = selectStatement.column_bool(SettingsColumn.URGENCYNOTIFICATIONS);
enable_tray = selectStatement.column_bool(SettingsColumn.TRAY);
Expand All @@ -159,6 +165,7 @@ namespace Venom {
insertStatement.builder()
.bind_int( TABLE_ID, 0)
.bind_bool(TABLE_DARKTHEME, enable_dark_theme)
.bind_bool(TABLE_ANIMATIONS, enable_animations)
.bind_bool(TABLE_LOGGING, enable_logging)
.bind_bool(TABLE_URGENCYNOTIFICATIONS, enable_urgency_notification)
.bind_bool(TABLE_TRAY, enable_tray)
Expand Down
4 changes: 4 additions & 0 deletions src/tox/DhtNode.vala
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,9 @@ namespace Venom {
this.maintainer = maintainer;
this.location = location;
}

~DhtNode() {
stdout.printf("~DhtNode()\n");
}
}
}
84 changes: 54 additions & 30 deletions src/tox/ToxAdapterFiletransferListener.vala
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ namespace Venom {
private NotificationListener notification_listener;

private unowned GLib.HashTable<uint32, IContact> friends;
private GLib.HashTable<IContact, GLib.HashTable<uint32, FileTransfer> > filetransfers;
private GLib.HashTable<uint32, GLib.HashTable<uint32, FileTransfer> > file_transfers;

private ObservableList<FileTransfer> transfers;

Expand All @@ -38,7 +38,7 @@ namespace Venom {
this.notification_listener = notification_listener;
this.transfers = transfers;

filetransfers = new GLib.HashTable<IContact, GLib.HashTable<uint32, FileTransfer> >(null, null);
file_transfers = new GLib.HashTable<uint32, GLib.HashTable<uint32, FileTransfer> >(null, null);
}

~ToxAdapterFiletransferListenerImpl() {
Expand All @@ -47,7 +47,7 @@ namespace Venom {

public void attach_to_session(ToxSession session) {
this.session = session;
session.set_filetransfer_listener(this);
session.set_file_transfer_listener(this);
friends = session.get_friends();
}

Expand Down Expand Up @@ -78,15 +78,37 @@ namespace Venom {
transfers.remove(transfer);
}

public virtual void on_file_recv_control(uint32 friend_number, uint32 file_number, ToxCore.FileControl control) {
logger.d("on_file_recv_control");
var file_transfer = get_file_transfer(friend_number, file_number);
var state = file_transfer.get_state();
switch (control) {
case ToxCore.FileControl.CANCEL:
set_file_transfer(friend_number, file_number, null);
file_transfer.set_state(FileTransferState.CANCEL);
break;
case ToxCore.FileControl.PAUSE:
//FIXME handle this somehow
//file_transfer.set_state(FileTransferState.PAUSED);
break;
case ToxCore.FileControl.RESUME:
if (state == FileTransferState.INIT) {
file_transfer.set_state(FileTransferState.RUNNING);
}
break;
}
}

public virtual void on_file_recv_data(uint32 friend_number, uint32 file_number, uint64 file_size, string filename) {
logger.d("on_file_recv_data");

var contact = friends.@get(friend_number);
var name = contact.get_name_string();
try {
// session.file_control(friend_number, file_number, ToxCore.FileControl.RESUME);
// logger.d("file_control resume sent");
var contact = friends.@get(friend_number);
var transfer = new FileTransferImpl.File(logger, friend_number, file_number, file_size, "New file from \"%s\"".printf(contact.get_name_string()));
set_filetransfer(friend_number, file_number, transfer);
var transfer = new FileTransferImpl.File(logger, friend_number, file_number, file_size, @"New file from \"$name\"");
set_file_transfer(friend_number, file_number, transfer);
transfers.append(transfer);

} catch (Error e) {
Expand All @@ -99,51 +121,53 @@ namespace Venom {
logger.d(@"on_file_recv_avatar $friend_number:$file_number");
if (file_size > MAX_AVATAR_SIZE) {
logger.i("avatar > MAX_AVATAR_SIZE, dropping transfer request");
drop_file_recv_avatar(friend_number, file_number);
try {
session.file_control(friend_number, file_number, ToxCore.FileControl.CANCEL);
} catch (Error e) {
logger.e("dropping transfer request failed: " + e.message);
}
return;
}
var contact = friends.@get(friend_number);
var name = contact.get_name_string();

try {
//session.file_control(friend_number, file_number, ToxCore.FileControl.RESUME);
var contact = friends.@get(friend_number);
var transfer = new FileTransferImpl.Avatar(logger, friend_number, file_number, file_size, "New avatar from \"%s\"".printf(contact.get_name_string()));
//transfer.set_state(FileTransferState.RUNNING);
set_filetransfer(friend_number, file_number, transfer);
session.file_control(friend_number, file_number, ToxCore.FileControl.RESUME);
var transfer = new FileTransferImpl.Avatar(logger, friend_number, file_number, file_size, @"New avatar from \"$name\"");
transfer.set_state(FileTransferState.RUNNING);
set_file_transfer(friend_number, file_number, transfer);
transfers.append(transfer);

//logger.d("file_control resume sent");
} catch (Error e) {
logger.e("file_control failed: " + e.message);
return;
}
}

private void drop_file_recv_avatar(uint32 friend_number, uint32 file_number) {
try {
session.file_control(friend_number, file_number, ToxCore.FileControl.CANCEL);
} catch (Error e) {
logger.e("dropping transfer request failed: " + e.message);
private FileTransfer ? get_file_transfer(uint32 friend_number, uint32 file_number) {
var friend_transfers = file_transfers.@get(friend_number);
if (friend_transfers == null) {
logger.e("on_file_recv_chunk no transfer found for contact");
return null;
}
return friend_transfers.@get(file_number);
}

private void set_filetransfer(uint32 friend_number, uint32 file_number, FileTransfer transfer) {
var contact = friends.@get(friend_number);
var friend_transfers = init_friend_transfers(contact);
private void set_file_transfer(uint32 friend_number, uint32 file_number, FileTransfer? transfer) {
var friend_transfers = init_friend_transfers(friend_number);
friend_transfers.@set(file_number, transfer);
}

private HashTable<uint32, FileTransfer> init_friend_transfers(IContact contact) {
var friend_transfers = filetransfers.@get(contact);
private HashTable<uint32, FileTransfer> init_friend_transfers(uint32 friend_number) {
var friend_transfers = file_transfers.@get(friend_number);
if (friend_transfers == null) {
friend_transfers = new GLib.HashTable<uint32, FileTransfer>(null, null);
filetransfers.@set(contact, friend_transfers);
file_transfers.@set(friend_number, friend_transfers);
}
return friend_transfers;
}

public virtual void on_file_recv_chunk(uint32 friend_number, uint32 file_number, uint64 position, uint8[] data) {
var contact = friends.@get(friend_number);
var friend_transfers = filetransfers.@get(contact);
var friend_transfers = file_transfers.@get(friend_number);
if (friend_transfers == null) {
logger.e("on_file_recv_chunk no transfer found for contact");
return;
Expand All @@ -161,14 +185,14 @@ namespace Venom {
return;
}

var c = contact as Contact;
var contact = friends.@get(friend_number) as Contact;
try {
friend_transfers.remove(file_number);
unowned uint8[] buf = transfer.get_file_data();
var file = File.new_for_path(@"avatar-$(friend_number).png");
file.replace_contents(buf, null, false, FileCreateFlags.NONE, null, null);
c.tox_image = new Gdk.Pixbuf.from_file_at_scale(file.get_path(), 44, 44, true);
c.changed();
contact.tox_image = new Gdk.Pixbuf.from_file_at_scale(file.get_path(), 44, 44, true);
contact.changed();
} catch (Error e) {
logger.e("set image failed: " + e.message);
}
Expand Down
25 changes: 17 additions & 8 deletions src/tox/ToxSession.vala
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ namespace Venom {

public interface ToxSession : GLib.Object {
public abstract void set_session_listener(ToxAdapterListener listener);
public abstract void set_filetransfer_listener(ToxAdapterFiletransferListener listener);
public abstract void set_file_transfer_listener(ToxAdapterFiletransferListener listener);
public abstract void set_friend_listener(ToxAdapterFriendListener listener);
public abstract void set_conference_listener(ToxAdapterConferenceListener listener);

Expand Down Expand Up @@ -102,6 +102,7 @@ namespace Venom {
public abstract void on_file_recv_avatar(uint32 friend_number, uint32 file_number, uint64 file_size);

public abstract void on_file_recv_chunk(uint32 friend_number, uint32 file_number, uint64 position, uint8[] data);
public abstract void on_file_recv_control(uint32 friend_number, uint32 file_number, FileControl control);
}

public class ToxSessionImpl : GLib.Object, ToxSession {
Expand All @@ -118,7 +119,7 @@ namespace Venom {
private ToxAdapterListener listener;
private ToxAdapterFriendListener friend_listener;
private ToxAdapterConferenceListener conference_listener;
private ToxAdapterFiletransferListener filetransfer_listener;
private ToxAdapterFiletransferListener file_transfer_listener;
private ToxSessionIO iohandler;
private GLib.HashTable<uint32, IContact> friends;

Expand Down Expand Up @@ -179,6 +180,7 @@ namespace Venom {

handle.callback_file_recv(on_file_recv_cb);
handle.callback_file_recv_chunk(on_file_recv_chunk_cb);
handle.callback_file_recv_control(on_file_recv_control_cb);

init_dht_nodes();
sessionThread = new ToxSessionThreadImpl(this, logger, dht_nodes);
Expand Down Expand Up @@ -223,8 +225,8 @@ namespace Venom {
this.listener = listener;
}

public virtual void set_filetransfer_listener(ToxAdapterFiletransferListener listener) {
this.filetransfer_listener = listener;
public virtual void set_file_transfer_listener(ToxAdapterFiletransferListener listener) {
this.file_transfer_listener = listener;
}

public virtual void set_friend_listener(ToxAdapterFriendListener listener) {
Expand Down Expand Up @@ -379,19 +381,26 @@ namespace Venom {
session.logger.d(@"on_file_recv_cb: $friend_number:$file_number ($kind_type_str) $kiB kiB");
switch (kind_type) {
case FileKind.DATA:
Idle.add(() => { session.filetransfer_listener.on_file_recv_data(friend_number, file_number, file_size, filename_str); return false; });
Idle.add(() => { session.file_transfer_listener.on_file_recv_data(friend_number, file_number, file_size, filename_str); return false; });
break;
case FileKind.AVATAR:
Idle.add(() => { session.filetransfer_listener.on_file_recv_avatar(friend_number, file_number, file_size); return false; });
Idle.add(() => { session.file_transfer_listener.on_file_recv_avatar(friend_number, file_number, file_size); return false; });
break;
}
}

private static void on_file_recv_chunk_cb(Tox self, uint32 friend_number, uint32 file_number, uint64 position, uint8[] data, void* user_data) {
var session = (ToxSessionImpl) user_data;
session.logger.d(@"on_file_recv_chunk_cb: $friend_number/$file_number $position");
session.logger.d(@"on_file_recv_chunk_cb: $friend_number:$file_number $position");
var data_copy = copy_data(data, data.length);
Idle.add(() => { session.filetransfer_listener.on_file_recv_chunk(friend_number, file_number, position, data_copy); return false; });
Idle.add(() => { session.file_transfer_listener.on_file_recv_chunk(friend_number, file_number, position, data_copy); return false; });
}

private static void on_file_recv_control_cb(Tox self, uint32 friend_number, uint32 file_number, FileControl control, void* user_data) {
var session = (ToxSessionImpl) user_data;
var control_str = control.to_string();
session.logger.d(@"on_file_recv_control_cb: $friend_number:$file_number $control_str");
Idle.add(() => { session.file_transfer_listener.on_file_recv_control(friend_number, file_number, control); return false; });
}

private static UserStatus from_connection_status(Connection connection_status) {
Expand Down

0 comments on commit 5620826

Please sign in to comment.