Esempio n. 1
0
io_func* openDmgFile(AbstractFile* abstractIn) {
	off_t fileLength;
	DMG* dmg;	
	ResourceData* blkx;
	ResourceData* curData;
	
	io_func* toReturn;

	if(abstractIn == NULL) {
		return NULL;
	}

    dmg = (DMG*) malloc(sizeof(DMG));
	dmg->dmg = abstractIn;

	fileLength = abstractIn->getLength(abstractIn);
	abstractIn->seek(abstractIn, fileLength - sizeof(UDIFResourceFile));
	readUDIFResourceFile(abstractIn, &dmg->resourceFile);
	
    dmg->resourceXML = malloc(dmg->resourceFile.fUDIFXMLLength + 1);
    ASSERT( abstractIn->seek(abstractIn, (off_t)(dmg->resourceFile.fUDIFXMLOffset)) == 0, "fseeko" );
    ASSERT( abstractIn->read(abstractIn, dmg->resourceXML, (size_t)dmg->resourceFile.fUDIFXMLLength) == (size_t)dmg->resourceFile.fUDIFXMLLength, "fread" );
    dmg->resourceXML[dmg->resourceFile.fUDIFXMLLength] = 0;
    
	dmg->resources = readResources(dmg->resourceXML, dmg->resourceFile.fUDIFXMLLength);
	dmg->numBLKX = 0;
	
	blkx = (getResourceByKey(dmg->resources, "blkx"))->data;
	
	curData = blkx;
	while(curData != NULL) {
		dmg->numBLKX++;
		curData = curData->next;	
	}
	
	dmg->blkx = (BLKXTable**) malloc(sizeof(BLKXTable*) * dmg->numBLKX);
	
	int i = 0;
	while(blkx != NULL) {
		dmg->blkx[i] = (BLKXTable*)(blkx->data);
		i++;
		blkx = blkx->next;
	}

	dmg->offset = 0;
	dmg->runType = BLOCK_TERMINATOR; // causes cacheOffset on first read attempt
	dmg->runData = NULL;

	toReturn = (io_func*) malloc(sizeof(io_func));
	
	toReturn->data = dmg;
	toReturn->read = &dmgFileRead;
	toReturn->write = &dmgFileWrite;
	toReturn->close = &closeDmgFile;
	
	return toReturn;
}
Esempio n. 2
0
File: dmgfile.c Progetto: Ormu/xpwn
io_func* openDmgFile(AbstractFile* abstractIn) {
	off_t fileLength;
	UDIFResourceFile resourceFile;
	DMG* dmg;	
	ResourceData* blkx;
	ResourceData* curData;
	int i;
	
	io_func* toReturn;

	if(abstractIn == NULL) {
		return NULL;
	}
	
	fileLength = abstractIn->getLength(abstractIn);
	abstractIn->seek(abstractIn, fileLength - sizeof(UDIFResourceFile));
	readUDIFResourceFile(abstractIn, &resourceFile);
	
	dmg = (DMG*) malloc(sizeof(DMG));
	dmg->dmg = abstractIn;
	dmg->resources = readResources(abstractIn, &resourceFile);
	dmg->numBLKX = 0;
	
	blkx = (getResourceByKey(dmg->resources, "blkx"))->data;
	
	curData = blkx;
	while(curData != NULL) {
		dmg->numBLKX++;
		curData = curData->next;	
	}
	
	dmg->blkx = (BLKXTable**) malloc(sizeof(BLKXTable*) * dmg->numBLKX);
	
	i = 0;
	while(blkx != NULL) {
		dmg->blkx[i] = (BLKXTable*)(blkx->data);
		i++;
		blkx = blkx->next;
	}

	dmg->offset = 0;
	
	dmg->runData = NULL;
	cacheOffset(dmg, 0);
	
	toReturn = (io_func*) malloc(sizeof(io_func));
	
	toReturn->data = dmg;
	toReturn->read = &dmgFileRead;
	toReturn->write = &dmgFileWrite;
	toReturn->close = &closeDmgFile;
	
	return toReturn;
}