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
2 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
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ class XMLUIBase(object):
|
|||
@param title: force the title, or use XMLUI one if None
|
||||
@param flags: list of string which can be:
|
||||
- NO_CANCEL: the UI can't be cancelled
|
||||
@param callback: if present, will be use with launchAction
|
||||
@param callback: if present, will be used with launchAction
|
||||
"""
|
||||
self.host = host
|
||||
top=parsed_dom.documentElement
|
||||
|
|
@ -289,7 +289,7 @@ class XMLUIPanel(XMLUIBase):
|
|||
self._main_cont = value
|
||||
|
||||
def _parseChilds(self, _xmlui_parent, current_node, wanted = ('container',), data = None):
|
||||
"""Recursively parse childNodes of an elemen
|
||||
"""Recursively parse childNodes of an element
|
||||
|
||||
@param _xmlui_parent: widget container with '_xmluiAppend' method
|
||||
@param current_node: element from which childs will be parsed
|
||||
|
|
@ -695,7 +695,7 @@ def registerClass(type_, class_):
|
|||
|
||||
def create(host, xml_data, title=None, flags=None, dom_parse=None, dom_free=None, callback=None, profile=C.PROF_KEY_NONE):
|
||||
"""
|
||||
@param dom_parse: methode equivalent to minidom.parseString (but which must manage unicode), or None to use default one
|
||||
@param dom_parse: methode equivalent to minidom.parseString (but which must manage unicode), or None to use default one
|
||||
@param dom_free: method used to free the parsed DOM
|
||||
"""
|
||||
if dom_parse is None:
|
||||
|
|
|
|||
Loading…
Reference in a new issue