/* $Id: CommStandard.java,v 1.1 2011/05/04 22:37:50 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.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import org.kapott.hbci.exceptions.HBCI_Exception;
import org.kapott.hbci.manager.HBCIUtils;
import org.kapott.hbci.manager.HBCIUtilsInternal;
import org.kapott.hbci.manager.MsgGen;
import org.kapott.hbci.passport.HBCIPassportInternal;
import org.kapott.hbci.protocol.MSG;
public final class CommStandard
extends Comm
{
Socket s; /**< @internal @brief The socket for communicating with the server. */
OutputStream o; /**< @internal @brief The outputstream to write HBCI-messages to. */
InputStream i; /**< @internal @brief The inputstream to read HBCI-messages from. */
public CommStandard(HBCIPassportInternal parentPassport)
{
super(parentPassport);
HBCIUtils.log("opening connection to "+
parentPassport.getHost()+":"+
parentPassport.getPort().toString(),
HBCIUtils.LOG_DEBUG);
try {
String socksServer=HBCIUtils.getParam("comm.standard.socks.server");
if (socksServer!=null && socksServer.trim().length()!=0) {
// use SOCKS server
String[] ss=socksServer.split(":");
String socksHost=ss[0].trim();
String socksPort=ss[1].trim();
HBCIUtils.log(
"using SOCKS server at "+socksHost+":"+socksPort,
HBCIUtils.LOG_DEBUG);
Proxy proxy=new Proxy(
Proxy.Type.SOCKS,
new InetSocketAddress(socksHost, Integer.parseInt(socksPort)));
this.s=new Socket(proxy);
} else {
// no SOCKS server
s=new Socket();
}
int localPort=Integer.parseInt(HBCIUtils.getParam("client.connection.localPort","0"));
if (localPort!=0) {
s.setReuseAddress(true);
s.bind(new InetSocketAddress(localPort));
}
s.connect(new InetSocketAddress(parentPassport.getHost(),
parentPassport.getPort().intValue()));
i=s.getInputStream();
o=s.getOutputStream();
} catch (Exception e) {
throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_CONNERR"),e);
}
}
protected void ping(MSG msg)
{
try {
byte[] b=filter.encode(msg.toString(0));
o.write(b);
o.flush();
} catch (Exception ex) {
throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_SENDERR"),ex);
}
}
protected StringBuffer pong(MsgGen gen)
{
int num;
byte[] b = new byte[1024];
StringBuffer ret = new StringBuffer();
boolean sizeknown = false;
int msgsize=-1;
HBCIUtils.log("waiting for response",HBCIUtils.LOG_INFO);
try {
StringBuffer res=new StringBuffer();
while ((!sizeknown || msgsize>0) && (num=i.read(b))!=-1) {
HBCIUtils.log("received "+num+" bytes",HBCIUtils.LOG_DEBUG2);
String st=new String(b,0,num,ENCODING);
ret.append(st);
if (!sizeknown) {
res.setLength(0);
res.append(filter.decode(ret.toString()));
msgsize=extractMessageSize(res);
if (msgsize!=-1) {
HBCIUtils.log("found message size: "+msgsize,HBCIUtils.LOG_DEBUG);
// jetzt ist die msgsize bekannt
// davon die anzahl der schon gelesenen zeichen abziehen
msgsize-=ret.length();
sizeknown=true;
}
} else {
msgsize-=num;
}
HBCIUtils.log("we still need "+msgsize+" bytes",HBCIUtils.LOG_DEBUG2);
}
// FileOutputStream fo=new FileOutputStream("pong.dat");
// fo.write(ret.toString().getBytes(ENCODING));
// fo.close();
return new StringBuffer(filter.decode(ret.toString()));
} catch (Exception ex) {
throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_RECVERR"),ex);
}
}
private int extractMessageSize(StringBuffer st)
{
int ret=-1;
if (st!=null) {
int firstPlus=st.indexOf("+");
if (firstPlus!=-1) {
int secondPlus=st.indexOf("+",firstPlus+1);
if (secondPlus!=-1) {
ret=Integer.parseInt(st.substring(firstPlus+1,secondPlus));
}
}
}
return ret;
}
protected void closeConnection()
{
try {
HBCIUtils.log("closing communication line",HBCIUtils.LOG_DEBUG);
s.close();
} catch (Exception ex) {
throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_CLOSEERR"),ex);
}
}
}