PCSC4Java  0.2
Library PCSC for Java language.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
D:/Affaire/Perso/SmartCardToolBox/pcsc4java-framework-0.2/src/fr/redbilled/security/pcscforjava/PCSCPnPThread.java
Go to the documentation of this file.
00001 /*
00002  * To change this template, choose Tools | Templates
00003  * and open the template in the editor.
00004  */
00005 
00006 package fr.redbilled.security.pcscforjava;
00007 
00008 import fr.redbilled.pcscforjava.CardException;
00009 import fr.redbilled.pcscforjava.CardTerminals;
00010 import static fr.redbilled.security.pcscforjava.PCSCDefines.*;
00011 import static fr.redbilled.security.pcscforjava.PCSC.*;
00012 import java.util.ArrayList;
00013 import java.util.List;
00014 
00019 public class PCSCPnPThread implements Runnable {
00020     
00021     private static boolean          m_bStop = true;
00022     private List<CardTerminals>     m_cardTerminals;
00023     private long                    m_lContextId;
00024     private static PCSCPnPThread    m_instance;
00025     private static Thread           m_thread;
00026     
00027     private PCSCPnPThread(CardTerminals cardTerminals)
00028     {
00029         this.m_cardTerminals = new ArrayList<CardTerminals>();
00030         this.m_cardTerminals.add(cardTerminals);
00031         try { this.m_lContextId = SCardEstablishContext(SCARD_SCOPE_USER); }
00032         catch(PCSCException ex){}
00033     }
00034     
00035     synchronized public static PCSCPnPThread getInstance(CardTerminals cardTerminals)
00036     {
00037         if(null == m_instance)
00038             m_instance = new PCSCPnPThread(cardTerminals);
00039         
00040         return m_instance;
00041     }
00042     
00043     public Thread start()
00044     {
00045         if(m_thread == null)
00046         {
00047             m_bStop = false;
00048             m_thread = new Thread(this);
00049             m_thread.setDaemon(true);
00050             m_thread.setPriority(Thread.MIN_PRIORITY);
00051             m_thread.start();
00052             try { Thread.sleep(1000); } catch (InterruptedException ex) {}
00053         }
00054         
00055         return m_thread;
00056     }
00057     
00058     public void addObserver(CardTerminals cardTerminals)
00059     {
00060         boolean _bFound = false;
00061 
00062         for(int _i = 0; _i < this.m_cardTerminals.size(); _i++)
00063         {
00064             if(this.m_cardTerminals.get(_i).equals(cardTerminals))
00065             {
00066                 _bFound = true;
00067                 break;
00068             }
00069         }
00070 
00071         if(!_bFound)
00072             this.m_cardTerminals.add(cardTerminals);
00073     }
00074     
00075     public void removeObserver(CardTerminals cardTerminals)
00076     {
00077         boolean _bFound = false;
00078 
00079         for(int _i = 0; _i < this.m_cardTerminals.size(); _i++)
00080         {
00081             if(this.m_cardTerminals.get(_i).equals(cardTerminals))
00082             {
00083                 _bFound = true;
00084                 break;
00085             }
00086         }
00087 
00088         if(_bFound)
00089             this.m_cardTerminals.remove(cardTerminals);
00090     }
00091 
00092     @Override
00093     public void run() {
00094         boolean _bEvent = false;
00095         boolean _bThereIsProblem = false;
00096 
00097         while(!m_bStop)
00098         {
00099             try
00100             {
00101                 if(this.m_lContextId == 0)
00102                 {
00103                     this.m_lContextId = SCardEstablishContext(SCARD_SCOPE_USER);
00104                     _bThereIsProblem = true;
00105                 }
00106                                     
00107                 
00108                 if(this.m_lContextId != 0)
00109                 {
00110                     if(_bThereIsProblem)
00111                     {
00112                         _bThereIsProblem = false;
00113                         _bEvent = true;
00114                     }
00115                     
00116                     if(!_bEvent)
00117                         _bEvent = SCardPlugAndPlay(m_lContextId, 500);
00118                     
00119                     
00120                     if(_bEvent)
00121                     {
00122                         for(int _i = 0; _i < this.m_cardTerminals.size(); _i++)
00123                         {
00124                             try {
00125                                 this.m_cardTerminals.get(_i).updateCardTerminalsListByEvent();
00126                             } catch (CardException ex) {
00127                                 System.err.println("PnP " + ex.getMessage());
00128                             }
00129                         }
00130                         
00131                         _bEvent = false;
00132                     }
00133                 }
00134             }
00135             catch(PCSCException ex) {}
00136 
00137             try {
00138                 Thread.sleep(500);
00139                 } catch (InterruptedException ex) {
00140                 this.stop();
00141             }
00142         }
00143         
00144         m_instance = null;
00145         m_thread = null;
00146     }
00147     
00148     public void signalEvent()
00149     {
00150         for(int _i = 0; _i < this.m_cardTerminals.size(); _i++)
00151         {
00152             try {
00153                 this.m_cardTerminals.get(_i).updateCardTerminalsListByEvent();
00154             } catch (CardException ex) {
00155                 System.err.println("signalEvent " + ex.getMessage());
00156             }
00157         }
00158     }
00159 
00160     public void stop()
00161     {
00162         m_bStop = true;
00163     }
00164 
00165     private native boolean SCardPlugAndPlay(long lContextId, long lTimeout)
00166             throws PCSCException;
00167 }