blob: dbc418c57f2eb33e057338d965d8b4fcf227ebc8 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.openwire;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.nio.ByteBuffer;
public final class BooleanStream {
byte data[] = new byte[48];
short arrayLimit;
short arrayPos;
byte bytePos;
public boolean readBoolean() throws IOException {
assert arrayPos <= arrayLimit;
byte b = data[arrayPos];
boolean rc = ((b >> bytePos) & 0x01) != 0;
bytePos++;
if (bytePos >= 8) {
bytePos = 0;
arrayPos++;
}
return rc;
}
public void writeBoolean(boolean value) throws IOException {
if (bytePos == 0) {
arrayLimit++;
if (arrayLimit >= data.length) {
// re-grow the array.
byte d[] = new byte[data.length * 2];
System.arraycopy(data, 0, d, 0, data.length);
data = d;
}
}
if (value) {
data[arrayPos] |= 0x01 << bytePos;
}
bytePos++;
if (bytePos >= 8) {
bytePos = 0;
arrayPos++;
}
}
public void marshal(DataOutput dataOut) throws IOException {
if (arrayLimit < 64) {
dataOut.writeByte(arrayLimit);
} else if (arrayLimit < 256) { // max value of unsigned byte
dataOut.writeByte(0xC0);
dataOut.writeByte(arrayLimit);
} else {
dataOut.writeByte(0x80);
dataOut.writeShort(arrayLimit);
}
dataOut.write(data, 0, arrayLimit);
clear();
}
public void marshal(ByteBuffer dataOut) {
if (arrayLimit < 64) {
dataOut.put((byte)arrayLimit);
} else if (arrayLimit < 256) { // max value of unsigned byte
dataOut.put((byte)0xC0);
dataOut.put((byte)arrayLimit);
} else {
dataOut.put((byte)0x80);
dataOut.putShort(arrayLimit);
}
dataOut.put(data, 0, arrayLimit);
}
public void unmarshal(DataInput dataIn) throws IOException {
arrayLimit = (short)(dataIn.readByte() & 0xFF);
if (arrayLimit == 0xC0) {
arrayLimit = (short)(dataIn.readByte() & 0xFF);
} else if (arrayLimit == 0x80) {
arrayLimit = dataIn.readShort();
}
if (data.length < arrayLimit) {
data = new byte[arrayLimit];
}
dataIn.readFully(data, 0, arrayLimit);
clear();
}
public void clear() {
arrayPos = 0;
bytePos = 0;
}
public int marshalledSize() {
if (arrayLimit < 64) {
return 1 + arrayLimit;
} else if (arrayLimit < 256) {
return 2 + arrayLimit;
} else {
return 3 + arrayLimit;
}
}
}