def ensure_request_possible(self, request, player_number): client = self.prodj.cl.getClient(player_number) if client is None: raise dataprovider.TemporaryQueryError("DBClient: player {} not found in clientlist".format(player_number)) critical_requests = ["metadata_request", "artwork_request", "preview_waveform_request", "beatgrid_request", "waveform_request"] critical_play_states = ["no_track", "loading_track", "cannot_play_track", "emergency"] if request in critical_requests and client.play_state in critical_play_states: raise dataprovider.TemporaryQueryError("DataProvider: delaying %s request due to play state: %s".format(request, client.play_state))
def socksnd(self, sock, data): try: sock.send(data) except BrokenPipeError as e: player_number = next((n for n, d in self.socks.items() if d[0] == sock), None) if player_number is None: raise dataprovider.FatalQueryError("socksnd failed with unknown sock") else: self.closeSocket(player_number) raise dataprovider.TemporaryQueryError("Connection to player {} lost".format(player_number))
def send_setup_packet(self, sock, player_number): query = { "transaction_id": 0xfffffffe, "type": "setup", "args": [{"type": "int32", "value": self.own_player_number}] } sock.send(packets.DBMessage.build(query)) data = sockrcv(sock, 48) if len(data) == 0: raise dataprovider.TemporaryQueryError("Failed to connect to player {}".format(player_number)) reply = packets.DBMessage.parse(data) logging.info("DBClient: connected to player {}".format(reply["args"][1]["value"]))
def get_server_port(self, player_number): if player_number not in self.remote_ports: client = self.prodj.cl.getClient(player_number) if client is None: raise dataprovider.TemporaryQueryError("failed to get remote port, player {} unknown".format(player_number)) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((client.ip_addr, packets.DBServerQueryPort)) sock.send(packets.DBServerQuery.build({})) data = sockrcv(sock, 2) sock.close() port = packets.DBServerReply.parse(data) self.remote_ports[player_number] = (client.ip_addr, port) logging.info("DBClient port of player {}: {}".format(player_number, port)) return self.remote_ports[player_number]
def receive_dbmessage(self, sock): parse_errors = 0 receive_timeouts = 0 data = b"" while parse_errors < self.parse_error_count and receive_timeouts < self.receive_timeout_count: new_data = sockrcv(sock, 4096, 1) if len(new_data) == 0: receive_timeouts += 1 continue data += new_data try: return packets.DBMessage.parse(data) except RangeError as e: logging.debug("DBClient: Received %d bytes but parsing failed, trying to receive more", len(data)) parse_errors += 1 raise dataprovider.TemporaryQueryError("Failed to receive dbmessage after {} tries and {} timeouts".format(parse_errors, receive_timeouts))