#define WM_CONVERT_SIZE     WM_USER+200
#define WM_CONVERT_PROGRESS WM_USER+201
#define WM_CONVERT_ERROR    WM_USER+202
#define WM_CONVERT_DONE     WM_USER+203

#define WriteInteger(a, c) \
	x = a; \
	for (i = 0; i < c; i++) \
		fwrite(&x, 1, 4, out)

#define WriteChar(a, c) \
	for (i = 0; i < c; i++) \
		fputc(a, out)

#define WriteRandom(c) \
	for (i = 0; i < c; i++) \
	{ \
		x = rand(); \
		fwrite(&x, 1, 4, out); \
	}


#pragma pack(1)
typedef struct
{
	unsigned int signature;
	unsigned int version;
	unsigned int fields_table_offs;
	unsigned int values_table_offs;
	int nitems;
} SFOHeader;
#pragma pack()

#pragma pack(1)
typedef struct
{
	unsigned short field_offs;
	unsigned char  unk;
	unsigned char  type; // 0x2 -> string, 0x4 -> number
	unsigned int length;
	unsigned int size;
	unsigned short val_offs;
	unsigned short unk4;
} SFODir;
#pragma pack()

#pragma pack(1)
typedef struct
{
	unsigned int offset;
	unsigned int length;
	unsigned int dummy[6];
} IsoIndex;
#pragma pack()

//---

typedef struct {
	char newData;
	DWORD dataPosition;
} PatchData;

typedef struct {
	char fileCount;
	char srcISO1[0xFF];
	char srcISO2[0xFF];
	char srcISO3[0xFF];
	char srcISO4[0xFF];
	char gameTitle1[0xFF];
	char gameTitle2[0xFF];
	char gameTitle3[0xFF];
	char gameTitle4[0xFF];
	char gameID1[0xFF];
	char gameID2[0xFF];
	char gameID3[0xFF];
	char gameID4[0xFF];
} MultiDiscInfo;

typedef struct {
	HWND callback;
	char base[0xFF];
	char data_psp[0xFF];
	char srcISO[0xFF];
  char dstPBP[0xFF];
	char pic0[0xFF];
	char pic1[0xFF];
	char icon0[0xFF];
	char icon1[0xFF];
	char snd0[0xFF];
	char boot[0xFF];
	bool srcIsPbp;

	char gameTitle[0xFF];
	char saveTitle[0xFF];
	char gameID[0xFF];
	char saveID[0xFF];
	int compLevel;

	int tocSize;
	void* tocData;

	MultiDiscInfo multiDiscInfo;

	int patchCount;
	PatchData *patchData;
} ConvertIsoInfo;

HANDLE popstationConvert(ConvertIsoInfo info);
void popstationCancel();