/*
    2004.02.01
        first released source code for IOMP
*/

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <termios.h>
#include <mntent.h>
#include <getopt.h>
#include "struct.h"
#include "workbone.h"

void rl_ttyset (int Reset);
void strmcpy (char **t, char *s);
void help (void);
inline void playtime (void);

char *cur_trackname;		/* Take a guess */
int cur_index = 0;		/* Current index mark */
int cur_frame;			/* Current frame number */
struct play *playlist = NULL;
struct cdinfo thiscd, *cd = &thiscd;
int cur_track = -1;		/* Current track number, starting at 1 */
char *cur_artist;		/* Name of current CD's artist */
char cur_avoid;			/* Avoid flag */
char cur_contd;			/* Continued flag */
char *cur_cdname;		/* Album name */
int cur_nsections;		/* Number of sections currently defined */
int exit_on_eject = 0;

int cur_balance = 10, info_modified;
int cur_track, cur_pos_abs, cur_pos_rel, cur_tracklen, cur_cdlen, cur_cdmode,
    cur_ntracks, cur_lasttrack, cur_firsttrack, cur_listno;
char tmptime[100];
char *tottime;



int CDmounted(void);
void message(char *);

int  tmppos;
int save_track;
int sss;
int scmd;
int drv_status; /* is the CD drive available? */

#define CDDRV_OK 100
#define CANT_OPEN 101
#define ALREADY_MOUNTED 102

#define MAINWIDTH 322
#define MAINHEIGHT 158
#ifndef ZERO
#define ZERO 0
#endif


int CDmounted(void) {
  FILE *fp ;
  struct mntent *mnt ;

  /*check if drive is mounted (from Mark Buckaway's cdplayer code) */
  if ((fp = setmntent (MOUNTED, "r")) == NULL) {
    cur_cdmode = 5;
    return (CANT_OPEN);
  }
  while ((mnt = getmntent (fp)) != NULL)
    {
      if (strcmp (mnt->mnt_type, "iso9660") == 0) {
          cur_cdmode = 5;
	  endmntent (fp);
          return (ALREADY_MOUNTED);
      }
    }
  endmntent (fp);
  return CDDRV_OK;

  /* check if drive is mounted (from Mark Buckaway's cdplayer code) */
/*  if ((fp = setmntent (MOUNTED, "r")) == NULL)
    {
      fprintf (stderr, "Couldn't open %s: %s\n", MOUNTED, strerror (errno));
      exit (1);
    }
  while ((mnt = getmntent (fp)) != NULL)
    {
      if (strcmp (mnt->mnt_type, "iso9660") == 0)
	{
	  fputs ("CDROM already mounted. Operation aborted.\n", stderr);
	  endmntent (fp);
	  exit (1);
	}
    }
  endmntent (fp);
*/
}


/* takes terminal in and out of raw mode */
void
rl_ttyset (int Reset)
{
  static struct termios old;
  struct termios new;

  if (Reset == 0)
    {
      (void) tcgetattr (0, &old);
      new = old;
      new.c_lflag &= ~(ECHO | ICANON);
      new.c_iflag &= ~(ISTRIP | INPCK);
      (void) tcsetattr (0, TCSANOW, &new);
    }
  else
    (void) tcsetattr (0, TCSANOW, &old);
}


/* Copy into a malloced string. */
void
strmcpy (char **t, char *s)
{
  if (*t != NULL)
    free (*t);

  *t = malloc (strlen (s) + 1);
  if (*t == NULL)
    {
      perror ("strmcpy");
      exit (1);
    }

  (void) strcpy (*t, s);
}

/* ansi codes to clear screen */
void
cls ()
{
  printf ("\033[2J\033[H");
}

/* print help screen */
void
help ()
{
  const char *helplist[] =
  {
    "\376\376", "\tstop                       ",
    "||", "\tpause/resume",
    "|\020", "\tplay",
    "\036\036", "\tre-start current selection",
    "|\021", "\tprevious selection",
    "\020|", "\tnext selection",
    "\021\021", "\tgo backward 15 seconds",
    "\020\020", "\tgo foreward 15 seconds",
    "..", "\tabort workbone",
    "quit", "\texit workbone",
    "?", "\tdisplay help screen", NULL};
  int i = 0;
  cls ();
  while (helplist[i] != NULL)
    {
      printf ("\t\t\t%s%s%s%s\n", "\033(U", helplist[i], GOF, helplist[i + 1]);
      i += 2;
    }
}

inline void
playtime (void)
{
  static int mymin, emin;
  static int mysec, esec;
  int tmp = 0;

  if (cur_pos_rel > 0 && (tmp = cur_pos_rel % 60) == mysec)
    return;
  mysec = tmp;
  mymin = cur_pos_rel / 60;
  esec = cur_pos_abs % 60;
  emin = cur_pos_abs / 60;
  sprintf (tmptime, "%s %02d:%02d  %02d:%02d", cur_track > 9 ? " " : "  ",
	   mymin, mysec, emin, esec);
  return;
}



