#ifndef XBOX_PORTABLE_H_INCLUDED
#define XBOX_PORTABLE_H_INCLUDED

#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#define XBOX_PORTABLE_TITLE_MAX 256
#define XBOX_PORTABLE_MEDIA_ID_MAX 64
#define XBOX_PORTABLE_REGION_MAX 128

typedef int (*xbox_portable_read10_func)(void *context,
                                         uint32_t lba,
                                         uint32_t sectors,
                                         unsigned char *buffer,
                                         size_t buffer_size);

typedef int (*xbox_portable_read_structure_func)(void *context,
                                                  uint8_t format,
                                                  uint8_t layer,
                                                  unsigned char *buffer,
                                                  size_t buffer_size);

typedef struct xbox_portable_metadata_s {
    int valid;
    uint32_t xdfs_volume_lba;
    uint32_t title_id;
    uint32_t allowed_media;
    uint32_t game_region;
    uint32_t game_ratings;
    uint32_t disc_number;
    uint32_t version;
    int have_game_region;
    char title[XBOX_PORTABLE_TITLE_MAX];
    char media_id[XBOX_PORTABLE_MEDIA_ID_MAX];
    char region[XBOX_PORTABLE_REGION_MAX];
} xbox_portable_metadata;

struct disc_s;

void xbox_portable_metadata_init(xbox_portable_metadata *metadata);
int xbox_portable_read_metadata(xbox_portable_read10_func read10,
                                xbox_portable_read_structure_func read_structure,
                                void *context,
                                xbox_portable_metadata *metadata);
int xbox_portable_read_metadata_from_disc(struct disc_s *disc,
                                          xbox_portable_metadata *metadata);

#ifdef __cplusplus
}
#endif

#endif
