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:
Goffi 2015-01-24 01:00:29 +01:00
commit 8ce5c1862b
2 changed files with 1125 additions and 452 deletions

View file

@ -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

View file

@ -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: