Refactor: polymorphically call CImageHelperBase Open() & Close()

This commit is contained in:
tomcw 2016-10-25 22:26:28 +01:00
parent 31483b33b9
commit 3edb78203e
4 changed files with 18 additions and 11 deletions

View File

@ -43,10 +43,12 @@ ImageError_e ImageOpen( LPCTSTR pszImageFilename,
bool* pWriteProtected,
const bool bCreateIfNecessary,
std::string& strFilenameInZip,
const bool bExpectFloppy /*=true*/,
const bool bIsHarddisk /*=false*/)
const bool bExpectFloppy /*=true*/)
{
if (! (pszImageFilename && ppImageInfo && pWriteProtected && sg_DiskImageHelper.GetWorkBuffer()))
if (bExpectFloppy && sg_DiskImageHelper.GetWorkBuffer() == NULL)
return eIMAGE_ERROR_BAD_POINTER;
if (! (pszImageFilename && ppImageInfo && pWriteProtected))
return eIMAGE_ERROR_BAD_POINTER;
// CREATE A RECORD FOR THE FILE
@ -57,11 +59,10 @@ ImageError_e ImageOpen( LPCTSTR pszImageFilename,
ZeroMemory(*ppImageInfo, sizeof(ImageInfo));
ImageInfo* pImageInfo = *ppImageInfo;
pImageInfo->bWriteProtected = *pWriteProtected;
if (bExpectFloppy) pImageInfo->pImageHelper = &sg_DiskImageHelper;
else pImageInfo->pImageHelper = &sg_HardDiskImageHelper;
ImageError_e Err = (!bIsHarddisk)
? sg_DiskImageHelper.Open(pszImageFilename, pImageInfo, bCreateIfNecessary, strFilenameInZip)
: sg_HardDiskImageHelper.Open(pszImageFilename, pImageInfo, bCreateIfNecessary, strFilenameInZip);
ImageError_e Err = pImageInfo->pImageHelper->Open(pszImageFilename, pImageInfo, bCreateIfNecessary, strFilenameInZip);
if (Err != eIMAGE_ERROR_NONE)
{
ImageClose(*ppImageInfo, true);
@ -78,6 +79,10 @@ ImageError_e ImageOpen( LPCTSTR pszImageFilename,
// THE FILE MATCHES A KNOWN FORMAT
_ASSERT(bExpectFloppy);
if (!bExpectFloppy)
return eIMAGE_ERROR_UNSUPPORTED;
pImageInfo->uNumTracks = sg_DiskImageHelper.GetNumTracksInImage(pImageInfo->pImageType);
for (UINT uTrack = 0; uTrack < pImageInfo->uNumTracks; uTrack++)
@ -108,7 +113,7 @@ void ImageClose(ImageInfo* const pImageInfo, const bool bOpenError /*=false*/)
}
}
sg_DiskImageHelper.Close(pImageInfo, bDeleteFile);
pImageInfo->pImageHelper->Close(pImageInfo, bDeleteFile);
VirtualFree(pImageInfo, 0, MEM_RELEASE);
}

View File

@ -63,7 +63,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
struct ImageInfo;
ImageError_e ImageOpen(LPCTSTR pszImageFilename, ImageInfo** ppImageInfo, bool* pWriteProtected, const bool bCreateIfNecessary, std::string& strFilenameInZip, const bool bExpectFloppy=true, const bool bIsHarddisk=false);
ImageError_e ImageOpen(LPCTSTR pszImageFilename, ImageInfo** ppImageInfo, bool* pWriteProtected, const bool bCreateIfNecessary, std::string& strFilenameInZip, const bool bExpectFloppy=true);
void ImageClose(ImageInfo* const pImageInfo, const bool bOpenError=false);
BOOL ImageBoot(ImageInfo* const pImageInfo);
void ImageDestroy(void);

View File

@ -13,12 +13,15 @@ enum eImageType {eImageUNKNOWN, eImageDO, eImagePO, eImageNIB1, eImageNIB2, eIma
enum eDetectResult {eMismatch, ePossibleMatch, eMatch};
class CImageBase;
class CImageHelperBase;
enum FileType_e {eFileNormal, eFileGZip, eFileZip};
struct ImageInfo
{
TCHAR szFilename[MAX_PATH];
CImageBase* pImageType;
CImageHelperBase* pImageHelper;
FileType_e FileType;
HANDLE hFile;
DWORD uOffset;

View File

@ -363,8 +363,7 @@ static BOOL HD_Insert(const int iDrive, LPCTSTR pszImageFilename)
&g_HardDisk[iDrive].bWriteProtected,
bCreateIfNecessary,
g_HardDisk[iDrive].strFilenameInZip, // TODO: Use this
bExpectFloppy,
bIsHarddisk);
bExpectFloppy);
g_HardDisk[iDrive].hd_imageloaded = (Error == eIMAGE_ERROR_NONE);