/** * Load disk image from a .ZIP archive into memory, set the number * of bytes loaded into pImageSize and return the data or NULL on error. */ Uint8 *ZIP_ReadDisk(const char *pszFileName, const char *pszZipPath, long *pImageSize) { uLong ImageSize=0; unzFile uf=NULL; Uint8 *buf; char *path; int nDiskType = -1; Uint8 *pDiskBuffer = NULL; *pImageSize = 0; uf = unzOpen(pszFileName); if (uf == NULL) { Log_Printf(LOG_ERROR, "Cannot open %s\n", pszFileName); return NULL; } if (pszZipPath == NULL || pszZipPath[0] == 0) { path = ZIP_FirstFile(pszFileName, pszDiskNameExts); if (path == NULL) { Log_Printf(LOG_ERROR, "Cannot open %s\n", pszFileName); unzClose(uf); return NULL; } } else { path = malloc(ZIP_PATH_MAX); if (path == NULL) { perror("ZIP_ReadDisk"); unzClose(uf); return NULL; } strncpy(path, pszZipPath, ZIP_PATH_MAX); path[ZIP_PATH_MAX-1] = '\0'; } ImageSize = ZIP_CheckImageFile(uf, path, ZIP_PATH_MAX, &nDiskType); if (ImageSize <= 0) { unzClose(uf); free(path); return NULL; } /* extract to buf */ buf = ZIP_ExtractFile(uf, path, ImageSize); unzCloseCurrentFile(uf); unzClose(uf); free(path); path = NULL; if (buf == NULL) { return NULL; /* failed extraction, return error */ } switch(nDiskType) { case ZIP_FILE_MSA: /* uncompress the MSA file */ // pDiskBuffer = MSA_UnCompress(buf, (long *)&ImageSize); free(buf); buf = NULL; break; case ZIP_FILE_DIM: /* Skip DIM header */ ImageSize -= 32; memmove(buf, buf+32, ImageSize); /* ...and passthrough */ case ZIP_FILE_ST: /* ST image => return buffer directly */ pDiskBuffer = buf; break; } if (pDiskBuffer) { *pImageSize = ImageSize; } return pDiskBuffer; }
/** * Load disk image from a .ZIP archive into memory, set the number * of bytes loaded into pImageSize and return the data or NULL on error. */ Uint8 *ZIP_ReadDisk(int Drive, const char *pszFileName, const char *pszZipPath, long *pImageSize, int *pImageType) { uLong ImageSize=0; unzFile uf=NULL; Uint8 *buf; char *path; Uint8 *pDiskBuffer = NULL; *pImageSize = 0; *pImageType = FLOPPY_IMAGE_TYPE_NONE; uf = unzOpen(pszFileName); if (uf == NULL) { Log_Printf(LOG_ERROR, "Cannot open %s\n", pszFileName); return NULL; } if (pszZipPath == NULL || pszZipPath[0] == 0) { path = ZIP_FirstFile(pszFileName, pszDiskNameExts); if (path == NULL) { Log_Printf(LOG_ERROR, "Cannot open %s\n", pszFileName); unzClose(uf); return NULL; } } else { path = malloc(ZIP_PATH_MAX); if (path == NULL) { perror("ZIP_ReadDisk"); unzClose(uf); return NULL; } strncpy(path, pszZipPath, ZIP_PATH_MAX); path[ZIP_PATH_MAX-1] = '\0'; } ImageSize = ZIP_CheckImageFile(uf, path, ZIP_PATH_MAX, pImageType); if (ImageSize <= 0) { unzClose(uf); free(path); return NULL; } /* extract to buf */ buf = ZIP_ExtractFile(uf, path, ImageSize); unzCloseCurrentFile(uf); unzClose(uf); free(path); path = NULL; if (buf == NULL) { return NULL; /* failed extraction, return error */ } switch(*pImageType) { case FLOPPY_IMAGE_TYPE_IPF: #ifndef HAVE_CAPSIMAGE Log_AlertDlg(LOG_ERROR, "This version of Hatari was not built with IPF support, this disk image can't be handled."); return NULL; #else /* return buffer */ pDiskBuffer = buf; break; #endif case FLOPPY_IMAGE_TYPE_STX: /* return buffer */ pDiskBuffer = buf; break; case FLOPPY_IMAGE_TYPE_MSA: /* uncompress the MSA file */ pDiskBuffer = MSA_UnCompress(buf, (long *)&ImageSize, ImageSize); free(buf); buf = NULL; break; case FLOPPY_IMAGE_TYPE_DIM: /* Skip DIM header */ ImageSize -= 32; memmove(buf, buf+32, ImageSize); /* return buffer */ pDiskBuffer = buf; break; case FLOPPY_IMAGE_TYPE_ST: /* ST image => return buffer directly */ pDiskBuffer = buf; break; } if (pDiskBuffer) { *pImageSize = ImageSize; } return pDiskBuffer; }