package samples.readfile;

import opencard.core.service.SmartCard;
import opencard.core.service.CardRequest;
import opencard.opt.iso.fs.FileAccessCardService;
import opencard.opt.iso.fs.CardFile;
import opencard.core.event.CardTerminalEvent;
import opencard.core.event.CTListener;
import opencard.core.event.EventGenerator;

public class ReadFile implements CTListener{
  private static Object monitor    = "synchronization monitor";
  private static SmartCard sc = null;
  private static CardRequest cr = null;

  public static void main(String[] args)
  {
    System.out.println("Reading file from smart card... ");
    try {
      SmartCard.start();
      if (SmartCard.isStarted())
        System.out.println ("configuration was done.");
      // Wait for a smart card with a FileAccessCardService
      cr = new  CardRequest(FileAccessCardService.class);
      System.out.println ("CArd Service");
      //SmartCard sc = SmartCard.waitForCard(cr);
      EventGenerator.getGenerator().addCTListener (new ReadFile() );

      synchronized (monitor) {
        System.out.println ("please insert a card now!\n");
        monitor.wait();
      }

      System.out.println("SmartCard connected");

      if (sc == null) {
        // A smart card was inserted that does not match
        // Handle how it would be appropriate in your app
      }
      else {
        FileAccessCardService facs = (FileAccessCardService)
        sc.getCardService(FileAccessCardService.class, true);
        System.out.println("CardService OK");
/*
        CardFile file = new CardFile(facs, "3F00:1012");

        System.out.println("Abri o arquivo");

        byte[] data = facs.read(file.getPath(), 0,  file.getLength());
        System.out.println(new String(data));

*/        // We are done with this smart card.
        sc.close();
      }
    }  catch (Exception e) {
      e.printStackTrace();
    }
    System.exit(0);
  }



  /**
  * Gets invoked when a card is inserted.
  */
  public void cardInserted (CardTerminalEvent ctEvent) {
    System.out.println ("card was inserted\n");

    try {
      System.out.println ("Getting SmartCard from event");
      sc = SmartCard.getSmartCard(ctEvent, null);
      System.out.println ("SmartCard OK");
    }
    catch(Exception e ) {
      e.printStackTrace();
    }
    synchronized (monitor) {
      monitor.notifyAll();
    }
  } // cardInserted


  /**
  * Gets invoked when a card is removed. Is ignored in this case as we are
  * interested in getting events only when a card is being inserted.
  */
  public void cardRemoved (CardTerminalEvent ctEvent) {
    System.out.println ("card was removed\n");

    try{
      System.out.println ("Shutdown card");
      SmartCard.shutdown();
      System.out.println ("Shutdown OK");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

