front_processing/extern/TUIO_JAVA/src/com/illposed/osc/utility/OSCJavaToByteArrayConverter.java
author bastiena
Fri, 09 Mar 2012 14:52:11 +0100
changeset 0 6fefd4afe506
child 9 0f44b7360c8d
permissions -rw-r--r--
First Import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     1
/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     2
 * @author cramakrishnan
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     3
 *
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     4
 * Copyright (C) 2003, C. Ramakrishnan / Illposed Software
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     5
 * All rights reserved.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     6
 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     7
 * See license.txt (or license.rtf) for license information.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     8
 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     9
 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    10
 * OSCJavaToByteArrayConverter is a helper class that translates
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    11
 * from Java types to the format the OSC spec specifies for those
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    12
 * types.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    13
 *
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    14
 * This implementation is based on Markus Gaelli and
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    15
 * Iannis Zannos' OSC implementation in Squeak:
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    16
 * http://www.emergent.de/Goodies/
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    17
 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    18
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    19
package com.illposed.osc.utility;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    20
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    21
import java.io.IOException;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    22
import java.io.ByteArrayOutputStream;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    23
import java.math.BigInteger;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    24
import java.util.Enumeration;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    25
import java.util.Vector;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    26
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    27
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    28
public class OSCJavaToByteArrayConverter {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    29
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    30
	protected ByteArrayOutputStream stream = new ByteArrayOutputStream();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    31
	private byte[] intBytes = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    32
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    33
	/*public OSCJavaToByteArrayConverter() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    34
		super();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    35
	}*/
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    36
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    37
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    38
	 * Creation date: (2/23/2001 2:43:25 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    39
	 * @param anArray java.lang.Object[]
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    40
	 *
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    41
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    42
	public void appendNullCharToAlignStream() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    43
		int mod = stream.size() % 4;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    44
		int pad = 4 - mod;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    45
		for (int i = 0; i < pad; i++)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    46
			stream.write(0);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    47
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    48
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    49
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    50
	 * Creation date: (2/23/2001 2:21:53 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    51
	 * @return byte[]
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    52
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    53
	public byte[] toByteArray() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    54
		return stream.toByteArray();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    55
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    56
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    57
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    58
	 * Creation date: (2/23/2001 2:14:23 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    59
	 * @param bytes byte[]
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    60
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    61
	public void write(byte[] bytes) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    62
		writeBigEndToFourByteBoundry(bytes);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    63
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    64
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    65
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    66
	 * Creation date: (2/23/2001 2:21:04 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    67
	 * @param i int
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    68
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    69
	public void write(int i) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    70
		writeIntegerToByteArray(i);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    71
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    72
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    73
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    74
	 * Creation date: (2/23/2001 2:03:57 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    75
	 * @param f java.lang.Float
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    76
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    77
	public void write(Float f) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    78
		writeIntegerToByteArray(Float.floatToIntBits(f.floatValue()));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    79
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    80
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    81
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    82
	 * Creation date: (2/23/2001 2:08:36 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    83
	 * @param i java.lang.Integer
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    84
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    85
	public void write(Integer i) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    86
		writeIntegerToByteArray(i.intValue());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    87
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    88
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    89
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    90
	 * Creation date: (2/23/2001 1:57:35 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    91
	 * @param str java.lang.String
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    92
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    93
	public void write(String str) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    94
		writeLittleEndToFourByteBoundry(str.getBytes());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    95
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    96
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    97
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    98
	 * Creation date: (2/23/2001 2:08:36 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    99
	 * @param c char
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   100
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   101
	public void write(char c) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   102
		stream.write(c);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   103
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   104
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   105
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   106
	 * Creation date: (2/23/2001 2:02:54 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   107
	 * @param anObject java.lang.Object
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   108
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   109
	public void write(Object anObject) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   110
		// Can't do switch on class
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   111
		if (null == anObject)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   112
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   113
		if (anObject instanceof Float) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   114
			write((Float) anObject);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   115
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   116
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   117
		if (anObject instanceof String) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   118
			write((String) anObject);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   119
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   120
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   121
		if (anObject instanceof Integer) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   122
			write((Integer) anObject);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   123
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   124
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   125
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   126
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   127
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   128
	 * Creation date: (2/23/2001 2:43:25 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   129
	 * @param aClass Class
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   130
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   131
	public void writeType(Class c) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   132
		// A big ol' case statement -- what's polymorphism mean, again?
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   133
		// I really wish I could extend the base classes!
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   134
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   135
		// use the appropriate flags to tell SuperCollider what kind of 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   136
		// thing it is looking at
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   137
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   138
		if (Integer.class.equals(c)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   139
			stream.write('i');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   140
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   141
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   142
		if (java.math.BigInteger.class.equals(c)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   143
			stream.write('h');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   144
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   145
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   146
		if (Float.class.equals(c)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   147
			stream.write('f');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   148
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   149
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   150
		if (Double.class.equals(c)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   151
			stream.write('d');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   152
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   153
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   154
		if (String.class.equals(c)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   155
			stream.write('s');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   156
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   157
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   158
		if (Character.class.equals(c)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   159
			stream.write('c');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   160
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   161
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   162
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   163
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   164
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   165
	 * Creation date: (2/23/2001 2:43:25 AM)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   166
	 * @param anArray java.lang.Object[]
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   167
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   168
	public void writeTypesArray(Object[] array) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   169
		// A big ol' case statement in a for loop -- what's polymorphism mean, again?
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   170
		// I really wish I could extend the base classes!
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   171
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   172
		for (int i = 0; i < array.length; i++) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   173
			if (null == array[i])
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   174
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   175
			// if the array at i is a type of array write a [
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   176
			// This is used for nested arguments
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   177
			if (array[i].getClass().isArray()) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   178
				stream.write('[');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   179
				// fill the [] with the SuperCollider types corresponding to the object
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   180
				// (i.e. Object of type String needs -s).
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   181
				writeTypesArray((Object[]) array[i]);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   182
				// close the array
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   183
				stream.write(']');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   184
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   185
			}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   186
			// Create a way to deal with Boolean type objects
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   187
			if (Boolean.TRUE.equals(array[i])) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   188
				stream.write('T');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   189
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   190
			}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   191
			if (Boolean.FALSE.equals(array[i])) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   192
				stream.write('F');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   193
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   194
			}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   195
			// go through the array and write the superCollider types as shown in the 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   196
			// above method. the Classes derived here are used as the arg to the above method
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   197
			writeType(array[i].getClass());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   198
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   199
		// align the stream with padded bytes
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   200
		appendNullCharToAlignStream();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   201
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   202
	
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   203
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   204
	 * Same as writeSuperColliderTypes(Object[]), just that it takes a vector (for jdk1.1
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   205
	 * compatibility), rather than an array.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   206
	 * @param vector  the collection I am to write out types for
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   207
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   208
	public void writeTypes(Vector vector) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   209
		// A big ol' case statement in a for loop -- what's polymorphism mean, again?
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   210
		// I really wish I could extend the base classes!
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   211
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   212
		Enumeration enm = vector.elements();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   213
		Object nextObject;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   214
		while (enm.hasMoreElements()) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   215
			nextObject = enm.nextElement();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   216
			if (null == nextObject)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   217
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   218
			// if the array at i is a type of array write a [
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   219
			// This is used for nested arguments
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   220
			if (nextObject.getClass().isArray()) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   221
				stream.write('[');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   222
				// fill the [] with the SuperCollider types corresponding to the object
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   223
				// (e.g., Object of type String needs -s).
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   224
				writeTypesArray((Object[]) nextObject);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   225
				// close the array
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   226
				stream.write(']');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   227
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   228
			}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   229
			// Create a way to deal with Boolean type objects
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   230
			if (Boolean.TRUE.equals(nextObject)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   231
				stream.write('T');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   232
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   233
			}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   234
			if (Boolean.FALSE.equals(nextObject)) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   235
				stream.write('F');
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   236
				continue;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   237
			}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   238
			// go through the array and write the superCollider types as shown in the 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   239
			// above method. the Classes derived here are used as the arg to the above method
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   240
			writeType(nextObject.getClass());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   241
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   242
		// align the stream with padded bytes
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   243
		appendNullCharToAlignStream();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   244
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   245
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   246
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   247
	 * convert an integer to byte array
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   248
	 *
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   249
	 * @param value int
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   250
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   251
	private void writeIntegerToByteArray(int value) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   252
		byte[] intBytes = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   253
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   254
		intBytes[3] = (byte)value; value>>>=8;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   255
		intBytes[2] = (byte)value; value>>>=8;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   256
		intBytes[1] = (byte)value; value>>>=8;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   257
		intBytes[0] = (byte)value;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   258
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   259
		try {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   260
			stream.write(intBytes);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   261
		} catch (IOException e) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   262
			throw new RuntimeException("You're screwed: IOException writing to a ByteArrayOutputStream");
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   263
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   264
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   265
	
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   266
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   267
	 * Line up the BigEnd of the bytes to a 4 byte boundry
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   268
	 *
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   269
	 * @param bytes byte[]
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   270
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   271
	private void writeBigEndToFourByteBoundry(byte[] bytes) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   272
		int mod = bytes.length % 4;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   273
		// if the remainder == 0 write the bytes
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   274
		if (mod == 0) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   275
			try { stream.write(bytes); } catch (IOException e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   276
			{ throw new RuntimeException("You're screwed: IOException writing to a ByteArrayOutputStream"); }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   277
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   278
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   279
		// pad the bytes to lineup correctly
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   280
		int pad = 4 - mod;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   281
		byte[] newBytes = new byte[pad + bytes.length];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   282
		System.arraycopy(bytes,0,newBytes,pad,bytes.length);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   283
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   284
		try { stream.write(newBytes); } catch (IOException e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   285
		{ throw new RuntimeException("You're screwed: IOException writing to a ByteArrayOutputStream"); }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   286
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   287
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   288
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   289
	 * Line up the LittleEnd of the bytes to a 4 byte boundry
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   290
	 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   291
	 * @param bytes byte[]
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   292
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   293
	private void writeLittleEndToFourByteBoundry(byte[] bytes) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   294
		int mod = bytes.length % 4;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   295
		// if the remainder == 0 write the bytes
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   296
		if (mod == 4) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   297
			try { stream.write(bytes); } catch (IOException e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   298
			{ throw new RuntimeException("You're screwed: IOException writing to a ByteArrayOutputStream"); }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   299
			return;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   300
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   301
		// pad the bytes to lineup correctly
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   302
		int pad = 4 - mod;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   303
		byte[] newBytes = new byte[pad + bytes.length];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   304
		System.arraycopy(bytes,0,newBytes,0,bytes.length);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   305
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   306
		try { stream.write(newBytes); } catch (IOException e)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   307
		{ throw new RuntimeException("You're screwed: IOException writing to a ByteArrayOutputStream"); }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   308
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   309
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   310
}