Cog/ThirdParty/libvgm/include/libvgm/utils/DataLoader.h
2022-01-03 01:55:48 -08:00

98 lines
3 KiB
C

#ifndef __DATALOADER_H__
#define __DATALOADER_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "../stdtype.h"
typedef UINT8 (*DLOADCB_GENERIC)(void *context);
typedef void (*DLOADCB_GEN_CALL)(void *context);
typedef UINT32 (*DLOADCB_READ)(void *context, UINT8 *buffer, UINT32 numBytes);
typedef UINT8 (*DLOADCB_SEEK)(void *context, UINT32 offset, UINT8 whence);
typedef INT32 (*DLOADCB_TELL)(void *context);
typedef UINT32 (*DLOADCB_LENGTH)(void *context);
typedef struct _data_loader_callbacks
{
UINT32 type; /* 4-character-code for the file loader */
const char *name; /* human-readable name of the file loader */
DLOADCB_GENERIC dopen; /* open a file, URL, piece of memory, return 0 on success */
DLOADCB_READ dread; /* read bytes into buffer */
DLOADCB_SEEK dseek; /* seek to byte offset */
DLOADCB_GENERIC dclose; /* closes out file, return 0 on success */
DLOADCB_TELL dtell; /* returns the current position of the data */
DLOADCB_LENGTH dlength; /* returns the length of the data, in bytes */
DLOADCB_GENERIC deof; /* determines if we've seen eof or not (return 1 for eof) */
DLOADCB_GEN_CALL ddeinit; /* deinitialize loader and free context, may be NULL */
} DATA_LOADER_CALLBACKS;
enum
{
DLSTAT_EMPTY = 0,
DLSTAT_LOADING = 1,
DLSTAT_LOADED = 2
};
typedef struct _data_loader
{
UINT8 _status;
UINT32 _bytesTotal;
UINT32 _bytesLoaded;
UINT32 _readStopOfs;
UINT8 *_data;
const DATA_LOADER_CALLBACKS *_callbacks;
void *_context;
} DATA_LOADER;
/* calls the dopen and dlength functions
* by default, loads whole file into memory, use
* DataLoader_SetPreloadBytes to change this */
UINT8 DataLoader_Load(DATA_LOADER *loader);
/* Resets the DataLoader (calls DataReader_CancelLoading, unloads data, etc */
UINT8 DataLoader_Reset(DATA_LOADER *loader);
/* Returns a pointer to the DataLoader's memory buffer
* call after any invocation of "Read", "ReadUntil", etc,
* since the memory buffer pointer can change */
UINT8 *DataLoader_GetData(DATA_LOADER *loader);
/* returns _bytesTotal */
UINT32 DataLoader_GetTotalSize(const DATA_LOADER *loader);
/* returns _bytesLoaded */
UINT32 DataLoader_GetSize(const DATA_LOADER *loader);
/* returns _status */
UINT8 DataLoader_GetStatus(const DATA_LOADER *loader);
/* calls dread, then deof
* if deof > 0, also calls CancelLoading (dclose) */
UINT32 DataLoader_Read(DATA_LOADER *loader, UINT32 numBytes);
/* calls dclose */
UINT8 DataLoader_CancelLoading(DATA_LOADER *loader);
/* sets number of bytes to preload */
void DataLoader_SetPreloadBytes(DATA_LOADER *loader, UINT32 byteCount);
/* reads until offset */
void DataLoader_ReadUntil(DATA_LOADER *loader, UINT32 fileOffset);
/* read all data */
void DataLoader_ReadAll(DATA_LOADER *loader);
/* convenience function for MemoryLoader,FileLoader, etc */
void DataLoader_Setup(DATA_LOADER *loader, const DATA_LOADER_CALLBACKS *callbacks, void *context);
/* tear-down function */
void DataLoader_Deinit(DATA_LOADER *loader);
#ifdef __cplusplus
}
#endif
#endif /* __DATALOADER_H__ */