| ... |
... |
@@ -14,53 +14,41 @@ |
|
14
|
14
|
|
|
15
|
15
|
# XEP-0083: Nested Roster Groups
|
|
16
|
16
|
|
|
17
|
|
-import nbxmpp
|
|
18
|
|
-from nbxmpp.namespaces import Namespace
|
|
|
17
|
+
|
|
|
18
|
+from nbxmpp.errors import is_error
|
|
|
19
|
+from nbxmpp.modules.util import raise_if_error
|
|
19
|
20
|
|
|
20
|
21
|
from gajim.common.modules.base import BaseModule
|
|
|
22
|
+from gajim.common.modules.util import as_task
|
|
21
|
23
|
|
|
22
|
24
|
|
|
23
|
25
|
class Delimiter(BaseModule):
|
|
|
26
|
+
|
|
|
27
|
+ _nbxmpp_extends = 'Delimiter'
|
|
|
28
|
+ _nbxmpp_methods = [
|
|
|
29
|
+ 'request_delimiter',
|
|
|
30
|
+ 'set_delimiter'
|
|
|
31
|
+ ]
|
|
|
32
|
+
|
|
24
|
33
|
def __init__(self, con):
|
|
25
|
34
|
BaseModule.__init__(self, con)
|
|
26
|
35
|
self.available = False
|
|
27
|
36
|
self.delimiter = '::'
|
|
28
|
37
|
|
|
|
38
|
+ @as_task
|
|
29
|
39
|
def get_roster_delimiter(self):
|
|
30
|
|
- self._log.info('Request')
|
|
31
|
|
- node = nbxmpp.Node('storage', attrs={'xmlns': 'roster:delimiter'})
|
|
32
|
|
- iq = nbxmpp.Iq('get', Namespace.PRIVATE, payload=node)
|
|
33
|
|
-
|
|
34
|
|
- self._con.connection.SendAndCallForResponse(
|
|
35
|
|
- iq, self._delimiter_received)
|
|
|
40
|
+ _task = yield
|
|
36
|
41
|
|
|
37
|
|
- def _delimiter_received(self, _nbxmpp_client, stanza):
|
|
38
|
|
- if not nbxmpp.isResultNode(stanza):
|
|
39
|
|
- self._log.info('Request error: %s', stanza.getError())
|
|
40
|
|
- else:
|
|
41
|
|
- delimiter = stanza.getQuery().getTagData('roster')
|
|
42
|
|
- self.available = True
|
|
43
|
|
- self._log.info('Delimiter received: %s', delimiter)
|
|
44
|
|
- if delimiter:
|
|
45
|
|
- self.delimiter = delimiter
|
|
46
|
|
- else:
|
|
47
|
|
- self.set_roster_delimiter()
|
|
|
42
|
+ delimiter = yield self.request_delimiter()
|
|
|
43
|
+ if is_error(delimiter) or delimiter is None:
|
|
|
44
|
+ result = yield self.set_delimiter(self.delimiter)
|
|
|
45
|
+ raise_if_error(result)
|
|
|
46
|
+ delimiter = self.delimiter
|
|
48
|
47
|
|
|
|
48
|
+ self.delimiter = delimiter
|
|
|
49
|
+ self.available = True
|
|
49
|
50
|
self._con.connect_machine()
|
|
50
|
51
|
|
|
51
|
|
- def set_roster_delimiter(self):
|
|
52
|
|
- self._log.info('Set delimiter')
|
|
53
|
|
- iq = nbxmpp.Iq('set', Namespace.PRIVATE)
|
|
54
|
|
- roster = iq.getQuery().addChild('roster', namespace='roster:delimiter')
|
|
55
|
|
- roster.setData('::')
|
|
56
|
|
-
|
|
57
|
|
- self._con.connection.SendAndCallForResponse(
|
|
58
|
|
- iq, self._set_delimiter_response)
|
|
59
|
|
-
|
|
60
|
|
- def _set_delimiter_response(self, _nbxmpp_client, stanza):
|
|
61
|
|
- if not nbxmpp.isResultNode(stanza):
|
|
62
|
|
- self._log.info('Store error: %s', stanza.getError())
|
|
63
|
|
-
|
|
64
|
52
|
|
|
65
|
53
|
def get_instance(*args, **kwargs):
|
|
66
|
54
|
return Delimiter(*args, **kwargs), 'Delimiter'
|