def generate_server_list_data(self, address, fields, server_info, finalize = False):
        output = bytearray()
        flags_buffer = bytearray()

        if len(server_info) > 0:
            # Start server loop here instead of including all of the fields and stuff again
            flags = 0
            if len(server_info) != 0:
                flags |= ServerListFlags.HAS_KEYS_FLAG

                if "natneg" in server_info:
                    flags |= ServerListFlags.CONNECT_NEGOTIATE_FLAG

                ip = 0
                if self.console != 0:
                    ip = utils.get_bytes_from_int_be(int(server_info['publicip'])) # Wii
                    flags_buffer += ip
                else:
                    ip = utils.get_bytes_from_int(int(server_info['publicip'])) # DS
                    flags_buffer += ip

                flags |= ServerListFlags.NONSTANDARD_PORT_FLAG

                if server_info['publicport'] != "0":
                    flags_buffer += utils.get_bytes_from_short_be(int(server_info['publicport']))
                else:
                    flags_buffer += utils.get_bytes_from_short_be(int(server_info['localport']))

                if "localip0" in server_info:
                    # How to handle multiple localips?
                    flags |= ServerListFlags.PRIVATE_IP_FLAG
                    flags_buffer += bytearray([int(x) for x in server_info['localip0'].split('.')]) #ip

                if "localport" in server_info:
                    flags |= ServerListFlags.NONSTANDARD_PRIVATE_PORT_FLAG
                    flags_buffer += utils.get_bytes_from_short_be(int(server_info['localport']))

                flags |= ServerListFlags.ICMP_IP_FLAG
                flags_buffer += bytearray([int(x) for x in "0.0.0.0".split('.')])

                output += bytearray([flags & 0xff])
                output += flags_buffer

                if (flags & ServerListFlags.HAS_KEYS_FLAG):
                    # Write data for associated fields
                    if 'requested' in server_info:
                        for field in fields:
                            output += '\xff' + bytearray(server_info['requested'][field]) + '\0'

        return output
Exemplo n.º 2
0
    def generate_server_list_data(self, address, fields, server_info):
        output = bytearray()

        # Write the address
        output += bytearray([int(x) for x in address.host.split('.')])

        # Write the port
        output += utils.get_bytes_from_short_be(address.port)

        #if len(server_info) > 0:
        if True:
            # Write number of fields that will be returned.
            key_count = len(fields)
            output += utils.get_bytes_from_short(key_count)

            if key_count != len(fields):
                # For some reason we didn't get all of the expected data.
                self.log(logging.WARNING, "key_count[%d] != len(fields)[%d]" % (key_count, len(fields)))
                self.log(logging.WARNING, fields)

            flags_buffer = bytearray()

            # Write the fields
            for field in fields:
                output += bytearray(field) + '\0\0'

            # Start server loop here instead of including all of the fields and stuff again
            flags = 0
            if len(server_info) != 0:
                flags |= ServerListFlags.HAS_KEYS_FLAG

                if "natneg" in server_info:
                    flags |= ServerListFlags.CONNECT_NEGOTIATE_FLAG

                ip = 0
                if self.console != 0:
                    ip = utils.get_bytes_from_int_be(int(server_info['publicip'])) # Wii
                    flags_buffer += ip
                else:
                    ip = utils.get_bytes_from_int(int(server_info['publicip'])) # DS
                    flags_buffer += ip

                flags |= ServerListFlags.NONSTANDARD_PORT_FLAG
                flags_buffer += utils.get_bytes_from_short_be(int(server_info['publicport']))

                if "localip0" in server_info:
                    flags |= ServerListFlags.PRIVATE_IP_FLAG
                    flags_buffer += ip #bytearray([int(x) for x in server_info['localip'].split('.')])

                if "localport" in server_info:
                    flags |= ServerListFlags.NONSTANDARD_PRIVATE_PORT_FLAG
                    flags_buffer += utils.get_bytes_from_short_be(int(server_info['localport']))

                flags |= ServerListFlags.ICMP_IP_FLAG
                flags_buffer += bytearray([int(x) for x in "0.0.0.0".split('.')])

                output += bytearray([flags & 0xff])
                output += flags_buffer

                if (flags & ServerListFlags.HAS_KEYS_FLAG):
                    # Write data for associated fields
                    for field in fields:
                        output += '\xff' + bytearray(server_info['requested'][field]) + '\0'

            output += '\0'
            output += utils.get_bytes_from_int(-1)

        return output