import java.io.PrintStream;
import java.io.FileNotFoundException;
import java.lang.*;

import java.util.Enumeration;
import java.util.Properties;

import opencard.opt.iso.fs.CardFile;
import opencard.opt.iso.fs.FileAccessCardService;
import opencard.opt.iso.fs.CardFilePath;
import opencard.opt.iso.fs.FileAccessCardService;
import opencard.opt.iso.fs.CardFileOutputStream;
import opencard.opt.iso.fs.CardFileInputStream;

import opencard.opt.security.PrivateKeyFile;

import opencard.core.service.SmartCard;
import opencard.core.service.CardRequest;
import opencard.core.service.CardServiceException;
import opencard.core.OpenCardException;

import opencard.core.util.OpenCardPropertyLoadingException;

import opencard.core.terminal.CardTerminalException;
import opencard.core.terminal.CardID;
import opencard.core.terminal.CardTerminal;
import opencard.core.terminal.CardTerminalException;
import opencard.core.terminal.CardTerminalRegistry;

import com.gemplus.opencard.service.op.vop.vop211.CardServiceVOP211;
import com.gemplus.opencard.service.op.CardServiceOPException;

public class ReadFile
       { public static void main(String[] args)
               { boolean              s_if     = false;
                 CardTerminal         terminal = null;
                 CardTerminalRegistry ctr      = null;
                  
                 System.out.println("user.name : "+System.getProperty("user.name"));
                 System.out.println("user.home : "+System.getProperty("user.home"));
                 System.out.println("user.dir  : "+System.getProperty("user.dir"));
                 System.out.println("");
                 System.out.println("os.name    : "+System.getProperty("os.name"));
                 System.out.println("os.arch    : "+System.getProperty("os.arch"));
                 System.out.println("os.version : "+System.getProperty("os.version"));
                 System.out.println("");
                 System.out.println("java.class.path : "+System.getProperty("java.class.path"));
                 System.out.println("");
                 
                 if((s_if = SmartCardStart()))
                   { ctr = CardTerminalRegistry.getRegistry();
                     Enumeration terminals = ctr.getCardTerminals();
                     terminal  = (CardTerminal) terminals.nextElement();
                     System.out.println("terminal Name  = "+terminal.getName());
                     System.out.println("         Type  = "+terminal.getType());
                     System.out.println("         slots = "+(int)terminal.getSlots());
                            
                            
                     System.out.println("");
                     System.out.println("Inserte su tarjeta");
                            
                     SmartCard   sc = null;
                     CardRequest sr = null;
                     for(int s_for=0; s_for!=1;)
                        { try { sr = new CardRequest( CardRequest.NEWCARD,
                                                      null,
                                                      null
                                                    );
                                     
                                sc = SmartCard.waitForCard(sr);
                                 
                                s_for=1;
                              } catch(CardTerminalException CTE)
                                     { System.out.println("\n"+
                                                          "Su Tarjeta esta Dañada o mal insertada.\n"+
                                                          "Por favor retírela, revise su estado y \n"+
                                                          "vuelva a insertarla \n");
                                       s_for=0;
                                     }
                        }
                      
                     if(sc != null)
                       { CardID cardId         = sc.getCardID();
                         byte[] atr            = cardId.getATR();
                         byte[] historicalsAtr = cardId.getHistoricals();
                         
                         System.out.println("Card ATR       : "+atr.length);
                         System.out.println("Card Hist. ATR : "+historicalsAtr.length);
                         System.out.println("");
                         
                         CardServiceVOP211 facs = null;
                         try { facs = (CardServiceVOP211)
                                      sc.getCardService(CardServiceVOP211.class, true);
                               System.out.println("VOPVersion: "+facs.GetVOPVersion());
                               System.out.println("");
                                        
                             } catch(ClassNotFoundException CNFE) // from FileAccessCardService
                                    { System.out.println("ClassNotFoundException in : "+CNFE.getMessage());
                                    }
                               catch(CardServiceException CSE) // from FileAccessCardService
                                    { System.out.println("CardServiceException in sc.getCardService");
                                    }
                           
                         try { sc.close();
                             } catch(CardTerminalException CTE)
                                    { System.out.println("CardTerminalException in sc.close()");
                                    }
                       }
                     else
                       System.out.println("no consigo un objeto de tipo SmartCard!");
                   }
                 System.exit(0);
               }
        private static boolean SmartCardStart()
                { boolean rr = false;
                  try { SmartCard.start();
                        rr = true;
                      } catch(CardTerminalException CTE)
                             { rr = false;
                             }
                        catch(OpenCardPropertyLoadingException OCPLE)
                             { rr = false;
                             }
                        catch(ClassNotFoundException CNFE)
                             { rr = false;
                             }
                        catch(opencard.core.service.CardServiceException CSE)
                             { rr = false;
                             }
                        
                  return(rr);
                }
                 
       }



