Exemplo n.º 1
0
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
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)