PCSC4Java
0.2
Library PCSC for Java language.
|
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 }