/*
* JBoss, Home of Professional Open Source.
* Copyright (c) 2011, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.ejb3.remote._private;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* A {@link org.jboss.ejb.protocol.remote.PackedInteger} is a variable-length integer. The most-significant bit of each byte of a
* {@link org.jboss.ejb.protocol.remote.PackedInteger} value indicates whether that byte is the final (lowest-order) byte of the value.
* If the bit is 0, then this is the last byte; if the bit is 1, then there is at least one more subsequent
* byte pending, and the current value should be shifted to the left by 7 bits to accommodate the next byte's data.
* <p/>
* Note: {@link org.jboss.ejb.protocol.remote.PackedInteger} cannot hold signed integer values.
*
* @author <a href="mailto:cdewolf@redhat.com">Carlo de Wolf</a>
*/
public class PackedInteger {
/**
* Reads a {@link org.jboss.ejb.protocol.remote.PackedInteger} value from the passed {@link java.io.DataInput input} and returns the
* value of the integer.
*
* @param input The {@link java.io.DataInput} from which the {@link org.jboss.ejb.protocol.remote.PackedInteger} value will be read
* @return
* @throws java.io.IOException
* @throws IllegalArgumentException If the passed <code>input</code> is null
*/
public static int readPackedInteger(final DataInput input) throws IOException {
int b = input.readByte();
if ((b & 0x80) == 0x80) {
return readPackedInteger(input) << 7 | (b & 0x7F);
}
return b;
}
/**
* Converts the passed <code>value</code> into a {@link org.jboss.ejb.protocol.remote.PackedInteger} and writes it to the
* {@link java.io.DataOutput output}
*
* @param output The {@link java.io.DataOutput} to which the {@link org.jboss.ejb.protocol.remote.PackedInteger} is written to
* @param value The integer value which will be converted to a {@link org.jboss.ejb.protocol.remote.PackedInteger}
* @throws java.io.IOException
* @throws IllegalArgumentException If the passed <code>value</code> is < 0. {@link org.jboss.ejb.protocol.remote.PackedInteger} doesn't
* allow signed integer
* @throws IllegalArgumentException If the passed <code>output</code> is null
*/
public static void writePackedInteger(final DataOutput output, int value) throws IOException {
if (value < 0)
throw new IllegalArgumentException("Only unsigned integer can be packed");
if (value > 127) {
output.writeByte(value & 0x7F | 0x80);
writePackedInteger(output, value >> 7);
} else {
output.writeByte(value & 0xFF);
}
}
}