Img3Element *readImg3Element(AbstractFile * file) { Img3Element *toReturn; AppleImg3Header *header; off_t curPos; curPos = file->tell(file); header = (AppleImg3Header *) malloc(sizeof(AppleImg3Header)); file->read(file, header, sizeof(AppleImg3Header)); flipAppleImg3Header(header); toReturn = (Img3Element *) malloc(sizeof(Img3Element)); toReturn->header = header; toReturn->next = NULL; switch (header->magic) { case IMG3_MAGIC: readImg3Root(file, toReturn); break; case IMG3_KBAG_MAGIC: toReturn->data = (unsigned char *)malloc(header->dataSize); toReturn->write = writeImg3KBAG; toReturn->free = freeImg3Default; file->read(file, toReturn->data, header->dataSize); flipAppleImg3KBAGHeader((AppleImg3KBAGHeader *) toReturn->data); break; default: { uint32_t sz = header->size - sizeof(AppleImg3Header); /* header->dataSize */ toReturn->data = (unsigned char *)malloc(sz); toReturn->write = writeImg3Default; toReturn->free = freeImg3Default; file->read(file, toReturn->data, sz); } } file->seek(file, curPos + toReturn->header->size); return toReturn; }
void writeImg3KBAG(AbstractFile* file, Img3Element* element, Img3Info* info) { flipAppleImg3KBAGHeader((AppleImg3KBAGHeader*) element->data); writeImg3Default(file, element, info); flipAppleImg3KBAGHeader((AppleImg3KBAGHeader*) element->data); }