#pragma once
#include "BKDE.h"
#include "ImgUtil.h"
#include "BKParseImage.h"

class CBKDImage
{
	protected:
		IMAGE_ERROR_NUMS m_nLastErrorNumber;
		CFile       m_ImgFile;          //файл образа
		BOOL        m_bFileROMode;      //режим открытия образа, только для чтения == true. или для чтения/записи == false
		CString     m_strStorePath;     //путь, куда будем сохранять файлы

		PARSE_RESULT m_sPImg;           //структура с параметрами

		WORD        m_mBinHeader[2];
		BYTE        m_mSector[512];
		BYTE        m_mBlock[COPY_BLOCK_SIZE];

		DiskCatalog m_sDiskCat;         //структура, куда собрано всё, что касается каталога
		//специально для вьювера, нужны переменные
		LONGLONG    m_tPos;             //начальная позиция в файле
		int         m_tLen;             //начальная длина в файле

	public:
		CBKDImage(const PARSE_RESULT &image);
		virtual ~CBKDImage(void);

		BOOL OpenFile(void);
		void CloseFile(void);
		void Reset(void);
		void SetStorePath(const CString &str);
		inline const CString &GetCurrImgName(void)
		{
			return m_sPImg.strName;
		}
		inline BOOL GetImageOpenStatus(void)
		{
			return m_bFileROMode;
		}
		inline ULONGLONG GetBaseOffset(void)
		{
			return m_sPImg.nBaseOffset;
		}
		inline ULONGLONG GetImgSize(void)
		{
			return m_sPImg.imageSize;
		}
		inline IMAGE_TYPES GetImgOSType(void)
		{
			return m_sPImg.imageOSType;
		}
		inline BOOL isImageBootable(void)
		{
			return m_sPImg.bImageBootable;
		}

		/*
		получение параметров файла или директории из текущей директории
		выход - FALSE - конец, имена кончились
		TRUE - ещё не конец, есть ещё имена в директории
		*/
		BOOL GetStartFileName(FileRecord *sFile, int nDirNum);
		BOOL GetNextFileName(FileRecord *sFile, int nDirNum);

		//виртуальные функции
		//прочитаем весь каталог в массив
		virtual BOOL ReadCatalog();
		//выдадим информацию о диске
		virtual CString GetInfo();
		//извлечение файла из образа
		virtual BOOL ExtractObject(FileRecord *sFile, BOOL bExtractAsBin = FALSE, BOOL bExtractLog = FALSE);
		virtual BOOL ExtractFile(FileRecord *sFile, BOOL bExtractAsBin = FALSE, BOOL bExtractLog = FALSE);
		//просмотр файла из образа
		virtual BOOL ViewFile(FileRecord *sFile);
		virtual BOOL ViewFileAsSprite(FileRecord *sFile);
		//добавление файла в образ
		virtual FILESAVE_STATUS AddFile(const CString &str, int nDirNum, BOOL bAddAsBin = FALSE);
		//удаление файла из образа
		virtual BOOL DeleteFile(FileRecord *sFile)
		{
			return FALSE;
		}

		/*
		нужно ещё: Создание директории / Удаление директории
		и вообще можно подумать над стандартным набором файловых операций:
		создание файла, открытие файла, удаление файла, запись в файл, чтение из файла
		*/

		//получение данных специфических для заданной ОС
		//возвращает 0, если спец данных нету, или ID строки в файле ресурсов, если есть. Предполагается, что ID не может быть 0
		virtual UINT HasSpecificData(void) const
		{
			return 0;
		}
		virtual CString GetSpecificData(DWORD dd)
		{
			return _T("");
		}

	protected:
		virtual void SaveCurrPos(CFile *f, int len);
		virtual int SeekToPos(CFile *f, int pos);
		virtual BOOL SeekToBeginFile(CFile *f, FileRecord *fr);
		virtual BYTE GetByte(CFile *f, int *len);
		virtual WORD GetWord(CFile *f, int *len);
		virtual void PutTchar(CFile *f, TCHAR tch, int &counter);

		BOOL AnalyseImportFile(AnalyseFileStr *pAFS);
		BOOL AnalyseExportFile(AnalyseFileStr *pAFS);
};

