class FirefoxDevtoolsProtocol(asyncore.dispatcher): def __init__(self): asyncore.dispatcher.__init__(self, map=protocol_map) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.recv_buffer = "" self.send_buffer = "" self.on_connect = Event() self.on_packet = Event() def handle_connect(self): self.on_connect.emit() pass def handle_close(self): self.close() def handle_read(self): self.recv_buffer += self.recv(8192) try: length, remaining = self.recv_buffer.split(":", 1) except ValueError: return length = int(length) if len(remaining) < length: return packet = remaining[0:length] self.recv_buffer = remaining[length:] print "got " + packet self.on_packet.emit(json.loads(packet)) def writable(self): return len(self.send_buffer) > 0 def handle_write(self): sent = self.send(self.send_buffer) self.send_buffer = self.send_buffer[sent:] def send_packet(self, packet): data = json.dumps(packet) print "sending " + data self.send_buffer += str(len(data)) + ":" + data
class FirefoxDevtoolsClient(object): def __init__(self, conn): self.root = None self.conn = conn self.conn.on_packet += self.on_packet self.on_connected = Event() self.pools = set() def add_pool(self, pool): self.pools.add(pool) def remove_pool(self, pool): self.pools.discard(pool) def pool_for(self, actor_id): for pool in self.pools: if pool.has_front(actor_id): return pool return None def get_front(self, actor_id): pool = self.pool_for(actor_id) if not pool: return None return pool.get_front(actor_id) def on_packet(self, packet): if not self.root: # Yeah these should be runtime errors. assert packet["from"] == "root" assert "applicationType" in packet from fronts import RootFront self.root = RootFront(self, packet) d = self.root.protocol_description() d.addCallback(self.register_actor_descriptions) d.addErrback(self.describe_failed) return if packet["from"] == "root": front = self.root else: front = self.get_front(packet["from"]) front.on_packet(packet) def describe_failed(self, e): print "Error listing actor descriptions: %s" % (e,) import protodesc #self.register_actor_descriptions(protodesc.actor_descriptions) def register_actor_descriptions(self, descriptions): for desc in descriptions["types"].values(): type_name = desc["typeName"] category = desc["category"] if category == "actor": t = get_type(desc["typeName"]) if isinstance(t, ActorType): concrete = t.cls elif isinstance(t, PlaceholderType) and t.concrete: concrete = t.concrete.cls else: concrete = type( str(type_name), (Front,), {"typeName": type_name}) concrete.implement_actor(desc) continue if type_exists(type_name): continue if category == "dict": add_type(DictType(type_name, desc["specializations"])) self.on_connected.emit(self) def send_packet(self, packet): self.conn.send_packet(packet)
class FirefoxDevtoolsClient(object): def __init__(self, conn): self.root = None self.conn = conn self.conn.on_packet += self.on_packet self.on_connected = Event() self.pools = set() def add_pool(self, pool): self.pools.add(pool) def remove_pool(self, pool): self.pools.discard(pool) def pool_for(self, actor_id): for pool in self.pools: if pool.has_front(actor_id): return pool return None def get_front(self, actor_id): pool = self.pool_for(actor_id) if not pool: return None return pool.get_front(actor_id) def on_packet(self, packet): if not self.root: # Yeah these should be runtime errors. assert packet["from"] == "root" assert "applicationType" in packet from fronts import RootFront self.root = RootFront(self, packet) d = self.root.protocol_description() d.addCallback(self.register_actor_descriptions) d.addErrback(self.describe_failed) return if packet["from"] == "root": front = self.root else: front = self.get_front(packet["from"]) front.on_packet(packet) def describe_failed(self, e): print "Error listing actor descriptions: %s" % (e, ) import protodesc #self.register_actor_descriptions(protodesc.actor_descriptions) def register_actor_descriptions(self, descriptions): for desc in descriptions["types"].values(): type_name = desc["typeName"] category = desc["category"] if category == "actor": t = get_type(desc["typeName"]) if isinstance(t, ActorType): concrete = t.cls elif isinstance(t, PlaceholderType) and t.concrete: concrete = t.concrete.cls else: concrete = type(str(type_name), (Front, ), {"typeName": type_name}) concrete.implement_actor(desc) continue if type_exists(type_name): continue if category == "dict": add_type(DictType(type_name, desc["specializations"])) self.on_connected.emit(self) def send_packet(self, packet): self.conn.send_packet(packet)