import base64 import xml.etree.ElementTree as ET from . import log class Response: """ Response objects for the DBGP module. Contains response data from a command made to the debugger. """ ns = '{urn:debugger_protocol_v1}' def __init__(self, response, cmd, cmd_args, api): self.response = response self.cmd = cmd self.cmd_args = cmd_args self.xml = None self.api = api if " 0 self.children = [] def __init_children(self, node): if self.has_children: idx = 0 tagname = '%sproperty' % self.ns children = list(node) if children is not None: for c in children: if c.tag == tagname: idx += 1 p = self._create_child(c, self, self.depth + 1) self.children.append(p) if idx == self.num_declared_children: p.mark_as_last_child() def _create_child(self, node, parent, depth): return ContextProperty(node, parent, depth) def mark_as_last_child(self): self.is_last_child = True def is_uninitialized(self): return self.type == 'uninitialized' def child_count(self): return len(self.children) def type_and_size(self): size = None if self.has_children: size = self.num_declared_children elif self.size is not None: size = self.size if size is None: return self.type return "%s [%s]" % (self.type, size) class EvalProperty(ContextProperty): def __init__(self, node, code, language, parent=None, depth=0): self.code = code self.language = language.lower() self.is_parent = parent is None ContextProperty.__init__(self, node, parent, depth) def _create_child(self, node, parent, depth): return EvalProperty(node, self.code, self.language, parent, depth) def _determine_displayname(self, node): if self.is_parent: self.display_name = self.code else: if self.language == 'php': if self.parent.type == 'array': if node.get('name').isdigit(): self.display_name = self.parent.display_name + \ "[%s]" % node.get('name') else: self.display_name = self.parent.display_name + \ "['%s']" % node.get('name') else: self.display_name = self.parent.display_name + \ "->" + node.get('name') elif self.language == 'perl': self.display_name = node.get('fullname') else: name = node.get('name') if name is None: name = "?" name = self._get_enc_node_text(node, 'name', '?') if self.parent.type == 'list': self.display_name = self.parent.display_name + name else: self.display_name = self.parent.display_name + \ "." + name # Errors/Exceptions class TimeoutError(Exception): pass class DBGPError(Exception): """Raised when the debugger returns an error message.""" pass class CmdNotImplementedError(Exception): """Raised when the debugger returns an error message.""" pass class EvalError(Exception): """Raised when some evaluated code is invalid.""" pass class ResponseError(Exception): """An error caused by an unexpected response from the debugger (e.g. invalid format XML).""" pass class TraceError(Exception): """Raised when trace is out of domain.""" pass