diff frontends/src/tools/jid.py @ 1290:faa1129559b8 frontends_multi_profiles

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
author Goffi <goffi@goffi.org>
date Sat, 24 Jan 2015 01:00:29 +0100
parents e3a9ea76de35
children 4895e1e092fb
line wrap: on
line diff
--- a/frontends/src/tools/jid.py	Sat Jan 24 00:15:01 2015 +0100
+++ b/frontends/src/tools/jid.py	Sat Jan 24 01:00:29 2015 +0100
@@ -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 @@
             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