package net.nice.jamp.util;

/**
 * Title:        JamP
 * Description:  Scans all Devices for Audio Tracks...
 * Copyright:    Copyright (c) 2001
 * Company:      Nice Dezigns
 * @author       Jens Hohl
 * @version 1.0
 *
 * [24.10.2001]
 * Nice Idea,but actually we could not read from Audio Devices, we located!
 *
 */

import javax.swing.filechooser.FileSystemView;
import javax.swing.JFileChooser;

import java.io.File;
import java.util.Vector;


public class AudioCDScanner
{
  /**
   * The Filesystem View
   */
  private FileSystemView fileSystemView  = null;
  /**
   * Definition of 'CDA' String
   */
  private final static String CDA = new String("cda");
  /**
   * Definition Audio CD Trackname
   */
  private final static String TRACK_NAME = new String("track01."+CDA);
  /**
   * Store all AudioDevices there
   */
  private Vector allAudioDevices = new Vector();

  public AudioCDScanner()
  {
    setup();
  }

  /**
   * Setup
   */
  private void setup()
  {
    /**
     * Workaround fuer einen Java Webstart Bug...
     * "Kein Datentraeger in Laufwerk: x"
     * Nicht umbedingt zur nacharmung empfohlen...
     */
    SecurityManager backup = System.getSecurityManager();
    System.setSecurityManager(null);

    fileSystemView = new JFileChooser().getFileSystemView();

    scanDevices();

    /**
     * Den Security Manager wieder setzten!
     */
    System.setSecurityManager(backup);
  }

  private void scanDevices()
  {

    File [] roots = fileSystemView.getRoots();

    if ((roots != null)&&(roots.length >0))
    {
      for(int device = 0 ; device < roots.length ; device++)
      {
	if(checkIfDeviceContainsAudioTracks(roots[device]))
	{
	  System.out.println("Audio Device found at :"+roots[device].getPath());
	  allAudioDevices.add(roots[device]);
	}
      }
    }
  }


  private boolean checkIfDeviceContainsAudioTracks(File deviceToScan)
  {
    /**
     * Workaround fuer einen Java Webstart Bug...
     * "Kein Datentraeger in Laufwerk: x"
     * Nicht umbedingt zur nacharmung empfohlen...
     */
    SecurityManager backup = System.getSecurityManager();
    System.setSecurityManager(null);

    File [] filesOnRootOfDevice = deviceToScan.listFiles();
    /**
     * End of Workaround!
     */
    System.setSecurityManager(backup);

    if (filesOnRootOfDevice!=null)
    {
      for (int index = 0; index < filesOnRootOfDevice.length; index++)
      {
	if (filesOnRootOfDevice[index].getName().equalsIgnoreCase(TRACK_NAME))
	{
	  return true;
	}
      }
    }
    return false;
  }

  /**
   * Return all avaible Audio Devices
   * @return Array with devices, or <code>null</code> if no devices were found!
   * @see #isAudioDeviceAvaible()
   */
  public File [] getAllAudioDevices()
  {
    if (allAudioDevices.isEmpty())
      return null;
    File [] audioDevices = new File[allAudioDevices.size()];

    for (int i=0;i<allAudioDevices.size();i++)
    {
      audioDevices[i] = (File) allAudioDevices.elementAt(i);
    }
    return audioDevices;
  }

  /**
   * Returns the NR of Audio Devices<br>
   * @return nr of devices
   * @see #isAudioDeviceAvaible()
   * */

  public int getNrOfDevices()
  {
    return allAudioDevices.size();
  }

  /**
   * Call to get nr of Audio Tracks on Audio Device.<br>
   * @param device
   * @return nr of Audiotracks on device
   * @see #getAllAudioDevices()
   * */

  public int getNrOfAudioTracks(File device)
  {

    int nrOfFiles = 0;
    if (device != null)
    {
      File[] allFiles = device.listFiles();

      for (int i=0;i<allFiles.length;i++)
      {
	int lastIndex = allFiles[i].getName().lastIndexOf(".");

	if (lastIndex >-1)
	{
	  String subString = allFiles[i].getName().substring(lastIndex+1);
	  if (subString.equalsIgnoreCase(CDA))
	  {
	    nrOfFiles++;
	  }
	}
      }
    }
    return nrOfFiles;
  }

  /**
   * Returns <code>true</code> if Audio Device was found.
   * @return true/false
   * */

  public boolean isAudioDeviceAvaible()
  {
    return allAudioDevices.isEmpty() ? false : true;
  }

  /**
   * Main<br>
   * To Test this Class, simply insert an Audio CD in any CDROM,
   * and Start this.
   * @param args
   */
  public static void main(String[] args)
  {
    AudioCDScanner audioCDScanner = new AudioCDScanner();
    System.out.println("Is AudioDevice Avaible :"+audioCDScanner.isAudioDeviceAvaible());
    if(audioCDScanner.isAudioDeviceAvaible())
    {
      System.out.println("Devices Found:"+audioCDScanner.getAllAudioDevices().length);
      File[] audioDev = audioCDScanner.getAllAudioDevices();

      System.out.println("Device :"+audioDev[0].getPath()+" Audio Tracks: "+audioCDScanner.getNrOfAudioTracks(audioDev[0]));
    }
    // Call Exit, cause JFileChooser was invoked!
    System.exit(1);
  }
}
