Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}