diff -r 5b0aeef8ba2a -r 5608ac657362 project_files/frontlib/net/netprotocol.c --- a/project_files/frontlib/net/netprotocol.c Thu Jun 21 21:32:12 2012 +0200 +++ b/project_files/frontlib/net/netprotocol.c Mon Jun 25 00:42:07 2012 +0200 @@ -3,6 +3,10 @@ #include "../util/util.h" #include "../util/logging.h" +#include "../base64/base64.h" + +#include + #include #include #include @@ -10,18 +14,12 @@ static int fillTeamFromMsg(flib_team *team, char **parts) { team->name = flib_strdupnull(parts[0]); - team->grave = flib_strdupnull(parts[2]); - team->fort = flib_strdupnull(parts[3]); - team->voicepack = flib_strdupnull(parts[4]); - team->flag = flib_strdupnull(parts[5]); - if(!team->name || !team->grave || !team->fort || !team->voicepack || !team->flag) { - return -1; - } - - long color; - if(sscanf(parts[1], "#%lx", &color)) { - team->color = color; - } else { + team->grave = flib_strdupnull(parts[1]); + team->fort = flib_strdupnull(parts[2]); + team->voicepack = flib_strdupnull(parts[3]); + team->flag = flib_strdupnull(parts[4]); + team->ownerName = flib_strdupnull(parts[5]); + if(!team->name || !team->grave || !team->fort || !team->voicepack || !team->flag || !team->ownerName) { return -1; } @@ -45,7 +43,7 @@ flib_team *flib_team_from_netmsg(char **parts) { flib_team *result = NULL; - flib_team *tmpTeam = flib_calloc(1, sizeof(flib_team)); + flib_team *tmpTeam = flib_team_retain(flib_calloc(1, sizeof(flib_team))); if(tmpTeam) { if(!fillTeamFromMsg(tmpTeam, parts)) { result = tmpTeam; @@ -54,6 +52,65 @@ flib_log_e("Error parsing team from net."); } } - flib_team_destroy(tmpTeam); + flib_team_release(tmpTeam); + return result; +} + +flib_cfg *flib_netmsg_to_cfg(flib_cfg_meta *meta, char **parts) { + flib_cfg *result = flib_cfg_create(meta, parts[0]); + if(result) { + for(int i=0; imodCount; i++) { + result->mods[i] = !strcmp(parts[i+1], "true"); + } + for(int i=0; isettingCount; i++) { + result->settings[i] = atoi(parts[i+meta->modCount+1]); + } + } + return result; +} + +flib_map *flib_netmsg_to_map(char **parts) { + flib_map *result = flib_map_create_named(parts[3], parts[0]); + if(result) { + result->mapgen = atoi(parts[1]); + result->mazeSize = atoi(parts[2]); + result->templateFilter = atoi(parts[4]); + } return result; } + +// TODO: Test with empty map +uint8_t *flib_netmsg_to_drawnmapdata(size_t *outlen, char *netmsg) { + uint8_t *result = NULL; + + // First step: base64 decoding + char *base64decout = NULL; + size_t base64declen; + bool ok = base64_decode_alloc(netmsg, strlen(netmsg), &base64decout, &base64declen); + if(ok && base64declen>3) { + // Second step: unzip with the QCompress header. That header is just a big-endian + // uint32 indicating the length of the uncompressed data. + uint32_t unzipLen = + (((uint32_t)base64decout[0])<<24) + + (((uint32_t)base64decout[1])<<16) + + (((uint32_t)base64decout[2])<<8) + + base64decout[3]; + uint8_t *out = flib_malloc(unzipLen); + if(out) { + uLongf actualUnzipLen = unzipLen; + int resultcode = uncompress(out, &actualUnzipLen, (Bytef*)(base64decout+4), base64declen-4); + if(resultcode == Z_OK) { + result = out; + *outlen = actualUnzipLen; + out = NULL; + } else { + flib_log_e("Uncompressing drawn map failed. Code: %i", resultcode); + } + } + free(out); + } else { + flib_log_e("base64 decoding of drawn map failed."); + } + free(base64decout); + return result; +}