#ifndef __SDL2RWOPS_H__
#define __SDL2RWOPS_H__

typedef struct SDL2_RWops_s SDL2_RWops_t;   // the actual SDL2 SDL_RWops
#ifdef BOX32
typedef struct my_SDL2_RWops_32_s my_SDL2_RWops_32_t;
#endif
typedef struct x64emu_s x64emu_t;

typedef SDL2_RWops_t* (*sdl2_allocrw)(void);
typedef void (*sdl2_freerw)(SDL2_RWops_t*);

typedef struct SDL2RWSave_s {
    int   anyEmu;
    void* size;
    void* seek;
    void* read;
    void* write;
    void* close;
    void* s1;
    void* s2;
} SDL2RWSave_t;

// each function will be added to dictionary, and each native functions will be wrapped so they run in emulated world
SDL2_RWops_t* AddNativeRW2(x64emu_t* emu, SDL2_RWops_t* ops);
SDL2_RWops_t* RWNativeStart2(x64emu_t* emu, SDL2_RWops_t* ops); // put native RW functions, wrapping the emulated (callback style) ones if needed
void RWNativeEnd2(SDL2_RWops_t* ops);                           // put emulated function back in place
int isRWops(SDL2_RWops_t* ops); // 1 if ops seems to be a valid RWops, 0 if not
#ifdef BOX32
int isRWops32(my_SDL2_RWops_32_t* ops);
#endif

int64_t RWNativeSeek2(SDL2_RWops_t *ops, int64_t offset, int32_t whence);
int64_t RWNativeSize2(SDL2_RWops_t *ops);
size_t RWNativeRead2(SDL2_RWops_t* ops, void* ptr, size_t size, size_t maxnum);
size_t RWNativeWrite2(SDL2_RWops_t *ops, const void *ptr, size_t size, size_t num);
int32_t RWNativeClose2(SDL2_RWops_t* ops);

#endif
