# HG changeset patch # User Goffi # Date 1473458073 -7200 # Node ID 748e539c5feb1b94531853e75abb00ff16821649 # Parent d443607632620015dea3999bea439ec24c20298e quick frontend (contat list/cache): workaround for avatar issue in MUC. Need to be reworked properly in the future (TODO) diff -r d44360763262 -r 748e539c5feb frontends/src/quick_frontend/quick_app.py --- a/frontends/src/quick_frontend/quick_app.py Fri Sep 09 23:54:33 2016 +0200 +++ b/frontends/src/quick_frontend/quick_app.py Fri Sep 09 23:54:33 2016 +0200 @@ -764,7 +764,10 @@ self.contact_lists[profile].setCache(entity, 'nick', value) self.callListeners('nick', entity, value, profile=profile) elif key == "avatar": - if value and entity in self.contact_lists[profile]: + if value: # and entity in self.contact_lists[profile]: + # FIXME: contact_list check is removed to work around 'avatar' issues + # (avatar can't be requested if we don't save them here) + # avatar need to be refactored properly in backend and here def gotFilename(filename): self.contact_lists[profile].setCache(entity, 'avatar', filename) self.callListeners('avatar', entity, filename, profile=profile) diff -r d44360763262 -r 748e539c5feb frontends/src/quick_frontend/quick_contact_list.py --- a/frontends/src/quick_frontend/quick_contact_list.py Fri Sep 09 23:54:33 2016 +0200 +++ b/frontends/src/quick_frontend/quick_contact_list.py Fri Sep 09 23:54:33 2016 +0200 @@ -207,13 +207,14 @@ def getCache(self, entity, name=None): """Return a cache value for a contact - @param entity(entity.entity): entity of the contact from who we want data (resource is used if given) + @param entity(jid.JID): entity of the contact from who we want data (resource is used if given) if a resource specific information is requested: - if no resource is given (bare jid), the main resource is used, according to priority - if resource is given, it is used @param name(unicode): name the data to get, or None to get everything @return: full cache if no name is given, or value of "name", or None """ + # FIXME: resource handling need to be reworked try: cache = self._cache[entity.bare] except KeyError: @@ -222,19 +223,33 @@ if name is None: return cache - try: - if name in ('status', C.PRESENCE_STATUSES, C.PRESENCE_PRIORITY, C.PRESENCE_SHOW): - # these data are related to the resource - if not entity.resource: + + if name in ('status', C.PRESENCE_STATUSES, C.PRESENCE_PRIORITY, C.PRESENCE_SHOW): + # these data are related to the resource + if not entity.resource: + try: main_resource = cache[C.CONTACT_MAIN_RESOURCE] - cache = cache[C.CONTACT_RESOURCES][main_resource] - else: - cache = cache[C.CONTACT_RESOURCES][entity.resource] + except KeyError: + # we ignore presence info if we don't have any resource in cache + # FIXME: to be checked + return + cache = cache[C.CONTACT_RESOURCES].setdefault(main_resource, {}) + else: + cache = cache[C.CONTACT_RESOURCES].setdefault(entity.resource, {}) - if name == 'status': # XXX: we get the first status for 'status' key - # TODO: manage main language for statuses - return cache[C.PRESENCE_STATUSES].get(C.PRESENCE_STATUSES_DEFAULT, '') + if name == 'status': # XXX: we get the first status for 'status' key + # TODO: manage main language for statuses + return cache[C.PRESENCE_STATUSES].get(C.PRESENCE_STATUSES_DEFAULT, '') + elif entity.resource: + # if we have a resource, we first check if the value is not available for the resource + # and we fallback to main cache if not found + try: + return cache[C.CONTACT_RESOURCES][entity.resource][name] + except KeyError: + pass + + try: return cache[name] except KeyError: return None @@ -373,6 +388,10 @@ # now the attributes we keep in cache for attribute, value in attributes.iteritems(): + if attribute == 'avatar' and entity.resource: + # FIXME: Q&D hack to workaround avatar issue. + # TODO: Need to refactor avatar handling in backend and here + cache[C.CONTACT_RESOURCES].setdefault(entity.resource, {})[attribute] = value cache[attribute] = value # we can update the display