/* -*- c -*-

    Copyright (C) 2018 Thomas Schmitt
    Copyright (C) 2004, 2005, 2006, 2008, 2010, 2012, 2014
    Rocky Bernstein <rocky@gnu.org>

    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 3 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, see <http://www.gnu.org/licenses/>.
*/

/**
   \file disc.h
   \brief  The top-level header for disc-related libcdio calls.
 */
#ifndef CDIO_DISC_H_
#define CDIO_DISC_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    /**
       disc modes. The first combined from MMC-5 6.33.3.13 (Send
       CUESHEET), "DVD Book" from MMC-5 Table 400, page 419.  and
       GNU/Linux /usr/include/linux/cdrom.h and we've added DVD.
    */
  typedef enum {
    CDIO_DISC_MODE_CD_DA,           /**< CD-DA */
    CDIO_DISC_MODE_CD_DATA,         /**< CD-ROM form 1 */
    CDIO_DISC_MODE_CD_XA,           /**< CD-ROM XA form2 */
    CDIO_DISC_MODE_CD_MIXED,        /**< Some combo of above. */
    CDIO_DISC_MODE_DVD_ROM,         /**< DVD ROM (e.g. movies) */
    CDIO_DISC_MODE_DVD_RAM,         /**< DVD-RAM */
    CDIO_DISC_MODE_DVD_R,           /**< DVD-R */
    CDIO_DISC_MODE_DVD_RW,          /**< DVD-RW */
    CDIO_DISC_MODE_HD_DVD_ROM,      /**< HD DVD-ROM */
    CDIO_DISC_MODE_HD_DVD_RAM,      /**< HD DVD-RAM */
    CDIO_DISC_MODE_HD_DVD_R,        /**< HD DVD-R */
    CDIO_DISC_MODE_DVD_PR,          /**< DVD+R */
    CDIO_DISC_MODE_DVD_PRW,         /**< DVD+RW */
    CDIO_DISC_MODE_DVD_PRW_DL,      /**< DVD+RW DL */
    CDIO_DISC_MODE_DVD_PR_DL,       /**< DVD+R DL */
    CDIO_DISC_MODE_DVD_OTHER,       /**< Unknown/unclassified DVD type */
    CDIO_DISC_MODE_NO_INFO,
    CDIO_DISC_MODE_ERROR,
    CDIO_DISC_MODE_CD_I         /**< CD-i. */
  } discmode_t;

  extern const char *discmode2str[];

  /**
    Read cdtext information for a cdtext_t object.
    About format and usage of these data see the documentation of call
    mmc_read_cdtext() in include file <cdio/mmc.h>.


    @param p_cdio the CD object that may contain CD-Text information.
    @return malloc'd pointer to raw CD-Text data as replied by the drive
            or NULL if problems occur or CD-Text information does not exist.
            A non-NULL return value must be freed with cdio_free() when done.
  */
  uint8_t * cdio_get_cdtext_raw (CdIo_t *p_cdio);

  /**
    Return a pointer to the cdtext_t object which is attached to a CdIo_t
    object. If no such cdtext_t is attached yet, then try to read CD-TEXT
    information and use it to create and initialise the cdtext_t object.

    For usage of cdtext_t see include file <cdio/cdtext.h>.

    @param p_cdio the CD object that may contain CD-Text information.
    @return a pointer to the attached cdtext_t object or NULL if problems
            occur or if CD-Text information does not exist.
  */
  cdtext_t *cdio_get_cdtext (CdIo_t *p_cdio);

  /**
    Get disc mode - the kind of CD (CD-DA, CD-ROM mode 1, CD-MIXED, etc.
    that we've got. The notion of "CD" is extended a little to include
    DVD's.
  */
  discmode_t cdio_get_discmode (CdIo_t *p_cdio);

  /**
    Get the lsn of the end of the CD

    @return the lsn. On error 0 or CDIO_INVALD_LSN.
  */
  lsn_t cdio_get_disc_last_lsn(const CdIo_t *p_cdio);

  /**
    Return the Joliet level recognized for p_cdio.
  */
  uint8_t cdio_get_joliet_level(const CdIo_t *p_cdio);

  /**
    Get the media catalog number (MCN) from the CD.

    @return the media catalog number or NULL if there is none or we
    don't have the ability to get it.

    Note: The caller must free the returned string with cdio_free()
    when done with it.

  */
  char * cdio_get_mcn (const CdIo_t *p_cdio);

  /**
    Get the number of tracks on the CD.

    @return the number of tracks, or CDIO_INVALID_TRACK if there is
    an error.
  */
  track_t cdio_get_num_tracks (const CdIo_t *p_cdio);

  /**
    Return true if discmode is some sort of CD.
  */
  bool cdio_is_discmode_cdrom (discmode_t discmode);

  /**
    Return true if discmode is some sort of DVD.
  */
  bool cdio_is_discmode_dvd (discmode_t discmode);

  /**
      cdio_stat_size is deprecated. @see cdio_get_disc_last_lsn
  */
#define cdio_stat_size cdio_get_disc_last_lsn

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* CDIO_DISC_H_ */
