2023-03-10 23:37:11 +01:00
|
|
|
#include <msgba/packet.h>
|
|
|
|
#include <msgba/packet/hello.h>
|
2023-03-11 08:17:25 +01:00
|
|
|
#include <msgba/core_controller.h>
|
2023-03-10 23:37:11 +01:00
|
|
|
void
|
|
|
|
msPacketHelloDestroy(struct msPacketHello **hello) {
|
|
|
|
if ((*hello)->rom) {
|
|
|
|
free((*hello)->rom);
|
|
|
|
(*hello)->rom = NULL;
|
|
|
|
}
|
|
|
|
if ((*hello)->savestate) {
|
|
|
|
free((*hello)->savestate);
|
|
|
|
(*hello)->savestate = NULL;
|
|
|
|
}
|
|
|
|
free(*hello);
|
|
|
|
*hello = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
msPacketHelloHandle(const struct msPacket *packet, struct msPacketHello *hello,
|
|
|
|
struct msClientConnectionData *const data) {
|
|
|
|
bool result = false;
|
|
|
|
if (data->coreController) {
|
|
|
|
fprintf(stderr, "Attempt to send a second hello, aborting connection.\n");
|
|
|
|
goto return_ms_packet_hello_handle;
|
|
|
|
}
|
|
|
|
printf("Loading game and save for client_fd %d\n", data->clientFd);
|
2023-03-11 08:17:25 +01:00
|
|
|
data->coreController = msCoreControllerLoadGame(hello->rom, hello->size_rom, hello->savestate, hello->size_savestate, data);
|
2023-03-10 23:37:11 +01:00
|
|
|
msCoreControllerThreadStart(data->coreController);
|
|
|
|
result = true;
|
|
|
|
return_ms_packet_hello_handle:
|
|
|
|
msPacketHelloDestroy(&hello);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
msPacketHelloGet(const struct msPacket *packet, int client_fd,
|
|
|
|
struct msClientConnectionData *const data) {
|
|
|
|
bool result = false;
|
|
|
|
struct msPacketHello *hello = NULL;
|
|
|
|
unsigned char *rom = NULL;
|
|
|
|
unsigned char *savestate = NULL;
|
|
|
|
FILE *fp = fmemopen(packet->raw_data, packet->size, "r");
|
|
|
|
if (!fp) {
|
|
|
|
printf("Unable to fmemopen\n");
|
|
|
|
goto return_get_packet_hello;
|
|
|
|
}
|
|
|
|
size_t size_rom = 0;
|
|
|
|
size_t size_savestate = 0;
|
|
|
|
size_t reads[4] = { 0,0,0,0 };
|
|
|
|
size_t total_read = 0;
|
|
|
|
size_t to_read_size;
|
|
|
|
|
|
|
|
#define FREAD(target, size, count, fp, n, goto_to) \
|
|
|
|
to_read_size = size; \
|
|
|
|
reads[n] = fread(target, to_read_size, count, fp); \
|
|
|
|
reads[n] *= size; \
|
|
|
|
if (reads[n] == -1) { \
|
|
|
|
printf("Unable to read %s\n", #target); \
|
|
|
|
goto goto_to; \
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FREAD(&size_rom, sizeof size_rom, 1, fp, 0, return_get_packet_hello);
|
|
|
|
size_rom = be64toh(size_rom);
|
|
|
|
rom = malloc(sizeof *rom * size_rom);
|
|
|
|
|
|
|
|
FREAD(rom, sizeof *rom, size_rom, fp, 1, return_get_packet_hello);
|
|
|
|
|
|
|
|
FREAD(&size_savestate, sizeof size_savestate, 1, fp, 2, return_get_packet_hello);
|
|
|
|
size_savestate = be64toh(size_savestate);
|
|
|
|
savestate = malloc(sizeof *savestate * size_savestate);
|
|
|
|
|
|
|
|
FREAD(savestate, sizeof *savestate, size_savestate, fp, 3, return_get_packet_hello);
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
for (int i = 0; i<4; i++) {
|
|
|
|
total_read += reads[i];
|
|
|
|
}
|
|
|
|
if (total_read != packet->size) {
|
|
|
|
fprintf (stderr, "Total read (%lu) != packet->size (%lu)\n", total_read, packet->size);
|
|
|
|
goto return_get_packet_hello;
|
|
|
|
}
|
|
|
|
hello = calloc(1, sizeof *hello);
|
|
|
|
hello->size_rom = size_rom;
|
|
|
|
hello->rom = rom;
|
|
|
|
hello->size_savestate = size_savestate;
|
|
|
|
hello->savestate = savestate;
|
|
|
|
result = true;
|
|
|
|
return_get_packet_hello:
|
|
|
|
if (!result) {
|
|
|
|
fprintf(stderr, "Unable to read the packet hello\n");
|
|
|
|
if (rom) {
|
|
|
|
free (rom);
|
|
|
|
rom = NULL;
|
|
|
|
}
|
|
|
|
if (savestate) {
|
|
|
|
free (savestate);
|
|
|
|
savestate = NULL;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
return msPacketHelloHandle(packet, hello, data);
|
|
|
|
}
|
|
|
|
|