core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
/!\ not finished, everything is still instable !
- bridge: DBus bridge has been modified to allow blocking call to be called in the same way as asynchronous calls
- bridge: calls with a callback and no errback are now possible, default errback log the error
- constants: removed hack to manage presence without OrderedDict, as an OrderedDict like class has been implemented in Libervia
- core: getLastResource has been removed and replaced by getMainResource (there is a global better management of resources)
- various style improvments: use of constants when possible, fixed variable overlaps, import of module instead of direct class import
- frontends: printInfo and printMessage methods in (Quick)Chat are more generic (use of extra instead of timestamp)
- frontends: bridge creation and option parsing (command line arguments) are now specified by the frontend in QuickApp __init__
- frontends: ProfileManager manage a more complete plug sequence (some stuff formerly manage in contact_list have moved to ProfileManager)
- quick_frontend (quick_widgets): QuickWidgetsManager is now iterable (all widgets are then returned), or can return an iterator on a specific class (return all widgets of this class) with getWidgets
- frontends: tools.jid can now be used in Pyjamas, with some care
- frontends (XMLUI): profile is now managed
- core (memory): big improvment on entities cache management (and specially resource management)
- core (params/exceptions): added PermissionError
- various fixes and improvments, check diff for more details
This commit is contained in:
parent
f45e55388f
commit
8ce5c1862b
1 changed files with 1125 additions and 452 deletions
|
|
@ -18,20 +18,84 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
class JID(unicode):
|
||||
# hack to use this module with pyjamas
|
||||
try:
|
||||
unicode('') # XXX: unicode doesn't exist in pyjamas
|
||||
|
||||
# normal version
|
||||
class BaseJID(unicode):
|
||||
def __new__(cls, jid_str):
|
||||
self = unicode.__new__(cls, cls._normalize(jid_str))
|
||||
return self
|
||||
|
||||
def __init__(self, jid_str):
|
||||
pass
|
||||
|
||||
def _parse(self):
|
||||
"""Find node domain and resource"""
|
||||
node_end = self.find('@')
|
||||
if node_end < 0:
|
||||
node_end = 0
|
||||
domain_end = self.find('/')
|
||||
if domain_end == 0:
|
||||
raise ValueError("a jid can't start with '/'")
|
||||
if domain_end == -1:
|
||||
domain_end = len(self)
|
||||
self.node = self[:node_end] or None
|
||||
self.domain = self[(node_end + 1) if node_end else 0:domain_end]
|
||||
self.resource = self[domain_end + 1:] or None
|
||||
|
||||
except (TypeError, AttributeError): # Error raised is not the same depending on pyjsbuild options
|
||||
# pyjamas version
|
||||
class BaseJID(object):
|
||||
def __init__(self, jid_str):
|
||||
self.__internal_str = JID._normalize(jid_str)
|
||||
|
||||
def __str__(self):
|
||||
return self.__internal_str
|
||||
|
||||
def __getattr__(self, name):
|
||||
return getattr(self.__internal_str, name)
|
||||
|
||||
def __eq__(self, other):
|
||||
return (self.node == other.node
|
||||
and self.domain == other.domain
|
||||
and self.resource == other.resource)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.__internal_str)
|
||||
|
||||
def find(self, *args):
|
||||
return self.__internal_str.find(*args)
|
||||
|
||||
def _parse(self):
|
||||
"""Find node domain and resource"""
|
||||
node_end = self.__internal_str.find('@')
|
||||
if node_end < 0:
|
||||
node_end = 0
|
||||
domain_end = self.__internal_str.find('/')
|
||||
if domain_end == 0:
|
||||
raise ValueError("a jid can't start with '/'")
|
||||
if domain_end == -1:
|
||||
domain_end = len(self.__internal_str)
|
||||
self.node = self.__internal_str[:node_end] or None
|
||||
self.domain = self.__internal_str[(node_end + 1) if node_end else 0:domain_end]
|
||||
self.resource = self.__internal_str[domain_end + 1:] or None
|
||||
|
||||
|
||||
class JID(BaseJID):
|
||||
"""This class help manage JID (Node@Domaine/Resource)"""
|
||||
|
||||
def __new__(cls, jid):
|
||||
self = unicode.__new__(cls, cls._normalize(jid))
|
||||
def __init__(self, jid_str):
|
||||
super(JID, self).__init__(jid_str)
|
||||
self._parse()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def _normalize(cls, jid):
|
||||
@staticmethod
|
||||
def _normalize(jid_str):
|
||||
"""Naive normalization before instantiating and parsing the JID"""
|
||||
if not jid:
|
||||
return jid
|
||||
tokens = jid.split('/')
|
||||
if not jid_str:
|
||||
return jid_str
|
||||
tokens = jid_str.split('/')
|
||||
tokens[0] = tokens[0].lower() # force node and domain to lower-case
|
||||
return '/'.join(tokens)
|
||||
|
||||
|
|
@ -41,20 +105,6 @@ class JID(unicode):
|
|||
return JID(self.domain)
|
||||
return JID(u"{}@{}".format(self.node, self.domain))
|
||||
|
||||
def _parse(self):
|
||||
"""Find node domain and resource"""
|
||||
node_end = self.find('@')
|
||||
if node_end < 0:
|
||||
node_end = 0
|
||||
domain_end = self.find('/')
|
||||
if domain_end == 0:
|
||||
raise ValueError("a jid can't start with '/'")
|
||||
if domain_end == -1:
|
||||
domain_end = len(self)
|
||||
self.node = self[:node_end] or None
|
||||
self.domain = self[(node_end + 1) if node_end else 0:domain_end]
|
||||
self.resource = self[domain_end + 1:] or None
|
||||
|
||||
def is_valid(self):
|
||||
"""
|
||||
@return: True if the JID is XMPP compliant
|
||||
|
|
|
|||
Loading…
Reference in a new issue