/** * Check an image file in the archive, return the uncompressed length */ static long ZIP_CheckImageFile(unzFile uf, char *filename, int namelen, int *pImageType) { unz_file_info file_info; if (unzLocateFile(uf,filename, 0) != UNZ_OK) { Log_Printf(LOG_ERROR, "Error: File \"%s\" not found in the archive!\n", filename); return -1; } if (unzGetCurrentFileInfo(uf, &file_info, filename, namelen, NULL, 0, NULL, 0) != UNZ_OK) { Log_Printf(LOG_ERROR, "Error with zipfile in unzGetCurrentFileInfo\n"); return -1; } /* check for .stx, .ipf, .msa, .dim or .st extension */ if (STX_FileNameIsSTX(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_STX; return file_info.uncompressed_size; } if (IPF_FileNameIsIPF(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_IPF; return file_info.uncompressed_size; } if (MSA_FileNameIsMSA(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_MSA; return file_info.uncompressed_size; } if (ST_FileNameIsST(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_ST; return file_info.uncompressed_size; } if (DIM_FileNameIsDIM(filename, false)) { *pImageType = FLOPPY_IMAGE_TYPE_DIM; return file_info.uncompressed_size; } Log_Printf(LOG_ERROR, "Not an .ST, .MSA, .DIM, .IPF or .STX file.\n"); return 0; }
/** * Eject disk from floppy drive, save contents back to PCs hard-drive if * they have been changed. * Return true if there was something to eject. */ bool Floppy_EjectDiskFromDrive(int Drive) { bool bEjected = false; /* Does our drive have a disk in? */ if (EmulationDrives[Drive].bDiskInserted) { bool bSaved = false; char *psFileName = EmulationDrives[Drive].sFileName; /* OK, has contents changed? If so, need to save */ if (EmulationDrives[Drive].bContentsChanged) { /* Is OK to save image (if boot-sector is bad, don't allow a save) */ if (EmulationDrives[Drive].bOKToSave) { /* Save as .MSA, .ST, .DIM, .IPF or .STX image? */ if (MSA_FileNameIsMSA(psFileName, true)) bSaved = MSA_WriteDisk(Drive, psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (ST_FileNameIsST(psFileName, true)) bSaved = ST_WriteDisk(Drive, psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (DIM_FileNameIsDIM(psFileName, true)) bSaved = DIM_WriteDisk(Drive, psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (IPF_FileNameIsIPF(psFileName, true)) bSaved = IPF_WriteDisk(Drive, psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (STX_FileNameIsSTX(psFileName, true)) bSaved = STX_WriteDisk(Drive, psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); else if (ZIP_FileNameIsZIP(psFileName)) bSaved = ZIP_WriteDisk(Drive, psFileName, EmulationDrives[Drive].pBuffer, EmulationDrives[Drive].nImageBytes); if (bSaved) Log_Printf(LOG_INFO, "Updated the contents of floppy image '%s'.", psFileName); else Log_Printf(LOG_INFO, "Writing of this format failed or not supported, discarded the contents\n of floppy image '%s'.", psFileName); } else Log_Printf(LOG_INFO, "Writing not possible, discarded the contents of floppy image\n '%s'.", psFileName); } /* Inform user that disk has been ejected! */ Log_Printf(LOG_INFO, "Floppy %c: has been removed from drive.", 'A'+Drive); Floppy_DriveTransitionSetState ( Drive , FLOPPY_DRIVE_TRANSITION_STATE_EJECT ); FDC_EjectFloppy ( Drive ); bEjected = true; } /* Free data used by this IPF image */ if ( EmulationDrives[Drive].ImageType == FLOPPY_IMAGE_TYPE_IPF ) IPF_Eject ( Drive ); /* Free data used by this STX image */ else if ( EmulationDrives[Drive].ImageType == FLOPPY_IMAGE_TYPE_STX ) STX_Eject ( Drive ); /* Drive is now empty */ if (EmulationDrives[Drive].pBuffer != NULL) { free(EmulationDrives[Drive].pBuffer); EmulationDrives[Drive].pBuffer = NULL; } EmulationDrives[Drive].sFileName[0] = '\0'; EmulationDrives[Drive].ImageType = FLOPPY_IMAGE_TYPE_NONE; EmulationDrives[Drive].nImageBytes = 0; EmulationDrives[Drive].bDiskInserted = false; EmulationDrives[Drive].bContentsChanged = false; EmulationDrives[Drive].bOKToSave = false; return bEjected; }
/** * Insert previously set disk file image into floppy drive. * The WHOLE image is copied into Hatari drive buffers, and * uncompressed if necessary. * Return TRUE on success, false otherwise. */ bool Floppy_InsertDiskIntoDrive(int Drive) { long nImageBytes = 0; char *filename; int ImageType = FLOPPY_IMAGE_TYPE_NONE; /* Eject disk, if one is inserted (doesn't inform user) */ assert(Drive >= 0 && Drive < MAX_FLOPPYDRIVES); Floppy_EjectDiskFromDrive(Drive); filename = ConfigureParams.DiskImage.szDiskFileName[Drive]; if (!filename[0]) { return true; /* only do eject */ } if (!File_Exists(filename)) { Log_AlertDlg(LOG_INFO, "Image '%s' not found", filename); return false; } /* Check disk image type and read the file: */ if (MSA_FileNameIsMSA(filename, true)) EmulationDrives[Drive].pBuffer = MSA_ReadDisk(Drive, filename, &nImageBytes, &ImageType); else if (ST_FileNameIsST(filename, true)) EmulationDrives[Drive].pBuffer = ST_ReadDisk(Drive, filename, &nImageBytes, &ImageType); else if (DIM_FileNameIsDIM(filename, true)) EmulationDrives[Drive].pBuffer = DIM_ReadDisk(Drive, filename, &nImageBytes, &ImageType); else if (IPF_FileNameIsIPF(filename, true)) EmulationDrives[Drive].pBuffer = IPF_ReadDisk(Drive, filename, &nImageBytes, &ImageType); else if (STX_FileNameIsSTX(filename, true)) EmulationDrives[Drive].pBuffer = STX_ReadDisk(Drive, filename, &nImageBytes, &ImageType); else if (ZIP_FileNameIsZIP(filename)) { const char *zippath = ConfigureParams.DiskImage.szDiskZipPath[Drive]; EmulationDrives[Drive].pBuffer = ZIP_ReadDisk(Drive, filename, zippath, &nImageBytes, &ImageType); } if ( (EmulationDrives[Drive].pBuffer == NULL) || ( ImageType == FLOPPY_IMAGE_TYPE_NONE ) ) { return false; } /* For IPF, call specific function to handle the inserted image */ if ( ImageType == FLOPPY_IMAGE_TYPE_IPF ) { if ( IPF_Insert ( Drive , EmulationDrives[Drive].pBuffer , nImageBytes ) == false ) { free ( EmulationDrives[Drive].pBuffer ); return false; } } /* For STX, call specific function to handle the inserted image */ else if ( ImageType == FLOPPY_IMAGE_TYPE_STX ) { if ( STX_Insert ( Drive , filename , EmulationDrives[Drive].pBuffer , nImageBytes ) == false ) { free ( EmulationDrives[Drive].pBuffer ); return false; } } /* Store image filename (required for ejecting the disk later!) */ strcpy(EmulationDrives[Drive].sFileName, filename); /* Store size and set drive states */ EmulationDrives[Drive].ImageType = ImageType; EmulationDrives[Drive].nImageBytes = nImageBytes; EmulationDrives[Drive].bDiskInserted = true; EmulationDrives[Drive].bContentsChanged = false; if ( ( ImageType == FLOPPY_IMAGE_TYPE_ST ) || ( ImageType == FLOPPY_IMAGE_TYPE_MSA ) || ( ImageType == FLOPPY_IMAGE_TYPE_DIM ) ) EmulationDrives[Drive].bOKToSave = Floppy_IsBootSectorOK(Drive); else if ( ImageType == FLOPPY_IMAGE_TYPE_STX ) EmulationDrives[Drive].bOKToSave = true; else if ( ImageType == FLOPPY_IMAGE_TYPE_IPF ) EmulationDrives[Drive].bOKToSave = false; else EmulationDrives[Drive].bOKToSave = false; Floppy_DriveTransitionSetState ( Drive , FLOPPY_DRIVE_TRANSITION_STATE_INSERT ); FDC_InsertFloppy ( Drive ); Log_Printf(LOG_INFO, "Inserted disk '%s' to drive %c:.", filename, 'A'+Drive); return true; }