/**************************************************************************
*   Copyright (C) 2005 by Jean-Michel Petit                               *
*   jm_petit@laposte.net                                                  *
*                                                                         *
*   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.,                                       *
*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
***************************************************************************/
#ifndef K9DVD_H
#define K9DVD_H
#include "k9common.h"
#include "k9dvdread.h"
#include <tqstringlist.h>
#include <tqdatetime.h>
#include <tqvaluelist.h>


struct streamSize {
   unsigned char id;
   float size_mb;
   float percent;
};

struct stream_counter {
   unsigned char id;
   int count;
   float size_mb;
   float percent;
};

class k9DVDProgress;
class k9DVDChapter;
class k9DVDTitle;
class k9DVDTitleset;

/** get the DVD structure with titles lengths and streams lengths.
  *@author 
  */

class k9DVD : public TQObject  {
Q_OBJECT

private:
  TQObjectList m_titles;
  TQPtrList<k9DVDTitleset> m_titlesets;
  TQString m_title;
  int m_titleCount;
  k9DVDTitle *m_longestTitle;
  TQStringList m_lvideoFormat;
  TQStringList m_laspectRatio;
  TQStringList m_lquantization;
  TQStringList m_lmpegVersion;
  TQStringList m_lvideoHeight;
  TQStringList m_lvideoWidth;
  TQStringList m_lpermittedDf;
  TQStringList m_laudioFormat;
  TQStringList m_lsampleFreq;
  TQStringList m_laudioType;
  TQStringList m_lsubpType;
  TQStringList m_langCode;
  TQStringList m_langName;
  double m_frames_per_s[4];
  uint m_menuSize;
  k9DVDProgress *m_progressDlg; 
  TQString m_Device;
  bool m_error;
  TQString m_errMsg;
  bool m_opened;
  TQString m_format;
  k9DVDTitle* m_start;
  int m_titlesetCount;
public: 
  k9DVD(TQObject  *parent=0,const char *name=0,const TQStringList args=0) ;
  ~k9DVD();

  /**
   * Opens and estimates the size of each stream
   * @param device input device
   * @return return code (0=ok)
   */
  virtual int scandvd (const TQString & device,bool _quickScan);
 
  /**
   * gets the title of the DVD
   * @return DVD title
   */
  virtual const TQString& getDVDTitle();
  
  /**
   * set the title of the DVD 
   * @param _newVal the new DVD title
   */
  virtual void setDVDTitle(const TQString &_newVal);
  
  /**
   * 
   * @return returns the number of titles
   */
  virtual const int& gettitleCount();

  /**
   * 
   * @return returns the number of titlesets
   */
  virtual const int& gettitlesetCount();


  /**
   * returns a title of the DVD
   * @param num the title number
   * @return the title
   */
  virtual k9DVDTitle* gettitle(int num);
  
  /**
   * returns a title (which is in tt_srpt)  
   * @param num the title number 
   * @return the title
   */
  virtual k9DVDTitle* gettitleByNum(int num);
  virtual k9DVDTitle *getlongestTitle();
  virtual float getfactor(bool withMenus,bool _streams,bool _useDvdAuthor);
  virtual const TQString& getDevice();
  virtual const bool& geterror();
  virtual const TQString& geterrMsg();
  virtual const bool& getopened();
  virtual uint64_t getsizeSelected(bool _streams);
  virtual TQString &getFormat();
  virtual k9DVDTitle* getstart();
  virtual void setstart(k9DVDTitle* title);
  virtual int getnewTitleNum(k9DVDTitle *title);
  virtual int getmenuSize();
  virtual void close();
  virtual k9DVDTitleset *gettitleset(int num);
  virtual k9DVDRead * getdvd() {return &m_dvd;}
  static TQString lang_name(const TQString & code,const TQString & name);
private: // Private methods
  k9DVDRead  m_dvd;
  k9DVDTitle* addTitle(k9DVDTitleset *titleset,int id,int num,int _VTS,int _pgc,uint32_t _startSector, bool _indexed);
  float calcVobuSize(ifo_handle_t *_ifo,k9DVDChapter *_chapter);
  long stream_vob( int title, unsigned long startblock, unsigned long lastblock, struct stream_counter *sc);
  int identify_stream( unsigned char *buffer ) ;
  int dvdtime2msec(dvd_time_t *dt);
  int get_title_name(const char* dvd_device, char* title);
  void calcStreamSize(k9DVDTitle & title);
  void setError(const TQString &err);
  int getVampsID(int type);
  int calcNumTitle(ifo_handle_t *ifo,int _vts,int _ttn);
public slots: // Public slots
  void slotVobProgress(unsigned int position,unsigned int total);
  void slotTitleProgress(unsigned int position,unsigned int total);
  void slotTitleText(TQString &text);
  void slotTotalText(TQString &text);
signals: // Signals
  void sigVobProgress(unsigned int position,unsigned int total);
  void sigTitleProgress(unsigned int position,unsigned int total);
  void sigTitleText(TQString &text);
  void sigTotalText(TQString &text);
};

typedef struct lng { char code[3];	TQString name;};

#endif