try
{
TerminalFactory terminalFactory = TerminalFactory.getDefault();
CardTerminals terminals = terminalFactory.terminals();
if (terminals == null)
throw new HBCI_Exception("Kein Kartenleser gefunden");
List<CardTerminal> list = terminals.list();
if (list == null || list.size() == 0)
throw new HBCI_Exception("Kein Kartenleser gefunden");
HBCIUtils.log("found card terminals:",HBCIUtils.LOG_INFO);
for (CardTerminal t:list) {
HBCIUtils.log(" "+t.getName(),HBCIUtils.LOG_INFO);
}
CardTerminal terminal = null;
// Checken, ob der User einen konkreten Kartenleser vorgegeben hat
String name = HBCIUtils.getParam(getParamHeader()+".pcsc.name",null);
if (name != null)
{
HBCIUtils.log("explicit terminal name given, trying to open terminal: " + name,HBCIUtils.LOG_DEBUG);
terminal = terminals.getTerminal(name);
if (terminal == null)
throw new HBCI_Exception("Kartenleser \"" + name + "\" nicht gefunden");
}
else
{
HBCIUtils.log("open first available card terminal",HBCIUtils.LOG_DEBUG);
terminal = list.get(0);
}
HBCIUtils.log("using card terminal " + terminal.getName(),HBCIUtils.LOG_DEBUG);
// wait for card
if (!terminal.waitForCardPresent(60 * 1000L))
throw new HBCI_Exception("Keine Chipkarte in Kartenleser " + terminal.getName() + " gefunden");
// Hier kann man gemaess
// http://download.oracle.com/javase/6/docs/jre/api/security/smartcardio/spec/javax/smartcardio/CardTerminal.html#connect%28java.lang.String%29
// auch "T=0" oder "T=1" angeben. Wir wissen allerdings noch nicht, von welchem
// Typ die Karte ist. Daher nehmen wir "*" fuer jedes verfuegbare. Wenn wir die
// Karte geoeffnet haben, kriegen wir dann auch das Protokoll raus.
this.smartCard = terminal.connect("*");
String type = this.smartCard.getProtocol();
HBCIUtils.log(" card type: " + type,HBCIUtils.LOG_INFO);
// Card-Service basierend auf dem Kartentyp erzeugen
if (type == null || type.indexOf("=") == -1)
throw new HBCI_Exception("Unbekannter Kartentyp");
String id = type.substring(type.indexOf("=")+1);
String serviceName = "org.kapott.hbci.smartcardio.DDVCardService" + id;
HBCIUtils.log(" trying to load: " + serviceName,HBCIUtils.LOG_DEBUG);
this.cardService = (DDVCardService) Class.forName(serviceName).newInstance();
HBCIUtils.log(" using: " + this.cardService.getClass().getName(),HBCIUtils.LOG_INFO);
this.cardService.init(this.smartCard);
// getCID
byte[] cid=this.cardService.getCID();
this.setCID(new String(cid,"ISO-8859-1"));
// extract card id
StringBuffer cardId=new StringBuffer();
for (int i=0;i<8;i++)
{
cardId.append((char)(((cid[i+1]>>4)&0x0F) + 0x30));
cardId.append((char)((cid[i+1]&0x0F) + 0x30));
}
this.setCardId(cardId.toString());
}
catch (HBCI_Exception he)
{
throw he;
}
catch (Exception e)
{
throw new HBCI_Exception(e);
}
}