/* $Id: Comm.java,v 1.1 2011/05/04 22:37:51 willuhn Exp $
This file is part of HBCI4Java
Copyright (C) 2001-2008 Stefan Palme
HBCI4Java is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
HBCI4Java is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.kapott.hbci.comm;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.kapott.hbci.callback.HBCICallback;
import org.kapott.hbci.exceptions.CanNotParseMessageException;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.exceptions.ParseErrorException;
import org.kapott.hbci.manager.HBCIUtils;
import org.kapott.hbci.manager.HBCIUtilsInternal;
import org.kapott.hbci.manager.IHandlerData;
import org.kapott.hbci.manager.MsgGen;
import org.kapott.hbci.passport.HBCIPassportInternal;
import org.kapott.hbci.protocol.MSG;
import org.kapott.hbci.protocol.factory.MSGFactory;
import org.kapott.hbci.rewrite.Rewrite;
public abstract class Comm
{
/**
* Der zu verwendende Zeichensatz.
*/
public final static String ENCODING = "ISO-8859-1";
protected Filter filter;
private HBCIPassportInternal parentPassport;
protected abstract void ping(MSG msg);
protected abstract StringBuffer pong(MsgGen gen);
protected abstract void closeConnection();
protected Comm(HBCIPassportInternal parentPassport)
{
this.parentPassport=parentPassport;
this.filter=parentPassport.getCommFilter();
HBCIUtilsInternal.getCallback().callback(parentPassport,HBCICallback.NEED_CONNECTION,
HBCIUtilsInternal.getLocMsg("CALLB_NEED_CONN"),HBCICallback.TYPE_NONE,new StringBuffer());
}
public MSG pingpong(String msgName, MSG msg)
{
IHandlerData handler=getParentPassport().getParentHandlerData();
MsgGen gen=handler.getMsgGen();
// ausgehende nachricht versenden
HBCIUtilsInternal.getCallback().status(getParentPassport(),HBCICallback.STATUS_MSG_SEND,null);
HBCIUtilsInternal.getCallback().status(getParentPassport(),HBCICallback.STATUS_MSG_RAW_SEND,msg.toString(0));
ping(msg);
// nachricht empfangen
HBCIUtilsInternal.getCallback().status(getParentPassport(),HBCICallback.STATUS_MSG_RECV,null);
String st = pong(gen).toString();
HBCIUtilsInternal.getCallback().status(getParentPassport(),HBCICallback.STATUS_MSG_RAW_RECV,st);
HBCIUtils.log("received message: "+st,HBCIUtils.LOG_DEBUG2);
MSG retmsg=null;
try {
// erzeugen der liste aller rewriter
String rewriters_st=HBCIUtils.getParam("kernel.rewriter");
ArrayList<Rewrite> al=new ArrayList<Rewrite>();
StringTokenizer tok=new StringTokenizer(rewriters_st,",");
while (tok.hasMoreTokens()) {
String rewriterName=tok.nextToken().trim();
if (rewriterName.length()!=0) {
Class cl=this.getClass().getClassLoader().loadClass("org.kapott.hbci.rewrite.R"+
rewriterName);
Constructor con=cl.getConstructor((Class[])null);
Rewrite rewriter=(Rewrite)(con.newInstance((Object[])null));
al.add(rewriter);
}
}
Rewrite[] rewriters= al.toArray(new Rewrite[al.size()]);
// alle rewriter f�r verschl�sselte nachricht durchlaufen
for (int i=0;i<rewriters.length;i++) {
st=rewriters[i].incomingCrypted(st,gen);
}
// versuche, nachricht als verschl�sselte nachricht zu parsen
HBCIUtilsInternal.getCallback().status(getParentPassport(),HBCICallback.STATUS_MSG_PARSE,"CryptedRes");
try {
HBCIUtils.log("trying to parse message as crypted message",HBCIUtils.LOG_DEBUG);
retmsg = MSGFactory.getInstance().createMSG("CryptedRes",st,st.length(),gen,MSG.DONT_CHECK_SEQ);
} catch (ParseErrorException e) {
// wenn das schiefgeht...
HBCIUtils.log("message seems not to be encrypted; tring to parse it as "+msgName+"Res message",HBCIUtils.LOG_DEBUG);
// alle rewriter durchlaufen, um nachricht evtl. als unverschl�sselte msg zu parsen
gen.set("_origSignedMsg",st);
for (int i=0;i<rewriters.length;i++) {
st=rewriters[i].incomingClearText(st,gen);
}
// versuch, nachricht als unverschl�sselte msg zu parsen
HBCIUtilsInternal.getCallback().status(getParentPassport(),HBCICallback.STATUS_MSG_PARSE,msgName+"Res");
retmsg = MSGFactory.getInstance().createMSG(msgName+"Res",st,st.length(),gen);
}
} catch (Exception ex) {
throw new CanNotParseMessageException(HBCIUtilsInternal.getLocMsg("EXCMSG_CANTPARSE"),st,ex);
}
return retmsg;
}
public static Comm getInstance(String name,HBCIPassportInternal passport)
{
try {
Class cl=Class.forName("org.kapott.hbci.comm.Comm"+name);
Constructor cons=cl.getConstructor(new Class[] {HBCIPassportInternal.class});
return (Comm)cons.newInstance(new Object[] {passport});
} catch (Exception e) {
throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_CANTCREATECOMM",name),e);
}
}
protected HBCIPassportInternal getParentPassport()
{
return parentPassport;
}
public void close()
{
closeConnection();
HBCIUtilsInternal.getCallback().callback(getParentPassport(),HBCICallback.CLOSE_CONNECTION,
HBCIUtilsInternal.getLocMsg("CALLB_CLOSE_CONN"),HBCICallback.TYPE_NONE,new StringBuffer());
}
}