Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnaël Verrier <elghinn@free.fr>2009-06-23 21:29:25 +0400
committerAnaël Verrier <elghinn@free.fr>2009-06-23 21:29:25 +0400
commit0a3d26e5d42dc95d8b3d0f00148974cbe5232288 (patch)
tree16c0dc9445739a84aa36d95ebf7622beb455313f
parent9133960fbc636ec63e67e3e20826d2a09ca6d6cd (diff)
* added another table to handle roster group
* we now handle roster push and roster reception * changed version number in src/common/defs.py
-rw-r--r--src/common/check_paths.py13
-rw-r--r--src/common/connection_handlers.py9
-rw-r--r--src/common/defs.py2
-rw-r--r--src/common/logger.py52
-rw-r--r--src/common/optparser.py15
5 files changed, 86 insertions, 5 deletions
diff --git a/src/common/check_paths.py b/src/common/check_paths.py
index 1632d3875..a732e4327 100644
--- a/src/common/check_paths.py
+++ b/src/common/check_paths.py
@@ -98,9 +98,18 @@ def create_log_db():
);
CREATE TABLE IF NOT EXISTS roster_entry(
- account_jid_id INTEGER PRIMARY KEY,
+ account_jid_id INTEGER,
jid_id INTEGER,
- subscription INTEGER
+ name TEXT,
+ subscription INTEGER,
+ PRIMARY KEY (account_jid_id, jid_id)
+ );
+
+ CREATE TABLE IF NOT EXISTS roster_group(
+ account_jid_id INTEGER,
+ jid_id INTEGER,
+ group_name TEXT,
+ PRIMARY KEY (account_jid_id, jid_id, group_name)
);
'''
)
diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py
index 5eca5bf1d..b9ad25d6b 100644
--- a/src/common/connection_handlers.py
+++ b/src/common/connection_handlers.py
@@ -1542,6 +1542,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
def _rosterSetCB(self, con, iq_obj):
log.debug('rosterSetCB')
+ version = iq_obj.getTagAttr('query', 'ver')
for item in iq_obj.getTag('query').getChildren():
jid = helpers.parse_jid(item.getAttr('jid'))
name = item.getAttr('name')
@@ -1551,6 +1552,14 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
for group in item.getTags('group'):
groups.append(group.getData())
self.dispatch('ROSTER_INFO', (jid, name, sub, ask, groups))
+ if version:
+ account_jid = '%s@%s' % (
+ gajim.config.get_per('accounts', self.name, 'name'),
+ gajim.config.get_per('accounts', self.name, 'hostname'))
+ gajim.logger.add_or_update_contact(account_jid, jid, name, sub,
+ groups)
+ gajim.config.set_per('accounts', self.name, 'roster_version',
+ version)
if not self.connection or self.connected < 2:
raise common.xmpp.NodeProcessed
reply = common.xmpp.Iq(typ='result', attrs={'id': iq_obj.getID()},
diff --git a/src/common/defs.py b/src/common/defs.py
index 29101e0c9..6a1b8438f 100644
--- a/src/common/defs.py
+++ b/src/common/defs.py
@@ -27,7 +27,7 @@ docdir = '../'
datadir = '../'
localedir = '../po'
-version = '0.12.1.5-svn'
+version = '0.12.1.6-hg'
import sys, os.path
for base in ('.', 'common'):
diff --git a/src/common/logger.py b/src/common/logger.py
index 9fd4fe995..ca83320a9 100644
--- a/src/common/logger.py
+++ b/src/common/logger.py
@@ -92,6 +92,13 @@ class Constants:
self.TYPE_MRIM,
) = range(14)
+ (
+ self.SUBSCRIPTION_NONE,
+ self.SUBSCRIPTION_TO,
+ self.SUBSCRIPTION_FROM,
+ self.SUBSCRIPTION_BOTH,
+ ) = range(4)
+
constants = Constants()
class Logger:
@@ -331,6 +338,16 @@ class Logger:
if type_id == constants.TYPE_MRIM:
return 'mrim'
+ def convert_human_subscription_values_to_db_api_values(self, sub):
+ if sub == 'none':
+ return constants.SUBSCRIPTION_NONE
+ if sub == 'to':
+ return constants.SUBSCRIPTION_TO
+ if sub == 'from':
+ return constants.SUBSCRIPTION_FROM
+ if sub == 'both':
+ return constants.SUBSCRIPTION_BOTH
+
def commit_to_db(self, values, write_unread = False):
sql = 'INSERT INTO logs (jid_id, contact_name, time, kind, show, message, subject) VALUES (?, ?, ?, ?, ?, ?, ?)'
try:
@@ -799,4 +816,39 @@ class Logger:
except sqlite.OperationalError, e:
print >> sys.stderr, str(e)
+ def del_contact(self, account_jid, jid):
+ try:
+ account_jid_id = self.get_jid_id(account_jid)
+ jid_id = self.get_jid_id(jid)
+ except exceptions.PysqliteOperationalError, e:
+ raise exceptions.PysqliteOperationalError(str(e))
+ sql = 'DELETE FROM roster_entry WHERE account_jid_id = %d AND jid_id = %d' % (account_jid_id, jid_id)
+ self.simple_commit(sql)
+
+ def add_or_update_contact(self, account_jid, jid, name, sub, groups):
+ if sub == 'remove':
+ self.del_contact(account_jid, jid)
+ return
+
+ try:
+ account_jid_id = self.get_jid_id(account_jid)
+ jid_id = self.get_jid_id(jid)
+ except exceptions.PysqliteOperationalError, e:
+ raise exceptions.PysqliteOperationalError(str(e))
+
+ # update groups information
+ # first we delete all previous groups information
+ sql = 'DELETE FROM roster_group WHERE account_jid_id = %d AND jid_id = %d' % (account_jid_id, jid_id)
+ self.cur.execute(sql)
+ # then we add all new groups information
+ for group in groups:
+ sql = 'INSERT INTO roster_group VALUES("%d", "%d", "%s")' % (
+ account_jid_id, jid_id, group)
+ self.cur.execute(sql)
+
+ sql = 'REPLACE INTO roster_entry VALUES("%d", "%d", "%s", "%d")' % (
+ account_jid_id, jid_id, name,
+ self.convert_human_subscription_values_to_db_api_values(sub))
+ self.simple_commit(sql)
+
# vim: se ts=3:
diff --git a/src/common/optparser.py b/src/common/optparser.py
index b927fb079..9cf3d56b6 100644
--- a/src/common/optparser.py
+++ b/src/common/optparser.py
@@ -198,6 +198,8 @@ class OptionsParser:
self.update_config_to_01214()
if old < [0, 12, 1, 5] and new >= [0, 12, 1, 5]:
self.update_config_to_01215()
+ if old < [0, 12, 1, 6] and new >= [0, 12, 1, 6]:
+ self.update_config_to_01216()
gajim.logger.init_vars()
gajim.config.set('version', new_version)
@@ -681,9 +683,18 @@ class OptionsParser:
cur.executescript(
'''
CREATE TABLE IF NOT EXISTS roster_entry(
- account_jid_id INTEGER PRIMARY KEY,
+ account_jid_id INTEGER,
jid_id INTEGER,
- subscription INTEGER
+ name TEXT,
+ subscription INTEGER,
+ PRIMARY KEY (account_jid_id, jid_id)
+ );
+
+ CREATE TABLE IF NOT EXISTS roster_group(
+ account_jid_id INTEGER,
+ jid_id INTEGER,
+ group_name TEXT,
+ PRIMARY KEY (account_jid_id, jid_id, group_name)
);
'''
)