/* $Id: SyntaxBin.java,v 1.1 2011/05/04 22:37:55 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.datatypes;
import java.math.BigInteger;
import org.kapott.hbci.comm.Comm;
import org.kapott.hbci.exceptions.InvalidArgumentException;
import org.kapott.hbci.exceptions.InvalidUserDataException;
import org.kapott.hbci.manager.HBCIUtilsInternal;
/* @internal
@brief SyntaxBin enth�lt Bin�rdaten.
Beim Initialisieren gibt das erste
Zeichen des �bergebenen Strings den Typ der nachfolgenden Daten an:
- N bedeutet, der nachfolgende String ist eine Integer-Zahl, die bin�r
dargestellt werden soll
- B bedeutet, der nachfolgende String ist bereits ein Bin�rstring
und soll ohne �nderungen �bernommen werden
@author $Author: willuhn $
*/
// intern wird das byte-array gespeichert
public class SyntaxBin
extends SyntaxDE
{
/** @internal @brief Returns a given number in byte notation
This method transforms a given number into its byte-representation
in big-endian-format.
@param x the String representation of the number
@return a String, where each "character" is one byte of the
big-endian-byte-representation of the given number
*/
private static String expandNumber(String x)
{
try {
return new String((new BigInteger(x)).toByteArray(),Comm.ENCODING);
} catch (Exception ex) {
throw new InvalidUserDataException(HBCIUtilsInternal.getLocMsg("EXCMSG_BINNUMERR"),ex);
}
}
/** @internal @brief erzeugt den HBCI-Datentyp BIN
Es wird der erzeugte String zur�ckgegeben. Dazu wird das erste Zeichen
des uebergebenen Strings ausgewertet. Ist dieses "N", so wird der
uebergebene String als Integer-Wert interpretiert und in seine
binaere Byte-Darstellung konvertiert. Bei "B" als erstem Zeichen wird
der String as-is uebernommen.
@param x the String to be converted
@return the binary String representing the given value
@exception IllegalArgumentException occurs when the first character of
the given string is neither "N" nor "B"
*/
private static String expand(String x)
{
char format = x.charAt(0);
String st = x.substring(1);
String ret = null;
switch (format) {
case 'N':
ret = expandNumber(st);
break;
case 'B':
ret = st;
break;
default:
throw new InvalidArgumentException(HBCIUtilsInternal.getLocMsg(
"EXC_DTBIN_NO_VALID_FORMAT",
Character.toString(format)));
}
return ret;
}
/** @internal @brief creates an object representing the BIN datatype
@see SyntaxDE
*/
public SyntaxBin(String x, int minlen, int maxlen)
{
super(expand(x),minlen,maxlen);
}
public void init(String x, int minlen, int maxlen)
{
super.init(expand(x),minlen,maxlen);
}
/** @see SyntaxDE */
public String toString(int zero)
{
String con=getContent();
String header="@"+Integer.toString(con.length())+"@";
return header+con;
}
// --------------------------------------------------------------------------------
/** @internal @brief returns the size of the header
@param st the string representing the complete datatype BIN
@return the length of the header-field in this string (i.e.
the number of bytes making the @len@ part of the string
*/
private int getHeaderLen(String st)
{
int idx = 0;
int delimFound = 0;
int len=st.length();
while (idx<len && delimFound!=2) {
if (st.charAt(idx++) == '@') {
delimFound++;
}
}
return idx;
}
/** @internal @brief gets the "real" value out of an HBCI-BIN-datatype
this method takes a string representing the value of a BIN-datatype
and extracts the real value (the data making the element) from it.
for this to achieve it removes the header containing the length
of the data
@param st the content of an HBCI-BIN-datatype-field
@return the "real" data wrapped into the given string
*/
private String parse(String st)
{
int headerLen = getHeaderLen(st);
String ret = "";
if (headerLen != 0) {
int size = Integer.parseInt(st.substring(1,headerLen-1));
ret=st.substring(headerLen,headerLen+size);
}
return ret;
}
private void initData(StringBuffer res,int minsize,int maxsize)
{
int startidx = skipPreDelim(res);
int endidx = findNextDelim(res, startidx);
String st = res.substring(startidx, endidx);
String temp = parse(st);
setContent(temp, minsize, maxsize);
res.delete(0, endidx);
}
/** @see SyntaxDE */
public SyntaxBin(StringBuffer res, int minsize, int maxsize)
{
initData(res,minsize,maxsize);
}
public void init(StringBuffer res, int minsize, int maxsize)
{
initData(res,minsize,maxsize);
}
}