quick_frontend(chat): better handling of cached signals when initialising widget

This commit is contained in:
Goffi 2016-07-24 18:02:34 +02:00
commit 60c8f2fc3d
2 changed files with 10 additions and 5 deletions

View file

@ -155,7 +155,7 @@ class QuickChat(quick_widgets.QuickWidget):
quick_widgets.QuickWidget.__init__(self, host, target, profiles=profiles)
self._locked = True # True when we are waiting for history/search
# messageNew signals are cached when locked
self._cache = []
self._cache = OrderedDict()
assert type_ in (C.CHAT_ONE2ONE, C.CHAT_GROUP)
self.current_target = target
self.type = type_
@ -288,6 +288,7 @@ class QuickChat(quick_widgets.QuickWidget):
@param profile (str): %(doc_profile)s
"""
self._locked = True
self._cache = OrderedDict()
self.messages.clear()
self.historyPrint(size, filters, profile)
@ -298,8 +299,9 @@ class QuickChat(quick_widgets.QuickWidget):
the focus after the history is printed
"""
self._locked = False
for data in self._cache:
for data in self._cache.itervalues():
self.messageNew(*data)
del self._cache
def historyPrint(self, size=C.HISTORY_LIMIT_DEFAULT, filters=None, profile='@NONE@'):
"""Print the current history
@ -330,6 +332,10 @@ class QuickChat(quick_widgets.QuickWidget):
# previous_day = message_day
for data in history:
uid, timestamp, from_jid, to_jid, message, subject, type_, extra = data
# cached messages may already be in history
# so we check it to avoid duplicates, they'll be added later
if uid in self._cache:
continue
from_jid = jid.JID(from_jid)
to_jid = jid.JID(to_jid)
# if ((self.type == C.CHAT_GROUP and type_ != C.MESS_TYPE_GROUPCHAT) or
@ -345,9 +351,8 @@ class QuickChat(quick_widgets.QuickWidget):
self.host.bridge.historyGet(unicode(self.host.profiles[profile].whoami.bare), unicode(target), size, True, filters, profile, callback=_historyGetCb, errback=_historyGetEb)
def messageNew(self, uid, timestamp, from_jid, to_jid, msg, subject, type_, extra, profile):
log.debug(u"messageNew ==> {}".format((uid, timestamp, from_jid, to_jid, msg, subject, type_, extra, profile)))
if self._locked:
self._cache.append(uid, timestamp, from_jid, to_jid, msg, subject, type_, extra, profile)
self._cache[uid] = (uid, timestamp, from_jid, to_jid, msg, subject, type_, extra, profile)
return
if self.type == C.CHAT_GROUP:
if to_jid.resource and type_ != C.MESS_TYPE_GROUPCHAT:

View file

@ -457,7 +457,7 @@ doc_param_0=to_jid: JID of the recipient
doc_param_1=message: body of the message:
key is the language of the body, use '' when unknown
doc_param_2=subject: Subject of the message
key is the language of the subkect, use '' when unknown
key is the language of the subject, use '' when unknown
doc_param_3=mess_type: Type of the message (cf RFC 6121 §5.2.2) or "auto" for automatic type detection
doc_param_4=extra: optional data that can be used by a plugin to build more specific messages
doc_param_5=%(doc_profile_key)s