/*  ecma119.h

 *  Copyright (C) 2002-2005  PCSX2 Team

 *

 *  This program is free software; you can redistribute it and/or modify

 *  it under the terms of the GNU General Public License as published by

 *  the Free Software Foundation; either version 2 of the License, or

 *  (at your option) any later version.

 *

 *  This program is distributed in the hope that it will be useful,

 *  but WITHOUT ANY WARRANTY; without even the implied warranty of

 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 *  GNU General Public License for more details.

 *

 *  You should have received a copy of the GNU General Public License

 *  along with this program; if not, write to the Free Software

 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 *

 *  PCSX2 members can be contacted through their website at www.pcsx2.net.

 */





#ifndef ECMA119_H

#define ECMA119_H





// #ifndef __LINUX__

// #ifdef __linux__

// #define __LINUX__

// #endif /* __linux__ */

// #endif /* No __LINUX__ */



// #define CDVDdefs

// #include "PS2Edefs.h"





// ECMA119 was sent to ISO to be fast-tracked into ISO 9660

// ECMA119 can be found at http://www.ecma.ch, somewhere.



// Throughout these definitions, number pairs in both big-endian and

//   little-endian varieties are stored next to each other. To separate

//   the pairs a 'le' suffix has been attached to little-endian numbers, and

//   a 'be' suffix to big-endian ones.



// All 'unused' entries should be set to (or tested for) 0x00.





#ifdef _WIN32

#pragma pack(1)

#endif /* _WIN32 */



struct ECMA119ASCIITime {

  char year[4];

  char month[2];

  char day[2];

  char hour[2];

  char min[2];

  char sec[2];

  char hundredthsec[2];

  char offsetgmt; // 15 min intervals, from -48 to +52

#ifdef _WIN32

};

#else

} __attribute__ ((packed));

#endif /* _WIN32 */



struct ECMA119DateTime {

  unsigned char year; // 1900+year, that is.

  unsigned char month;

  unsigned char day;

  unsigned char hour;

  unsigned char minute;

  unsigned char sec;

  signed char offsetgmt; // In 15 min intervals, from -48 to +52

#ifdef _WIN32

};

#else

} __attribute__ ((packed));

#endif /* _WIN32 */



struct ECMA119DirectoryRecord {

  unsigned char reclen; // Length of this record

  unsigned char attlen; // Extended Attribute Record Length



  unsigned long externlocle; // Location of Extent

  unsigned long externlocbe;



  struct ECMA119DateTime recorded; // Recording Date and Time



  unsigned char flags; // File Flags

  unsigned char interleave; // Interleave Gap Size



  unsigned short seqnole; // Volume Sequence No.

  unsigned short seqnobe;



  unsigned short idlen;

  char id[223];

  // Note: sometimes a OS uses the end of this record for it's own use.

#ifdef _WIN32

};

#else

} __attribute__ ((packed));

#endif /* _WIN32 */



struct ECMA119RootDirectoryRecord {

  unsigned char reclen; // Length of this record

  unsigned char attlen; // Extended Attribute Record Length



  unsigned long externlocle; // Location of Extent

  unsigned long externlocbe;



  struct ECMA119DateTime recorded; // Recording Date and Time



  unsigned char flags; // File Flags

  unsigned char interleave; // Interleave Gap Size



  unsigned short seqnole; // Volume Sequence No.

  unsigned short seqnobe;



  unsigned short idlen;

  char id[1]; // Probably for the '.' (But I'm just guessing :)

#ifdef _WIN32

};

#else

} __attribute__ ((packed));

#endif /* _WIN32 */



struct ECMA119VolumeID {

  unsigned char voltype;

  // 0 = Boot Record

  // 1 = Primary Volume Descriptor (PrimaryVolume below)

  // 2 = Supplementary Volume Descriptor

  // 3 = Partition Descriptor (PartitionVolume below)

  // 4 - 254 Reserved

  // 255 = End-of-Descriptor-Set



  char stdid[5]; // Standard Identifier. Always "CD001"



  unsigned char version;

#ifdef _WIN32

};

#else

} __attribute__ ((packed));

#endif /* _WIN32 */



struct ECMA119PrimaryVolume {

  struct ECMA119VolumeID id;

  // id.voltype should be 1 (for this type of volume)

  // id.version should be 1 (standard)



  char unused1;



  char systemid[32];

  char volumeid[32];



  char unused2[8];



  unsigned long numblocksle; // Total logical blocks. (on Media? or just

  unsigned long numblocksbe; // in volume?)



  char unused3[32];



  unsigned short volumesetsizele; // Volume Set size of the volume. (?)

  unsigned short volumesetsizebe;



  unsigned short ordinalle; // Count of which descriptor this is in the Volume

  unsigned short ordinalbe; // set.



  unsigned short blocksizele; // Size of a Logical Block

  unsigned short blocksizebe;



  unsigned long pathtablesizele; // Path Table Size

  unsigned long pathtablesizebe;



  unsigned long typelpathtablelocation; // (le) Location of a Type L Path Table



  unsigned long typelopttablelocation; // (le) Location of an Optional Type L



  unsigned long typempathtablelocation; // (be) Location of a Type M Path Table



  unsigned long typemopttablelocation; // (be) Location of an Optional Type M



  struct ECMA119RootDirectoryRecord root;



  char volumesetid[128]; // Volume Set ID



  char publisher[128]; // Publisher



  char datapreparer[128]; // Data Preparer



  char application[128]; // Application ID



  char copyrightfile[37]; // Copyright File Identifier



  char abstractfile[37]; // Abstract File Identifier



  char bibliograchicfile[37]; // Bibliographic File Identifier



  struct ECMA119ASCIITime volcreatedate; // Date Created

  struct ECMA119ASCIITime volmodifydate; // Last Date Modified

  struct ECMA119ASCIITime volexpiredate; // Date data expires

  struct ECMA119ASCIITime voleffectivedata; // Date data becomes accurate (effective)



  unsigned char filestructversion; // File Structure Version

  // Should be 1 = Standard



  char unused4;



  char applicationuse[512]; // For use by an application



  char unused5[653]; // Rounds this out to 2048 bytes...

#ifdef _WIN32

};

#else

} __attribute__ ((packed));

#endif /* _WIN32 */



// struct ECMA119PartitionVolume {

//   struct ECMA119VolumeID id;

// #ifdef _WIN32

// };

// #else

// } __attribute__ ((packed));

// #endif /* _WIN32 */



#ifdef _WIN32

#pragma pack()

#endif /* _WIN32 */





extern int ValidateECMA119PrimaryVolume(struct ECMA119PrimaryVolume *volume);

// extern int ValidateECMA119PartitionVolume(struct ECMA119PartitionVolume volume);





#endif /* ECMA119_H */

