diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 8b24cccb9..1632d3875 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -96,6 +96,12 @@ def create_log_db(): jid_id INTEGER PRIMARY KEY UNIQUE, time INTEGER ); + + CREATE TABLE IF NOT EXISTS roster_entry( + account_jid_id INTEGER PRIMARY KEY, + jid_id INTEGER, + subscription INTEGER + ); ''' ) diff --git a/src/common/config.py b/src/common/config.py index 6796a83a2..f1ef7abe1 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -342,6 +342,7 @@ class Config: 'ignore_unknown_contacts': [ opt_bool, False ], 'send_os_info': [ opt_bool, True ], 'log_encrypted_sessions': [opt_bool, True, _('When negotiating an encrypted session, should Gajim assume you want your messages to be logged?')], + 'roster_version': [opt_str, ''], }, {}), 'statusmsg': ({ 'message': [ opt_str, '' ], diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 934b2f88a..5eca5bf1d 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1164,7 +1164,9 @@ class ConnectionVcard: if iq_obj.getErrorCode() not in ('403', '406', '404'): self.private_storage_supported = False # We can now continue connection by requesting the roster - self.connection.initRoster() + version = gajim.config.get_per('accounts', self.name, + 'roster_version') + self.connection.initRoster(version=version) elif self.awaiting_answers[id_][0] == PRIVACY_ARRIVED: if iq_obj.getType() != 'error': self.privacy_rules_supported = True diff --git a/src/common/optparser.py b/src/common/optparser.py index 975330518..b927fb079 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -671,4 +671,29 @@ class OptionsParser: gajim.config.set_per('soundevents', evt, 'path', path) gajim.config.set('version', '0.12.1.5') + def update_config_to_01216(self): + back = os.getcwd() + os.chdir(logger.LOG_DB_FOLDER) + con = sqlite.connect(logger.LOG_DB_FILE) + os.chdir(back) + cur = con.cursor() + try: + cur.executescript( + ''' + CREATE TABLE IF NOT EXISTS roster_entry( + account_jid_id INTEGER PRIMARY KEY, + jid_id INTEGER, + subscription INTEGER + ); + ''' + ) + con.commit() + except sqlite.OperationalError: + pass + con.close() + gajim.config.set('version', '0.12.1.6') + + + + # vim: se ts=3: diff --git a/src/common/xmpp/client_nb.py b/src/common/xmpp/client_nb.py index 554be2199..e24277824 100644 --- a/src/common/xmpp/client_nb.py +++ b/src/common/xmpp/client_nb.py @@ -503,10 +503,10 @@ class NonBlockingClient: self.NonBlockingBind.NonBlockingBind(self._Resource, self._on_sasl_auth) return True - def initRoster(self): + def initRoster(self, version=''): ''' Plug in the roster. ''' if not self.__dict__.has_key('NonBlockingRoster'): - roster_nb.NonBlockingRoster.get_instance().PlugIn(self) + roster_nb.NonBlockingRoster.get_instance(version=version).PlugIn(self) def getRoster(self, on_ready=None): ''' Return the Roster instance, previously plugging it in and diff --git a/src/common/xmpp/roster_nb.py b/src/common/xmpp/roster_nb.py index cd802b36b..7f257fefa 100644 --- a/src/common/xmpp/roster_nb.py +++ b/src/common/xmpp/roster_nb.py @@ -36,9 +36,10 @@ class NonBlockingRoster(PlugIn): You can also use mapping interface for access to the internal representation of contacts in roster. ''' - def __init__(self): + def __init__(self, version=''): ''' Init internal variables. ''' PlugIn.__init__(self) + self.version = version self._data = {} self.set=None self._exported_methods=[self.getRoster] @@ -48,7 +49,10 @@ class NonBlockingRoster(PlugIn): (or if the 'force' argument is set). ''' if self.set is None: self.set=0 elif not force: return - self._owner.send(Iq('get',NS_ROSTER)) + + iq = Iq('get',NS_ROSTER) + iq.setTagAttr('query', 'ver', self.version) + self._owner.send(iq) log.info('Roster requested from server') def RosterIqHandler(self,dis,stanza):