Search in sources :

Example 16 with ISOTaggedField

use of org.jpos.tlv.ISOTaggedField in project jPOS by jpos.

the class TaggedSequencePackager method unpack.

@Override
public int unpack(ISOComponent m, byte[] b) throws ISOException {
    LogEvent evt = new LogEvent(this, "unpack");
    try {
        if (m.getComposite() != m)
            throw new ISOException("Can't call packager on non Composite");
        if (b.length == 0)
            // nothing to do
            return 0;
        if (// save a few CPU cycle if no logger available
        logger != null)
            evt.addMessage(ISOUtil.hexString(b));
        // Read any non-tlv fields present at beginning of data
        PrefixUnpackResult prefixUnpackResult = unpackPrefixes(m, b);
        int subFieldId = prefixUnpackResult.getSubFieldId();
        int consumed = prefixUnpackResult.getConsumed();
        if (subFieldId == 0) {
            subFieldId = 1;
        }
        while (consumed < b.length) {
            ISOField tagField = new ISOField(subFieldId);
            tagPackager.unpack(tagField, b, consumed);
            String tag = tagField.getValue().toString();
            ISOFieldPackager fieldPackager = (ISOFieldPackager) packagerMap.get(tag);
            if (fieldPackager == null) {
                fieldPackager = (ISOFieldPackager) packagerMap.get("default");
            }
            if (fieldPackager == null) {
                throw new ISOException("No default tag packager and no field packager configured for tag: " + tag);
            }
            int fieldNumber = subFieldId++;
            ISOTaggedField taggedField = (ISOTaggedField) fieldPackager.createComponent(fieldNumber);
            consumed += fieldPackager.unpack(taggedField, b, consumed);
            m.set(taggedField);
        }
        if (b.length != consumed) {
            evt.addMessage("WARNING: unpack len=" + b.length + " consumed=" + consumed);
        }
        return consumed;
    } catch (ISOException e) {
        evt.addMessage(e);
        throw e;
    } catch (Exception e) {
        evt.addMessage(e);
        throw new ISOException(e);
    } finally {
        Logger.log(evt);
    }
}
Also used : ISOField(org.jpos.iso.ISOField) ISOException(org.jpos.iso.ISOException) LogEvent(org.jpos.util.LogEvent) ISOTaggedField(org.jpos.tlv.ISOTaggedField) ISOFieldPackager(org.jpos.iso.ISOFieldPackager) ISOException(org.jpos.iso.ISOException) IOException(java.io.IOException)

Example 17 with ISOTaggedField

use of org.jpos.tlv.ISOTaggedField in project jPOS by jpos.

the class TaggedSequencePackager method pack.

/**
 * Pack the subfield into a byte array
 */
public byte[] pack(ISOComponent m) throws ISOException {
    LogEvent evt = new LogEvent(this, "pack");
    try {
        ISOComponent c;
        List<byte[]> l = new ArrayList<byte[]>();
        Map fields = m.getChildren();
        fields.remove(new Integer(-1));
        int len = 0;
        boolean tagsStarted = false;
        Iterator iterator = fields.values().iterator();
        if (m instanceof OffsetIndexedComposite) {
            int offset = ((OffsetIndexedComposite) m).getOffset();
            for (int i = 0; i < offset && iterator.hasNext(); i++) {
                iterator.next();
            }
        }
        while (iterator.hasNext() && len < this.length) {
            Object obj = iterator.next();
            c = (ISOComponent) obj;
            byte[] b;
            if (c.getValue() != null) {
                if (c instanceof ISOTaggedField) {
                    tagsStarted = true;
                    String tag = ((ISOTaggedField) c).getTag();
                    if (tag == null) {
                        evt.addMessage("error packing subfield " + c.getKey());
                        evt.addMessage(c);
                        throw new ISOException("Tag should not be null");
                    } else {
                        ISOFieldPackager fieldPackager = (ISOFieldPackager) packagerMap.get(tag);
                        if (fieldPackager == null) {
                            fieldPackager = (ISOFieldPackager) packagerMap.get("default");
                        }
                        if (fieldPackager == null) {
                            throw new ISOException("No default tag packager and no field packager configured for tag: " + tag);
                        }
                        b = fieldPackager.pack(c);
                        if (len + b.length > this.length) {
                            break;
                        }
                        len += b.length;
                        l.add(b);
                    }
                } else if (!tagsStarted && fld.length > (Integer) c.getKey() && fld[(Integer) c.getKey()] != null) {
                    b = fld[(Integer) c.getKey()].pack(c);
                    len += b.length;
                    l.add(b);
                } else {
                    int tagNumber = (Integer) c.getKey();
                    String tag = ISOUtil.padleft(String.valueOf(tagNumber), this.tag.length(), '0');
                    ISOTaggedField isoTaggedField = new ISOTaggedField(tag, c);
                    if (fld.length > tagNumber) {
                        b = fld[(Integer) c.getKey()].pack(isoTaggedField);
                    } else {
                        ISOFieldPackager fieldPackager = (ISOFieldPackager) packagerMap.get(tag);
                        if (fieldPackager == null) {
                            fieldPackager = (ISOFieldPackager) packagerMap.get("default");
                        }
                        if (fieldPackager == null) {
                            throw new ISOException("No default tag packager and no field packager configured for tag: " + tag);
                        }
                        b = fieldPackager.pack(isoTaggedField);
                        if (len + b.length > this.length) {
                            break;
                        }
                    }
                    len += b.length;
                    l.add(b);
                }
            }
            if (m instanceof OffsetIndexedComposite) {
                ((OffsetIndexedComposite) m).incOffset();
            }
        }
        int k = 0;
        byte[] d = new byte[len];
        for (byte[] b : l) {
            System.arraycopy(b, 0, d, k, b.length);
            k += b.length;
        }
        if (// save a few CPU cycle if no logger available
        logger != null)
            evt.addMessage(ISOUtil.hexString(d));
        return d;
    } catch (ISOException e) {
        evt.addMessage(e);
        throw e;
    } catch (Exception e) {
        evt.addMessage(e);
        throw new ISOException(e);
    } finally {
        Logger.log(evt);
    }
}
Also used : ISOComponent(org.jpos.iso.ISOComponent) OffsetIndexedComposite(org.jpos.tlv.OffsetIndexedComposite) LogEvent(org.jpos.util.LogEvent) ArrayList(java.util.ArrayList) ISOFieldPackager(org.jpos.iso.ISOFieldPackager) ISOException(org.jpos.iso.ISOException) IOException(java.io.IOException) ISOException(org.jpos.iso.ISOException) Iterator(java.util.Iterator) ISOTaggedField(org.jpos.tlv.ISOTaggedField) TreeMap(java.util.TreeMap) Map(java.util.Map)

Example 18 with ISOTaggedField

use of org.jpos.tlv.ISOTaggedField in project jPOS by jpos.

the class BERTLVPackager method pack.

public byte[] pack(ISOComponent m, boolean nested, int startIdx, int endIdx) throws ISOException {
    LogEvent evt = new LogEvent(this, "pack");
    try {
        ISOComponent c;
        List<byte[]> l = new ArrayList<byte[]>();
        Map fields = m.getChildren();
        int len = 0;
        for (int i = startIdx; i <= endIdx; i++) {
            c = (ISOComponent) fields.get(i);
            if (c != null) {
                try {
                    final byte[] b;
                    if (c instanceof ISOTaggedField) {
                        b = packTLV((ISOTaggedField) c);
                    } else {
                        if (c.getValue() == null) {
                            b = new byte[0];
                        } else if (!nested && (i == startIdx || i == endIdx) && this.fld.length > i && this.fld[i] != null) {
                            b = this.fld[i].pack(c);
                        } else {
                            throw new ISOException("Field: " + i + " of type: " + c.getClass() + " cannot be packed. Either the object should be of type ISOTagField" + " OR this should be the first or last sub-field and a packager" + " should be configured for the same");
                        }
                    }
                    len += b.length;
                    l.add(b);
                } catch (Exception e) {
                    evt.addMessage("error packing sub-field " + i);
                    evt.addMessage(c);
                    evt.addMessage(e);
                    throw e;
                }
            }
        }
        int k = 0;
        byte[] d = new byte[len];
        for (byte[] b : l) {
            System.arraycopy(b, 0, d, k, b.length);
            k += b.length;
        }
        if (// save a few CPU cycle if no logger available
        logger != null)
            evt.addMessage(ISOUtil.hexString(d));
        return d;
    } catch (ISOException e) {
        evt.addMessage(e);
        throw e;
    } catch (Exception e) {
        evt.addMessage(e);
        throw new ISOException(e);
    } finally {
        Logger.log(evt);
    }
}
Also used : ISOComponent(org.jpos.iso.ISOComponent) ISOException(org.jpos.iso.ISOException) LogEvent(org.jpos.util.LogEvent) ArrayList(java.util.ArrayList) ISOTaggedField(org.jpos.tlv.ISOTaggedField) Map(java.util.Map) ConfigurationException(org.jpos.core.ConfigurationException) UnknownTagNumberException(org.jpos.emv.UnknownTagNumberException) ISOException(org.jpos.iso.ISOException) IOException(java.io.IOException)

Aggregations

ISOTaggedField (org.jpos.tlv.ISOTaggedField)18 ISOField (org.jpos.iso.ISOField)15 IOException (java.io.IOException)4 ISOException (org.jpos.iso.ISOException)4 LogEvent (org.jpos.util.LogEvent)4 ISOComponent (org.jpos.iso.ISOComponent)3 ISOFieldPackager (org.jpos.iso.ISOFieldPackager)3 ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 ConfigurationException (org.jpos.core.ConfigurationException)2 UnknownTagNumberException (org.jpos.emv.UnknownTagNumberException)2 Iterator (java.util.Iterator)1 TreeMap (java.util.TreeMap)1 OffsetIndexedComposite (org.jpos.tlv.OffsetIndexedComposite)1