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; }
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; }