286 const GRFConfig *c; |
286 const GRFConfig *c; |
287 uint in_request_count = 0; |
287 uint in_request_count = 0; |
288 struct sockaddr_in out_addr; |
288 struct sockaddr_in out_addr; |
289 |
289 |
290 for (c = item->info.grfconfig; c != NULL; c = c->next) { |
290 for (c = item->info.grfconfig; c != NULL; c = c->next) { |
291 if (HASBIT(c->flags, GCF_NOT_FOUND)) item->info.compatible = false; |
291 if (c->status == GCS_NOT_FOUND) item->info.compatible = false; |
292 if (!HASBIT(c->flags, GCF_NOT_FOUND) || strcmp(c->name, UNKNOWN_GRF_NAME_PLACEHOLDER) != 0) continue; |
292 if (c->status == GCS_NOT_FOUND || strcmp(c->name, UNKNOWN_GRF_NAME_PLACEHOLDER) != 0) continue; |
293 in_request[in_request_count] = c; |
293 in_request[in_request_count] = c; |
294 in_request_count++; |
294 in_request_count++; |
295 } |
295 } |
296 |
296 |
297 if (in_request_count > 0) { |
297 if (in_request_count > 0) { |
390 if (f == NULL) { |
390 if (f == NULL) { |
391 /* Don't know the GRF, so mark game incompatible and the (possibly) |
391 /* Don't know the GRF, so mark game incompatible and the (possibly) |
392 * already resolved name for this GRF (another server has sent the |
392 * already resolved name for this GRF (another server has sent the |
393 * name of the GRF already */ |
393 * name of the GRF already */ |
394 config->name = FindUnknownGRFName(config->grfid, config->md5sum, true); |
394 config->name = FindUnknownGRFName(config->grfid, config->md5sum, true); |
395 SETBIT(config->flags, GCF_NOT_FOUND); |
395 config->status = GCS_NOT_FOUND; |
396 } else { |
396 } else { |
397 config->filename = f->filename; |
397 config->filename = f->filename; |
398 config->name = f->name; |
398 config->name = f->name; |
399 config->info = f->info; |
399 config->info = f->info; |
400 } |
400 } |
401 SETBIT(config->flags, GCF_COPY); |
401 SETBIT(config->flags, GCF_COPY); |
402 } |
402 } |
403 |
403 |
404 // Close UDP connection |
404 // Close UDP connection |
405 void NetworkUDPCloseAll(void) |
405 void NetworkUDPCloseAll() |
406 { |
406 { |
407 DEBUG(net, 1, "[udp] closed listeners"); |
407 DEBUG(net, 1, "[udp] closed listeners"); |
408 |
408 |
409 _udp_server_socket->Close(); |
409 _udp_server_socket->Close(); |
410 _udp_master_socket->Close(); |
410 _udp_master_socket->Close(); |
433 } |
433 } |
434 } |
434 } |
435 |
435 |
436 |
436 |
437 // Request the the server-list from the master server |
437 // Request the the server-list from the master server |
438 void NetworkUDPQueryMasterServer(void) |
438 void NetworkUDPQueryMasterServer() |
439 { |
439 { |
440 struct sockaddr_in out_addr; |
440 struct sockaddr_in out_addr; |
441 |
441 |
442 if (!_udp_client_socket->IsConnected()) { |
442 if (!_udp_client_socket->IsConnected()) { |
443 if (!_udp_client_socket->Listen(0, 0, true)) return; |
443 if (!_udp_client_socket->Listen(0, 0, true)) return; |
456 |
456 |
457 DEBUG(net, 2, "[udp] master server queried at %s:%d", inet_ntoa(out_addr.sin_addr), ntohs(out_addr.sin_port)); |
457 DEBUG(net, 2, "[udp] master server queried at %s:%d", inet_ntoa(out_addr.sin_addr), ntohs(out_addr.sin_port)); |
458 } |
458 } |
459 |
459 |
460 // Find all servers |
460 // Find all servers |
461 void NetworkUDPSearchGame(void) |
461 void NetworkUDPSearchGame() |
462 { |
462 { |
463 // We are still searching.. |
463 // We are still searching.. |
464 if (_network_udp_broadcast > 0) return; |
464 if (_network_udp_broadcast > 0) return; |
465 |
465 |
466 // No UDP-socket yet.. |
466 // No UDP-socket yet.. |
502 |
502 |
503 UpdateNetworkGameWindow(false); |
503 UpdateNetworkGameWindow(false); |
504 } |
504 } |
505 |
505 |
506 /* Remove our advertise from the master-server */ |
506 /* Remove our advertise from the master-server */ |
507 void NetworkUDPRemoveAdvertise(void) |
507 void NetworkUDPRemoveAdvertise() |
508 { |
508 { |
509 struct sockaddr_in out_addr; |
509 struct sockaddr_in out_addr; |
510 |
510 |
511 /* Check if we are advertising */ |
511 /* Check if we are advertising */ |
512 if (!_networking || !_network_server || !_network_udp_server) return; |
512 if (!_networking || !_network_server || !_network_udp_server) return; |
531 _udp_master_socket->SendPacket(&p, &out_addr); |
531 _udp_master_socket->SendPacket(&p, &out_addr); |
532 } |
532 } |
533 |
533 |
534 /* Register us to the master server |
534 /* Register us to the master server |
535 This function checks if it needs to send an advertise */ |
535 This function checks if it needs to send an advertise */ |
536 void NetworkUDPAdvertise(void) |
536 void NetworkUDPAdvertise() |
537 { |
537 { |
538 struct sockaddr_in out_addr; |
538 struct sockaddr_in out_addr; |
539 |
539 |
540 /* Check if we should send an advertise */ |
540 /* Check if we should send an advertise */ |
541 if (!_networking || !_network_server || !_network_udp_server || !_network_advertise) |
541 if (!_networking || !_network_server || !_network_udp_server || !_network_advertise) |
578 p.Send_uint8 (NETWORK_MASTER_SERVER_VERSION); |
578 p.Send_uint8 (NETWORK_MASTER_SERVER_VERSION); |
579 p.Send_uint16(_network_server_port); |
579 p.Send_uint16(_network_server_port); |
580 _udp_master_socket->SendPacket(&p, &out_addr); |
580 _udp_master_socket->SendPacket(&p, &out_addr); |
581 } |
581 } |
582 |
582 |
583 void NetworkUDPInitialize(void) |
583 void NetworkUDPInitialize() |
584 { |
584 { |
585 _udp_client_socket = new ClientNetworkUDPSocketHandler(); |
585 _udp_client_socket = new ClientNetworkUDPSocketHandler(); |
586 _udp_server_socket = new ServerNetworkUDPSocketHandler(); |
586 _udp_server_socket = new ServerNetworkUDPSocketHandler(); |
587 _udp_master_socket = new MasterNetworkUDPSocketHandler(); |
587 _udp_master_socket = new MasterNetworkUDPSocketHandler(); |
588 |
588 |
589 _network_udp_server = false; |
589 _network_udp_server = false; |
590 _network_udp_broadcast = 0; |
590 _network_udp_broadcast = 0; |
591 } |
591 } |
592 |
592 |
593 void NetworkUDPShutdown(void) |
593 void NetworkUDPShutdown() |
594 { |
594 { |
595 NetworkUDPCloseAll(); |
595 NetworkUDPCloseAll(); |
596 |
596 |
597 delete _udp_client_socket; |
597 delete _udp_client_socket; |
598 delete _udp_server_socket; |
598 delete _udp_server_socket; |