2 SleekXMPP: The Sleek XMPP Library
3 Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
4 This file is part of SleekXMPP.
6 See the file LICENSE for copying permission.
9 from sleekxmpp
.xmlstream
import JID
, ElementBase
, ET
, register_stanza_plugin
12 class Addresses(ElementBase
):
15 namespace
= 'http://jabber.org/protocol/address'
16 plugin_attrib
= 'addresses'
19 def add_address(self
, atype
='to', jid
='', node
='', uri
='',
20 desc
='', delivered
=False):
21 addr
= Address(parent
=self
)
27 addr
['delivered'] = delivered
31 # Additional methods for manipulating sets of addresses
32 # based on type are generated below.
35 class Address(ElementBase
):
38 namespace
= 'http://jabber.org/protocol/address'
39 plugin_attrib
= 'address'
40 interfaces
= set(['type', 'jid', 'node', 'uri', 'desc', 'delivered'])
42 address_types
= set(('bcc', 'cc', 'noreply', 'replyroom', 'replyto', 'to'))
45 return JID(self
._get
_attr
('jid'))
47 def set_jid(self
, value
):
48 self
._set
_attr
('jid', str(value
))
50 def get_delivered(self
):
51 value
= self
._get
_attr
('delivered', False)
52 return value
and value
.lower() in ('true', '1')
54 def set_delivered(self
, delivered
):
56 self
._set
_attr
('delivered', 'true')
60 def set_uri(self
, uri
):
64 self
._set
_attr
('uri', uri
)
69 # =====================================================================
70 # Auto-generate address type filters for the Addresses class.
72 def _addr_filter(atype
):
73 def _type_filter(addr
):
74 if isinstance(addr
, Address
):
75 if atype
== 'all' or addr
['type'] == atype
:
81 def _build_methods(atype
):
84 return list(filter(_addr_filter(atype
), self
))
86 def set_multi(self
, value
):
90 # Support assigning dictionary versions of addresses
91 # instead of full Address objects.
92 if not isinstance(addr
, Address
):
95 elif 'atype' in addr
and 'type' not in addr
:
96 addr
['type'] = addr
['atype']
104 res
= list(filter(_addr_filter(atype
), self
))
106 self
.iterables
.remove(addr
)
107 self
.xml
.remove(addr
.xml
)
109 return get_multi
, set_multi
, del_multi
112 for atype
in ('all', 'bcc', 'cc', 'noreply', 'replyroom', 'replyto', 'to'):
113 get_multi
, set_multi
, del_multi
= _build_methods(atype
)
115 Addresses
.interfaces
.add(atype
)
116 setattr(Addresses
, "get_%s" % atype
, get_multi
)
117 setattr(Addresses
, "set_%s" % atype
, set_multi
)
118 setattr(Addresses
, "del_%s" % atype
, del_multi
)
120 # To retain backwards compatibility:
121 setattr(Addresses
, "get%s" % atype
.title(), get_multi
)
122 setattr(Addresses
, "set%s" % atype
.title(), set_multi
)
123 setattr(Addresses
, "del%s" % atype
.title(), del_multi
)
125 Addresses
.interfaces
.add('addresses')
126 setattr(Addresses
, "getAddresses", get_multi
)
127 setattr(Addresses
, "setAddresses", set_multi
)
128 setattr(Addresses
, "delAddresses", del_multi
)
131 register_stanza_plugin(Addresses
, Address
, iterable
=True)