class CommonNameData(gobject.GObject): __gsignals__ = { 'introspect_data_changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,()) } def __init__(self): super(CommonNameData, self).__init__() self.unique_name = None self.bus = None self.process_id = None self.process_path = None self.process_name = 'Unknown or Remote' self._introspecting = False self._introspection_data = IntrospectData() self._introspect_object_queue = [] # there is a race condition here but D-Bus # doesn't have a signal for introspection data change # which would be impractical for some highly dynamic objects def _introspect(self, name, node): self._introspecting = True obj = self.bus.get_object(name, node, follow_name_owner_changes=True) obj.Introspect(dbus_interface='org.freedesktop.DBus.Introspectable', reply_handler=lambda xml: self._query_introspect_data_cb(name, node, xml), error_handler=self._query_introspect_data_error_cb) def _query_introspect_data_error_cb(self, error): print error self._introspecting = False # errors are expected def _query_introspect_data_cb(self, name, parent_node, xml): self._introspecting = False data = _introspect_parser.process_introspection_data(xml) for node in data['child_nodes']: cnode = '' if parent_node != '/': cnode = parent_node cnode += '/' + node self._introspect_object_queue.append(cnode) if self._introspect_object_queue: obj = self._introspect_object_queue.pop(0) self._introspect(name, obj) if data['interfaces']: self._introspection_data.append(parent_node, data) self.emit('introspect_data_changed')
def __init__(self): super(CommonNameData, self).__init__() self.unique_name = None self.bus = None self.process_id = None self.process_path = None self.process_name = 'Unknown or Remote' self._introspecting = False self._introspection_data = IntrospectData() self._introspect_object_queue = []