001/** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.activemq.openwire; 018 019import java.io.DataInput; 020import java.io.DataOutput; 021import java.io.IOException; 022import java.nio.ByteBuffer; 023 024public final class BooleanStream { 025 026 byte data[] = new byte[48]; 027 short arrayLimit; 028 short arrayPos; 029 byte bytePos; 030 031 public boolean readBoolean() throws IOException { 032 assert arrayPos <= arrayLimit; 033 byte b = data[arrayPos]; 034 boolean rc = ((b >> bytePos) & 0x01) != 0; 035 bytePos++; 036 if (bytePos >= 8) { 037 bytePos = 0; 038 arrayPos++; 039 } 040 return rc; 041 } 042 043 public void writeBoolean(boolean value) throws IOException { 044 if (bytePos == 0) { 045 arrayLimit++; 046 if (arrayLimit >= data.length) { 047 // re-grow the array. 048 byte d[] = new byte[data.length * 2]; 049 System.arraycopy(data, 0, d, 0, data.length); 050 data = d; 051 } 052 } 053 if (value) { 054 data[arrayPos] |= 0x01 << bytePos; 055 } 056 bytePos++; 057 if (bytePos >= 8) { 058 bytePos = 0; 059 arrayPos++; 060 } 061 } 062 063 public void marshal(DataOutput dataOut) throws IOException { 064 if (arrayLimit < 64) { 065 dataOut.writeByte(arrayLimit); 066 } else if (arrayLimit < 256) { // max value of unsigned byte 067 dataOut.writeByte(0xC0); 068 dataOut.writeByte(arrayLimit); 069 } else { 070 dataOut.writeByte(0x80); 071 dataOut.writeShort(arrayLimit); 072 } 073 074 dataOut.write(data, 0, arrayLimit); 075 clear(); 076 } 077 078 public void marshal(ByteBuffer dataOut) { 079 if (arrayLimit < 64) { 080 dataOut.put((byte)arrayLimit); 081 } else if (arrayLimit < 256) { // max value of unsigned byte 082 dataOut.put((byte)0xC0); 083 dataOut.put((byte)arrayLimit); 084 } else { 085 dataOut.put((byte)0x80); 086 dataOut.putShort(arrayLimit); 087 } 088 089 dataOut.put(data, 0, arrayLimit); 090 } 091 092 public void unmarshal(DataInput dataIn) throws IOException { 093 094 arrayLimit = (short)(dataIn.readByte() & 0xFF); 095 if (arrayLimit == 0xC0) { 096 arrayLimit = (short)(dataIn.readByte() & 0xFF); 097 } else if (arrayLimit == 0x80) { 098 arrayLimit = dataIn.readShort(); 099 } 100 if (data.length < arrayLimit) { 101 data = new byte[arrayLimit]; 102 } 103 dataIn.readFully(data, 0, arrayLimit); 104 clear(); 105 } 106 107 public void clear() { 108 arrayPos = 0; 109 bytePos = 0; 110 } 111 112 public int marshalledSize() { 113 if (arrayLimit < 64) { 114 return 1 + arrayLimit; 115 } else if (arrayLimit < 256) { 116 return 2 + arrayLimit; 117 } else { 118 return 3 + arrayLimit; 119 } 120 } 121 122}