#ifndef SFOFILE_HPP
#define SFOFILE_HPP

// Détection du système cible...
#include "usgeDetectSystem.h"

namespace USpeedGameEngine
{

class SfoFile
{
    /****************
    * Les attributs *
    ****************/
    public :
        /**
         * Structure de stockage des informations d'une section dans un fichier SFO.
         */
        struct SfoSection
        {
            unsigned char label[2];             //!< ?
            unsigned char rfu001;               //!< ?
            unsigned char dataType;             //!< ?
            unsigned long int datafieldUsed;    //!< ?
            unsigned long int datafieldSize;    //!< ?
            unsigned long int data;             //!< ?
        };

    protected :
    private :
        unsigned long int sectionsCount;        //!< Nombre de sections lues
        struct SfoFile::SfoSection *sections;   //!< Liste des sections SFO
        unsigned long int dataPosition;         //!< Position des données dans le fichier SFO
        unsigned char *data;                    //!< Le fichier SFO en lui-même ("fread" complet)
        unsigned long int dataSize;             //!< Taille de "sfoData" (les données lues dans le fichier SFO)
        unsigned long int currentSection;       //!< Section actuelle
        bool nextFirstCall;                     //!< Permet de savoir si c'est la première fois que l'on appelle "nextSection"

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur de la classe
        SfoFile();
        // Destructeur de la classe
        ~SfoFile();
        // Charge le fichier SFO spécifié
        bool load(const char *filename);
        // Retourne le nombre de sections SFO disponibles à la lecture
        unsigned long int getSectionsCount();
        // Remet le pointeur de parcours des sections à zéro
        void resetIterator();
        // Sélectionne la section suivante (retourne "false" si c'est la dernière section)
        bool nextSection();
        // Choisit la section courante
        bool selectSection(unsigned long int mySection);
        // Retourne les données SFO de la section courante
        const unsigned char *getData();
        // Retourne le type de données de la section courante
        unsigned char getDataType();
        // Retourne la taille des données de la section courante
        unsigned long int getDataSize();
    protected :
    private :
        // Efface tout
        void reset();
};

}        // Fin "namespace USpeedGameEngine"

#endif
