Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: c6f52469 by lovetox at 2021-03-19T21:29:56+01:00 App: Force GC before checking if object is finalized
- - - - - ad6f1ebc by lovetox at 2021-03-19T21:33:50+01:00 Refactor EntityTime
- - - - - 31076ffa by lovetox at 2021-03-19T21:37:19+01:00 Refactor ContactInfo
- - - - -
5 changed files:
- gajim/common/app.py - gajim/common/client.py - gajim/common/modules/entity_time.py - gajim/data/gui/contact_info.ui - gajim/gtk/contact_info.py
Changes:
===================================== gajim/common/app.py ===================================== @@ -702,11 +702,11 @@ def is_finalizer_ref(ref): return False
def check_finalized(): + gc.collect() tup = finalizer.peek() if tup is None: return
- gc.collect() logger.warning('%s not finalized', name) logger.warning('References:') for ref in gc.get_referrers(tup[0]):
===================================== gajim/common/client.py ===================================== @@ -439,6 +439,7 @@ def _finish_connect(self):
self.get_module('Bookmarks').request_bookmarks() self.get_module('SoftwareVersion').set_enabled(True) + self.get_module('EntityTime').set_enabled(True) self.get_module('LastActivity').set_enabled(True) self.get_module('Annotations').request_annotations() self.get_module('Blocking').get_blocking_list()
===================================== gajim/common/modules/entity_time.py ===================================== @@ -14,102 +14,31 @@
# XEP-0202: Entity Time
-import time - -import nbxmpp -from nbxmpp.namespaces import Namespace -from nbxmpp.structs import StanzaHandler -from nbxmpp.modules.date_and_time import parse_datetime -from nbxmpp.modules.date_and_time import create_tzinfo - from gajim.common import app -from gajim.common.nec import NetworkEvent from gajim.common.modules.base import BaseModule
class EntityTime(BaseModule): + + _nbxmpp_extends = 'EntityTime' + _nbxmpp_methods = [ + 'request_entity_time', + 'enable', + 'disable', + ] + def __init__(self, con): BaseModule.__init__(self, con)
- self.handlers = [ - StanzaHandler(name='iq', - callback=self._answer_request, - typ='get', - ns=Namespace.TIME_REVISED), - ] + self.handlers = []
- def request_entity_time(self, jid, resource): - if not app.account_is_available(self._account): + def set_enabled(self, enabled): + if not enabled: + self._nbxmpp('EntityTime').disable() return
- if resource: - jid += '/' + resource - iq = nbxmpp.Iq(to=jid, typ='get') - iq.addChild('time', namespace=Namespace.TIME_REVISED) - - self._log.info('Requested: %s', jid) - - self._con.connection.SendAndCallForResponse(iq, self._result_received) - - def _result_received(self, _nbxmpp_client, stanza): - time_info = None - if not nbxmpp.isResultNode(stanza): - self._log.info('Error: %s', stanza.getError()) - else: - time_info = self._extract_info(stanza) - - self._log.info('Received: %s %s', stanza.getFrom(), time_info) - - app.nec.push_incoming_event(NetworkEvent('time-result-received', - conn=self._con, - jid=stanza.getFrom(), - time_info=time_info)) - - def _extract_info(self, stanza): - time_ = stanza.getTag('time') - if not time_: - self._log.warning('No time node: %s', stanza) - return None - - tzo = time_.getTag('tzo').getData() - if not tzo: - self._log.warning('Wrong tzo node: %s', stanza) - return None - - remote_tz = create_tzinfo(tz_string=tzo) - if remote_tz is None: - self._log.warning('Wrong tzo node: %s', stanza) - return None - - utc_time = time_.getTag('utc').getData() - date_time = parse_datetime(utc_time, check_utc=True) - if date_time is None: - self._log.warning('Wrong timezone definition: %s %s', - utc_time, stanza.getFrom()) - return None - - date_time = date_time.astimezone(remote_tz) - return date_time.strftime('%c %Z') - - def _answer_request(self, _con, stanza, _properties): - self._log.info('%s asked for the time', stanza.getFrom()) if app.settings.get_account_setting(self._account, 'send_time_info'): - iq = stanza.buildReply('result') - time_ = iq.setTag('time', namespace=Namespace.TIME_REVISED) - formated_time = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()) - time_.setTagData('utc', formated_time) - isdst = time.localtime().tm_isdst - zone = -(time.timezone, time.altzone)[isdst] / 60.0 - tzo = (zone / 60, abs(zone % 60)) - time_.setTagData('tzo', '%+03d:%02d' % (tzo)) - self._log.info('Answer: %s %s', formated_time, '%+03d:%02d' % (tzo)) - else: - iq = stanza.buildReply('error') - err = nbxmpp.ErrorNode(nbxmpp.ERR_SERVICE_UNAVAILABLE) - iq.addChild(node=err) - self._log.info('Send service-unavailable') - self._con.connection.send(iq) - raise nbxmpp.NodeProcessed + self._nbxmpp('EntityTime').enable()
def get_instance(*args, **kwargs):
===================================== gajim/data/gui/contact_info.ui ===================================== @@ -490,16 +490,13 @@ <property name="model">groups_model</property> <property name="headers-visible">False</property> <child internal-child="selection"> - <object class="GtkTreeSelection"> - <signal name="changed" handler="_on_group_selection_changed" swapped="no"/> - </object> + <object class="GtkTreeSelection" id="tree_selection"/> </child> <child> <object class="GtkTreeViewColumn"> <child> - <object class="GtkCellRendererToggle"> + <object class="GtkCellRendererToggle" id="toggle_renderer"> <property name="xpad">12</property> - <signal name="toggled" handler="_on_group_toggled" swapped="no"/> </object> <attributes> <attribute name="active">0</attribute> @@ -512,10 +509,9 @@ <property name="title" translatable="yes">column</property> <property name="sort-column-id">1</property> <child> - <object class="GtkCellRendererText"> + <object class="GtkCellRendererText" id="text_renderer"> <property name="height">42</property> <property name="editable">True</property> - <signal name="edited" handler="_on_group_name_edited" swapped="no"/> </object> <attributes> <attribute name="text">1</attribute>
===================================== gajim/gtk/contact_info.py ===================================== @@ -38,6 +38,7 @@ from .dialogs import DialogButton from .sidebar_switcher import SideBarSwitcher from .util import get_builder +from .util import connect_destroy from .vcard_grid import VCardGrid
log = logging.getLogger('gajim.gui.contact_info') @@ -92,14 +93,17 @@ def __init__(self, account, contact, page=None, anonymous=False): self._fill_settings_page() self._fill_groups_page()
+ self._tasks = [] + # pylint: disable=line-too-long self.register_events([ - ('time-result-received', ged.GUI1, self._set_entity_time), ('subscribed-presence-received', ged.GUI1, self._on_subscribed_presence_received), ('unsubscribed-presence-received', ged.GUI1, self._on_unsubscribed_presence_received), ]) # pylint: enable=line-too-long
+ self._load_avatar() + self._ui.contact_name_label.set_text(contact.name) if contact.is_pm_contact: self._ui.role_label.set_text(get_uf_role(contact.role)) @@ -131,6 +135,16 @@ def __init__(self, account, contact, page=None, anonymous=False): self.connect('key-press-event', self._on_key_press) self.connect('destroy', self._on_destroy)
+ connect_destroy(self._ui.tree_selection, + 'changed', + self._on_group_selection_changed) + connect_destroy(self._ui.toggle_renderer, + 'toggled', + self._on_group_toggled) + connect_destroy(self._ui.text_renderer, + 'edited', + self._on_group_name_edited) + self.add(self._ui.main_grid) self.show_all()
@@ -145,6 +159,10 @@ def _on_stack_child_changed(self, *args): self._ui.header_revealer.set_reveal_child(True)
def _on_destroy(self, _widget): + for task in self._tasks: + task.cancel() + self._tasks.clear() + if not self.contact.is_pm_contact: self._save_annotation()
@@ -152,7 +170,7 @@ def _on_destroy(self, _widget): GLib.source_remove(self._update_timeout_id)
self.unregister_events() - app.cancel_tasks(self) + app.check_finalize(self)
def _save_annotation(self): buffer_ = self._ui.textview_annotation.get_buffer() @@ -183,7 +201,6 @@ def _on_vcard_received(self, task): vcard = VCard()
self._vcard_grid.set_vcard(vcard) - self._load_avatar()
def _load_avatar(self): scale = self.get_scale_factor() @@ -210,16 +227,21 @@ def _query_device(self, contact): } self._rebuild_devices_grid()
- self._client.get_module('SoftwareVersion').request_software_version( + task = self._client.get_module('SoftwareVersion').request_software_version( contact.jid, callback=self._set_os_info, user_data=contact) - self._client.get_module('EntityTime').request_entity_time( - str(contact.jid.bare), contact.jid.resource) + self._tasks.append(task) + + task = self._client.get_module('EntityTime').request_entity_time( + contact.jid, callback=self._set_entity_time, user_data=contact) + self._tasks.append(task)
def _set_os_info(self, task): + self._tasks.remove(task) + try: result = task.finish() - except StanzaError as err: - log.info('Could not retrieve software version: %s', err) + except Exception as err: + log.warning('Could not retrieve software version: %s', err) return
contact = task.get_user_data() @@ -230,19 +252,19 @@ def _set_os_info(self, task): self._received_devices.add(contact.jid.resource) self._rebuild_devices_grid()
- def _set_entity_time(self, event): - if event.conn.name != self.account: + def _set_entity_time(self, task): + self._tasks.remove(task) + + try: + entity_time = task.finish() + except Exception as err: + log.warning('Could not retrieve entity time: %s', err) return
- if self.contact.is_pm_contact: - if event.jid != self.contact.jid: - return - else: - if event.jid.bare != self.contact.jid: - return + contact = task.get_user_data()
- self._devices[event.jid.resource]['time'] = event.time_info - self._received_times.add(event.jid.resource) + self._devices[contact.jid.resource]['time'] = entity_time + self._received_times.add(contact.jid.resource) self._rebuild_devices_grid()
def _rebuild_devices_grid(self):
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/c10f473ff146c5027476795376a51a7f...