/*
* Copyright (c) 2000 jPOS.org. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the jPOS project
* (http://www.jpos.org/)". Alternately, this acknowledgment may
* appear in the software itself, if and wherever such third-party
* acknowledgments normally appear.
*
* 4. The names "jPOS" and "jPOS.org" must not be used to endorse
* or promote products derived from this software without prior
* written permission. For written permission, please contact
* license@jpos.org.
*
* 5. Products derived from this software may not be called "jPOS",
* nor may "jPOS" appear in their name, without prior written
* permission of the jPOS project.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE JPOS PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the jPOS Project. For more
* information please see <http://www.jpos.org/>.
*/
package org.jpos.iso;
import java.io.IOException;
import java.io.InputStream;
/**
* ISOFieldPackager ASCII variable len CHAR suitable for EuroPay subfield 48<br>
* <code>
* Format TTLL....
* Where TT is the 2 digit field number (Tag)
* LL is the 2 digit field length (value is length(data))
* .... is the field content
* </code>
*
* @author <a href="mailto:marksalter@dsl.pipex.com">Mark Salter</a>
* @version $Id: IFEP_TTLLCHAR.java,v 1.0 2006/04/22 09:17:00 ms Exp $
* @see ISOComponent
*/
public class IFEP_TTLLCHAR extends ISOFieldPackager {
String ID = getDefaultID();
public IFEP_TTLLCHAR() {
super();
}
/**
* @param len -
* field len
* @param description
* symbolic descrption
*/
public IFEP_TTLLCHAR(int len, String description) {
super(len, description);
}
/**
* @param c -
* a component
* @return packed component
* @exception ISOException
*/
public byte[] pack(ISOComponent c) throws ISOException {
int len;
String s = (String) c.getValue();
if ((len = s.length()) > getLength() || len > 97) // paranoia settings
throw new ISOException("invalid len " + len
+ " packing LLEPCHAR field " + (Integer) c.getKey());
return (ID + ISOUtil.zeropad(Integer.toString(len), 2) + s).getBytes();
}
/**
* @param c -
* the Component to unpack
* @param b -
* binary image
* @param offset -
* starting offset within the binary image
* @return consumed bytes
* @exception ISOException
*/
public int unpack(ISOComponent c, byte[] b, int offset) throws ISOException {
// Pull ID from available stream, overidding default ID.
ID = new String(b, offset, getIDLength());
int len = Integer.parseInt(new String(b, offset + getIDLength(), 2));
if (!(c instanceof ISOField))
throw new ISOException(c.getClass().getName()
+ " is not an ISOField");
// ((ISOField)c).setFieldNumber (
// Integer.parseInt(new String(b, offset+2, 2))
// );
c.setValue(new String(b, offset + getIDLength() + 2, len));
return getIDLength() + 2 + len;
}
/*
* @return int length of ID
*/
int getIDLength() {
return ID.length();
}
/*
* @return String Default ID
*/
String getDefaultID() {
return "??";
}
/*
* @param id String field ID
*/
void setID(String id) throws ISOException {
if (id.length() != getIDLength())
throw new ISOException(
id
+ " is not an acceptable length of field ID, it should must "
+ getIDLength() + " long!");
ID = id;
}
public void unpack(ISOComponent c, InputStream in) throws IOException,
ISOException {
if (!(c instanceof ISOField))
throw new ISOException(c.getClass().getName()
+ " is not an ISOField");
ID = new String(readBytes(in, getIDLength()));
int len = Integer.parseInt(new String(readBytes(in, 2)));
int fldno = Integer.parseInt(new String(readBytes(in, 2)));
((ISOField) c).setFieldNumber(fldno);
c.setValue(new String(readBytes(in, len)));
}
public int getMaxPackedLength() {
return getIDLength() + getLength() + 2;
}
}