void download_block(char* paramDir, struct carousel *car, struct module *mod, uint16_t block, unsigned char *data, uint32_t length) { /* assert */ if(block >= mod->nblocks) { error("download_block: moduleId=%u block=%u nblocks=%u", mod->module_id, block, mod->nblocks); return; } /* have we already got it */ if(mod->got_block[block]) return; mod->got_block[block] = true; memcpy(mod->data + (block * mod->block_size), data, length); mod->blocks_left --; verbose("download_block: module=%u block=%u left=%u", mod->module_id, block, mod->blocks_left); /* have we got it all yet */ if(mod->blocks_left == 0) { verbose("got module %u (size=%u)", mod->module_id, mod->size); /* if it doesn't start with 'BIOP' assume it is compressed */ if(strncmp(mod->data, BIOP_MAGIC_STR, BIOP_MAGIC_LEN) != 0) { vhexdump(mod->data, mod->size); uncompress_module(mod); verbose("uncompressed size=%u", mod->size); } if(process_biop(paramDir, car, mod, (struct BIOPMessageHeader *) mod->data, mod->size)) { /* we can free the data now, keep got_block so we don't download it again */ safe_free(mod->data); /* delete_module may safe_free it again */ mod->data = NULL; } else { /* failed to process it, try downloading it again */ mod->blocks_left = mod->nblocks; /* assumes false == 0 */ bzero(mod->got_block, mod->nblocks * sizeof(bool)); } } return; }
int process_ddb(char* paramDir, struct carousel *car, struct DownloadDataBlock *ddb, uint32_t downloadId, uint32_t blockLength) { unsigned char *block; struct module *mod; int processed = 0; verbose("DownloadDataBlock "); vverbose("downloadId: %u", downloadId); verbose("moduleId: %u", ntohs(ddb->moduleId)); vverbose("moduleVersion: %u", ddb->moduleVersion); verbose("blockNumber: %u", ntohs(ddb->blockNumber)); vverbose("blockLength: %u", blockLength); block = DDB_blockDataByte(ddb); vhexdump(block, blockLength); if((mod = find_module(car, ntohs(ddb->moduleId), ddb->moduleVersion, downloadId)) != NULL) { download_block(paramDir, car, mod, ntohs(ddb->blockNumber), block, blockLength); processed = 1; } return processed; }