Skip to content

Commit

Permalink
VENOM-302: Refactor ToxSessionListener
Browse files Browse the repository at this point in the history
* Split ToxSessionListener in separate classes
  • Loading branch information
naxuroqa committed Apr 8, 2018
1 parent ddbf0ca commit 3a33368
Show file tree
Hide file tree
Showing 8 changed files with 356 additions and 167 deletions.
5 changes: 4 additions & 1 deletion src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,12 @@ venom_source = files(
'tox/JsonWebDhtNodeDatabase.vala',
'tox/MessageDatabase.vala',
'tox/SqliteDhtNodeDatabase.vala',
'tox/ToxAdapterConferenceListener.vala',
'tox/ToxAdapterFriendListener.vala',
'tox/ToxAdapterFiletransferListener.vala',
'tox/ToxSession.vala',
'tox/ToxSessionIO.vala',
'tox/ToxSessionListener.vala',
'tox/ToxAdapterListener.vala',
'tox/ToxSessionThread.vala',
'ui/AboutDialog.vala',
'ui/AddContactWidget.vala',
Expand Down
134 changes: 134 additions & 0 deletions src/tox/ToxAdapterConferenceListener.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* ToxAdapterConferenceListener.vala
*
* Copyright (C) 2018 Venom authors and contributors
*
* This file is part of Venom.
*
* Venom is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Venom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Venom. If not, see <http://www.gnu.org/licenses/>.
*/

namespace Venom {
public class ToxAdapterConferenceListenerImpl : ToxAdapterConferenceListener, ConferenceWidgetListener, ConferenceInfoWidgetListener, CreateGroupchatWidgetListener, GLib.Object {
private unowned ToxSession session;
private ILogger logger;
private Contacts contacts;
private NotificationListener notification_listener;
private GLib.HashTable<IContact, Conversation> conversations;

private GLib.HashTable<uint32, IContact> conferences;

public ToxAdapterConferenceListenerImpl(ILogger logger, Contacts contacts, GLib.HashTable<IContact, Conversation> conversations, NotificationListener notification_listener) {
logger.d("ToxAdapterConferenceListenerImpl created.");
this.logger = logger;
this.contacts = contacts;
this.conversations = conversations;
this.notification_listener = notification_listener;

conferences = new GLib.HashTable<uint32, IContact>(null, null);
}

~ToxAdapterConferenceListenerImpl() {
logger.d("ToxAdapterConferenceListenerImpl destroyed.");
}

public virtual void attach_to_session(ToxSession session) {
this.session = session;
session.set_conference_listener(this);
}

public virtual void on_remove_conference(IContact c) throws Error {
var contact = c as GroupchatContact;
session.conference_delete(contact.tox_conference_number);
}

public virtual void on_change_conference_title(IContact c, string title) throws Error {
var contact = c as GroupchatContact;
session.conference_set_title(contact.tox_conference_number, title);
}

public virtual void on_send_conference_message(IContact c, string message) throws Error {
var conference = c as GroupchatContact;
session.conference_send_message(conference.tox_conference_number, message);
}

public virtual void on_create_groupchat(string title, GroupchatType type) throws Error {
session.conference_new(title);
}

public virtual void on_conference_new(uint32 conference_number, string title) {
logger.d("on_conference_new");
var contact = new GroupchatContact(conference_number, title);
contacts.add_contact(this, contact);
conferences.@set(conference_number, contact);
conversations.@set(contact, new ConversationImpl(contact));
}

public virtual void on_conference_deleted(uint32 conference_number) {
logger.d("on_conference_deleted");
var contact = conferences.@get(conference_number);
contacts.remove_contact(this, contact);
conversations.remove(contact);
conferences.remove(conference_number);
}

public virtual void on_conference_title_changed(uint32 conference_number, uint32 peer_number, string title) {
var contact = conferences.@get(conference_number) as GroupchatContact;
contact.title = title;
contact.changed();
}

public virtual void on_conference_peer_joined(uint32 conference_number, uint32 peer_number) {
var contact = conferences.@get(conference_number) as GroupchatContact;
var peers = contact.get_peers();
peers.@set(peer_number, new GroupchatPeerImpl(peer_number));
contact.changed();
}

public virtual void on_conference_peer_exited(uint32 conference_number, uint32 peer_number) {
var contact = conferences.@get(conference_number) as GroupchatContact;
var peers = contact.get_peers();
peers.remove(peer_number);
contact.changed();
}

public virtual void on_conference_peer_renamed(uint32 conference_number, uint32 peer_number, bool is_self, uint8[] peer_public_key, string peer_name, bool peer_known) {
var contact = conferences.@get(conference_number) as GroupchatContact;
var peers = contact.get_peers();
var peer = peers.@get(peer_number);
peer.tox_public_key = Tools.bin_to_hexstring(peer_public_key);
peer.name = peer_name;
peer.known = peer_known;
contact.changed();
}

public virtual void on_conference_message(uint32 conference_number, uint32 peer_number, ToxCore.MessageType type, string message) {
logger.d("on_conference_message");
var contact = conferences.@get(conference_number) as GroupchatContact;
var conversation = conversations.@get(contact);
var msg = new GroupMessage.incoming(contact, peer_number, message);
notification_listener.on_unread_message(msg);
conversation.add_message(this, msg);
}

public virtual void on_conference_message_sent(uint32 conference_number, string message) {
logger.d("on_conference_message_sent");
var contact = conferences.@get(conference_number) as GroupchatContact;
var conversation = conversations.@get(contact);
var msg = new GroupMessage.outgoing(contact, message);
msg.received = true;
conversation.add_message(this, msg);
}
}
}
40 changes: 40 additions & 0 deletions src/tox/ToxAdapterFiletransferListener.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* ToxAdapterFiletransferListener.vala
*
* Copyright (C) 2018 Venom authors and contributors
*
* This file is part of Venom.
*
* Venom is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Venom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Venom. If not, see <http://www.gnu.org/licenses/>.
*/

namespace Venom {
public class ToxAdapterFiletransferListenerImpl : ToxAdapterFiletransferListener, GLib.Object {
private unowned ToxSession session;
private ILogger logger;
private NotificationListener notification_listener;

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

public ToxAdapterFiletransferListenerImpl(ILogger logger, NotificationListener notification_listener) {
logger.d("ToxAdapterFiletransferListenerImpl created.");
this.logger = logger;
this.notification_listener = notification_listener;
}

~ToxAdapterFiletransferListenerImpl() {
logger.d("ToxAdapterFiletransferListenerImpl destroyed.");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* ToxSessionListener.vala
* ToxAdapterFriendListener.vala
*
* Copyright (C) 2018 Venom authors and contributors
*
Expand All @@ -20,49 +20,40 @@
*/

namespace Venom {
public class ToxSessionListenerImpl : ToxSessionListener, AddContactWidgetListener, ConversationWidgetListener, ConferenceWidgetListener, FriendInfoWidgetListener, ConferenceInfoWidgetListener, CreateGroupchatWidgetListener, FriendRequestWidgetListener, GLib.Object {
public class ToxAdapterFriendListenerImpl : ToxAdapterFriendListener, AddContactWidgetListener, ConversationWidgetListener, FriendInfoWidgetListener, FriendRequestWidgetListener, GLib.Object {
private unowned ToxSession session;
private ILogger logger;
private UserInfo user_info;
private Contacts contacts;
private NotificationListener notification_listener;
private GLib.HashTable<IContact, Conversation> conversations;
private GLib.HashTable<uint32, Message> messages_waiting_for_rr;

private GLib.HashTable<uint32, IContact> friends;
private GLib.HashTable<uint32, IContact> conferences;
private unowned GLib.HashTable<uint32, IContact> friends;
private GLib.HashTable<string, IContact> friend_requests;

public bool show_typing { get; set; }

public ToxSessionListenerImpl(ILogger logger, UserInfo user_info, Contacts contacts, GLib.HashTable<IContact, Conversation> conversations, NotificationListener notification_listener) {
logger.d("ToxSessionListenerImpl created.");
public ToxAdapterFriendListenerImpl(ILogger logger, Contacts contacts, GLib.HashTable<IContact, Conversation> conversations, NotificationListener notification_listener) {
logger.d("ToxAdapterFriendListenerImpl created.");
this.logger = logger;
this.user_info = user_info;
this.contacts = contacts;
this.conversations = conversations;
this.notification_listener = notification_listener;

messages_waiting_for_rr = new GLib.HashTable<uint32, Message>(null, null);

friends = new GLib.HashTable<uint32, IContact>(null, null);
conferences = new GLib.HashTable<uint32, IContact>(null, null);
friend_requests = new GLib.HashTable<string, IContact>(str_hash, str_equal);

user_info.info_changed.connect(on_user_info_changed);
}

~ToxSessionListenerImpl() {
logger.d("ToxSessionListenerImpl destroyed.");
~ToxAdapterFriendListenerImpl() {
logger.d("ToxAdapterFriendListenerImpl destroyed.");
}

public virtual void attach_to_session(ToxSession session) {
this.session = session;
session.set_session_listener(this);
session.set_friend_listener(this);

user_info.set_tox_id(Tools.bin_to_hexstring(session.self_get_address()));
get_user_info();
user_info.info_changed(this);
friends = session.get_friends();

try {
session.self_get_friend_list_foreach((friend_number, friend_key) => {
Expand All @@ -73,36 +64,11 @@ namespace Venom {
}
}

private void get_user_info() {
user_info.set_name(session.self_get_name());
user_info.set_status_message(session.self_get_status_message());
}

private void on_user_info_changed(GLib.Object sender) {
if (sender == this) {
return;
}

logger.d("ToxSessionListenerImpl on_user_info_changed.");
session.self_set_user_name(user_info.get_name());
session.self_set_status_message(user_info.get_status_message());
}

public virtual void on_remove_friend(IContact c) throws Error {
var contact = c as Contact;
session.friend_delete(contact.tox_friend_number);
}

public virtual void on_remove_conference(IContact c) throws Error {
var contact = c as GroupchatContact;
session.conference_delete(contact.tox_conference_number);
}

public virtual void on_change_conference_title(IContact c, string title) throws Error {
var contact = c as GroupchatContact;
session.conference_set_title(contact.tox_conference_number, title);
}

public virtual void on_send_friend_request(string address, string message) throws Error {
var bin_address = Tools.hexstring_to_bin(address);
session.friend_add(bin_address, message);
Expand Down Expand Up @@ -135,20 +101,6 @@ namespace Venom {
session.self_set_typing(contact.tox_friend_number, typing);
}

public virtual void on_send_conference_message(IContact c, string message) throws Error {
var conference = c as GroupchatContact;
session.conference_send_message(conference.tox_conference_number, message);
}

public virtual void on_create_groupchat(string title, GroupchatType type) throws Error {
session.conference_new(title);
}

public virtual void on_self_status_changed(UserStatus status) {
user_info.set_user_status(status);
user_info.info_changed(this);
}

public virtual void on_friend_message(uint32 friend_number, string message_str) {
logger.d("on_friend_message");
var contact = friends.@get(friend_number);
Expand Down Expand Up @@ -243,77 +195,5 @@ namespace Venom {
conversation.add_message(this, msg);
messages_waiting_for_rr.@set(message_id, msg);
}

public virtual void on_conference_new(uint32 conference_number, string title) {
logger.d("on_conference_new");
var contact = new GroupchatContact(conference_number, title);
contacts.add_contact(this, contact);
conferences.@set(conference_number, contact);
conversations.@set(contact, new ConversationImpl(contact));
}

public virtual void on_conference_deleted(uint32 conference_number) {
logger.d("on_conference_deleted");
var contact = conferences.@get(conference_number);
contacts.remove_contact(this, contact);
conversations.remove(contact);
conferences.remove(conference_number);
}

public virtual void on_conference_title_changed(uint32 conference_number, uint32 peer_number, string title) {
var contact = conferences.@get(conference_number) as GroupchatContact;
contact.title = title;
contact.changed();
}

public virtual void on_conference_peer_joined(uint32 conference_number, uint32 peer_number) {
var contact = conferences.@get(conference_number) as GroupchatContact;
var peers = contact.get_peers();
peers.@set(peer_number, new GroupchatPeerImpl(peer_number));
contact.changed();
}

public virtual void on_conference_peer_exited(uint32 conference_number, uint32 peer_number) {
var contact = conferences.@get(conference_number) as GroupchatContact;
var peers = contact.get_peers();
peers.remove(peer_number);
contact.changed();
}

public virtual void on_conference_peer_renamed(uint32 conference_number, uint32 peer_number, bool is_self, uint8[] peer_public_key, string peer_name, bool peer_known) {
var contact = conferences.@get(conference_number) as GroupchatContact;
var peers = contact.get_peers();
var peer = peers.@get(peer_number);
peer.tox_public_key = Tools.bin_to_hexstring(peer_public_key);
peer.name = peer_name;
peer.known = peer_known;
contact.changed();
}

public virtual void on_conference_message(uint32 conference_number, uint32 peer_number, ToxCore.MessageType type, string message) {
logger.d("on_conference_message");
var contact = conferences.@get(conference_number) as GroupchatContact;
var conversation = conversations.@get(contact);
var msg = new GroupMessage.incoming(contact, peer_number, message);
notification_listener.on_unread_message(msg);
conversation.add_message(this, msg);
}

public virtual void on_conference_message_sent(uint32 conference_number, string message) {
logger.d("on_conference_message_sent");
var contact = conferences.@get(conference_number) as GroupchatContact;
var conversation = conversations.@get(contact);
var msg = new GroupMessage.outgoing(contact, message);
msg.received = true;
conversation.add_message(this, msg);
}

private void set_self_status(UserStatus status) {
user_info.set_user_status(status);
user_info.info_changed(this);
}
}
private errordomain LookupError {
GENERIC
}
}

0 comments on commit 3a33368

Please sign in to comment.