001/*
002 * jPOS Project [http://jpos.org]
003 * Copyright (C) 2000-2026 jPOS Software SRL
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jpos.iso;
020
021@SuppressWarnings("unused")
022public abstract class PosFlags {
023
024    public interface Flag {
025        int getOffset();
026        int intValue();
027    }
028
029    /**
030     * Sets or unsets a set of flags according to value
031     * @param value if true flags are set, else unset
032     * @param flags flag set to set or unset
033     */
034    protected void setFlags(boolean value, Flag... flags) {
035        byte[] b = getBytes();
036        if (value) {
037            for (Flag flag  : flags) {
038                for (int v = flag.intValue(), offset = flag.getOffset(); v != 0; v >>>= 8, offset++) {
039                    if (offset < b.length)
040                        b[offset] |= (byte) v;
041                }
042            }
043        } else {
044            for (Flag flag  : flags) {
045                for (int v = flag.intValue(), offset = flag.getOffset(); v != 0; v >>>= 8, offset++) {
046                    if (offset < b.length)
047                        b[offset] &= (byte) ~v;
048                }
049            }
050        }
051    }
052    public abstract byte[] getBytes();
053
054    public String toString() {
055        return super.toString() + "[" + ISOUtil.hexString (getBytes())+ "]";
056    }
057}