#ifndef __IReader_H
#define __IReader_H

#include "IStream.h"

// on exit b is non zero when it still needs some data
typedef const _kernel_oserror* (*Reader_Open)(IStream* s, const _kernel_swi_regs* r);
typedef bool (*Reader_DelayIO)(IStream* s);
typedef const _kernel_oserror* (*Reader_Fill)(IStream* s);
typedef const _kernel_oserror* (*Reader_Seek)(IStream* s, int byteoffset);
typedef const _kernel_oserror* (*Reader_SetPos)(IStream* s, int byteoffset);
typedef const _kernel_oserror* (*Reader_Close)(IStream* s);

struct IReader
{
	Reader_Open      Open;
	Reader_DelayIO   DelayIO;
	Reader_Fill      Fill;
	Reader_Seek      Seek;
	Reader_SetPos    SetPos;
	Reader_Close     Close;
};

const _kernel_oserror* FromFile_SetPos(IStream* s, int byteoffset);
const _kernel_oserror* FromFile_Read(IStream* s, void* p, int size);

extern IReader FromDesc;
extern IReader FromFile;
extern IReader FromFileExt;
extern IReader FromHttp;
extern IReader FromCD;

#endif
