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
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