front_processing/extern/TUIO_JAVA/src/com/illposed/osc/utility/OSCByteArrayToJavaConverter.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
/* $Id: OSCByteArrayToJavaConverter.java,v 1.1.1.1 2006/11/13 14:47:22 modin Exp $
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     2
 * Created on 28.10.2003
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     3
 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     4
package com.illposed.osc.utility;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     5
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     6
import java.math.BigInteger;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     7
import java.util.Date;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     8
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     9
import com.illposed.osc.*;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    10
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    11
/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    12
 * @author cramakrishnan
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    13
 *
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    14
 * Copyright (C) 2003, C. Ramakrishnan / Auracle
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    15
 * All rights reserved.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    16
 * 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    17
 * See license.txt (or license.rtf) for license information.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    18
 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    19
public class OSCByteArrayToJavaConverter {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    20
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    21
	byte[] bytes;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    22
	int bytesLength;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    23
	int streamPosition;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    24
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    25
	private byte[] intBytes   = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    26
	private byte[] floatBytes = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    27
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    28
	private	byte[] secondBytes = new byte[8];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    29
	private	byte[] picosecBytes = new byte[8];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    30
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    31
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    32
	 * Helper object for converting from a byte array to Java objects
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    33
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    34
	/*public OSCByteArrayToJavaConverter() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    35
		super();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    36
	}*/
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    37
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    38
	public OSCPacket convert(byte[] byteArray, int bytesLength) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    39
		bytes = byteArray;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    40
		this.bytesLength = bytesLength;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    41
		streamPosition = 0;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    42
		if (isBundle())
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    43
			return convertBundle();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    44
		else
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    45
			return convertMessage();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    46
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    47
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    48
	private boolean isBundle() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    49
		// only need the first 7 to check if it is a bundle
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    50
		String bytesAsString = new String(bytes, 0, 7);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    51
		return bytesAsString.startsWith("#bundle");
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    52
	}                               
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    53
                               
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    54
	private OSCBundle convertBundle() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    55
		// skip the "#bundle " stuff
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    56
		streamPosition = 8;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    57
		Date timestamp = readTimeTag();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    58
		OSCBundle bundle = new OSCBundle(timestamp);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    59
		OSCByteArrayToJavaConverter myConverter = new OSCByteArrayToJavaConverter();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    60
		while (streamPosition < bytesLength) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    61
			// recursively read through the stream and convert packets you find
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    62
			int packetLength = ((Integer) readInteger()).intValue();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    63
			byte[] packetBytes = new byte[packetLength];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    64
			//streamPosition++;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    65
			System.arraycopy(bytes,streamPosition,packetBytes,0,packetLength);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    66
			streamPosition+=packetLength;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    67
			//for (int i = 0; i < packetLength; i++)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    68
			//	packetBytes[i] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    69
			OSCPacket packet = myConverter.convert(packetBytes, packetLength);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    70
			bundle.addPacket(packet);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    71
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    72
		return bundle;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    73
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    74
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    75
	private OSCMessage convertMessage() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    76
		OSCMessage message = new OSCMessage();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    77
		message.setAddress(readString());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    78
		char[] types = readTypes();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    79
		if (null == types) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    80
			// we are done
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    81
			return message;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    82
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    83
		moveToFourByteBoundry();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    84
		for (int i = 0; i < types.length; i++) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    85
			if ('[' == types[i]) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    86
				// we're looking at an array -- read it in
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    87
				message.addArgument(readArray(types, i));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    88
				// then increment i to the end of the array
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    89
				while (']' != types[i])
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    90
					i++;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    91
			} else
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    92
				message.addArgument(readArgument(types[i]));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    93
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    94
		return message;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    95
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    96
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    97
	private String readString() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    98
		int strLen = lengthOfCurrentString();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    99
		char[] stringChars = new char[strLen];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   100
		//System.arraycopy(bytes,streamPosition,stringChars,0,strLen);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   101
		//streamPosition+=strLen;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   102
		for (int i = 0; i < strLen; i++)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   103
			stringChars[i] = (char) bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   104
		moveToFourByteBoundry();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   105
		return new String(stringChars);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   106
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   107
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   108
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   109
	 * @return a char array with the types of the arguments
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   110
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   111
	private char[] readTypes() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   112
		// the next byte should be a ","
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   113
		if (bytes[streamPosition] != 0x2C)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   114
			return null;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   115
		streamPosition++;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   116
		// find out how long the list of types is
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   117
		int typesLen = lengthOfCurrentString();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   118
		if (0 == typesLen) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   119
			return null;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   120
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   121
		// read in the types
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   122
		char[] typesChars = new char[typesLen];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   123
		for (int i = 0; i < typesLen; i++) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   124
			typesChars[i] = (char) bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   125
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   126
		return typesChars;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   127
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   128
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   129
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   130
	 * @param c type of argument
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   131
	 * @return a Java representation of the argument
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   132
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   133
	private Object readArgument(char c) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   134
		switch (c) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   135
			case 'i' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   136
				return readInteger();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   137
			case 'h' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   138
				return readBigInteger();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   139
			case 'f' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   140
				return readFloat();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   141
			case 'd' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   142
				return readDouble();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   143
			case 's' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   144
				return readString();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   145
			case 'c' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   146
				return readChar();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   147
			case 'T' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   148
				return Boolean.TRUE;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   149
			case 'F' :
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   150
				return Boolean.FALSE;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   151
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   152
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   153
		return null;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   154
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   155
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   156
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   157
	 * @return a Character
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   158
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   159
	private Object readChar() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   160
		return new Character((char) bytes[streamPosition++]);
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
	 * @return a Double
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   165
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   166
	private Object readDouble() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   167
		return readFloat();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   168
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   169
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   170
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   171
	 * @return a Float
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   172
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   173
	private Object readFloat() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   174
		//byte[] floatBytes = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   175
		floatBytes[0] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   176
		floatBytes[1] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   177
		floatBytes[2] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   178
		floatBytes[3] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   179
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   180
		int floatBits = 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   181
			((floatBytes[3] & 0xFF) ) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   182
			((floatBytes[2] & 0xFF) << 8) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   183
			((floatBytes[1] & 0xFF) << 16) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   184
			((floatBytes[0] & 0xFF) << 24);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   185
		
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   186
		return new Float(Float.intBitsToFloat(floatBits));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   187
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   188
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   189
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   190
	 * @return a BigInteger
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   191
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   192
	private Object readBigInteger() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   193
		//byte[] intBytes = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   194
		intBytes[0] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   195
		intBytes[1] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   196
		intBytes[2] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   197
		intBytes[3] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   198
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   199
		int intBits = 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   200
			((intBytes[3] & 0xFF) ) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   201
			((intBytes[2] & 0xFF) << 8) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   202
			((intBytes[1] & 0xFF) << 16) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   203
			((intBytes[0] & 0xFF) << 24);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   204
		
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   205
		return new Integer(intBits);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   206
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   207
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   208
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   209
	 * @return an Integer
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   210
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   211
	private Object readInteger() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   212
		//byte[] intBytes = new byte[4];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   213
		intBytes[0] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   214
		intBytes[1] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   215
		intBytes[2] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   216
		intBytes[3] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   217
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   218
		int intBits = 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   219
			((intBytes[3] & 0xFF) ) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   220
			((intBytes[2] & 0xFF) << 8) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   221
			((intBytes[1] & 0xFF) << 16) +
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   222
			((intBytes[0] & 0xFF) << 24);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   223
		
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   224
		return new Integer(intBits);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   225
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   226
	
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   227
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   228
	 * @return a Date
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   229
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   230
	private Date readTimeTag() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   231
		//byte[] secondBytes = new byte[8];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   232
		//byte[] picosecBytes = new byte[8];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   233
		/*for (int i = 4; i < 8; i++)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   234
			secondBytes[i] = bytes[streamPosition++];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   235
		for (int i = 4; i < 8; i++)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   236
			picosecBytes[i] = bytes[streamPosition++];*/
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   237
		System.arraycopy(bytes,streamPosition,secondBytes,4,4);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   238
		streamPosition+=4;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   239
		System.arraycopy(bytes,streamPosition,picosecBytes,4,4);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   240
		streamPosition+=4;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   241
		
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   242
		BigInteger secsSince1900 = new BigInteger(secondBytes);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   243
		long secsSince1970 =  secsSince1900.longValue() - OSCBundle.SECONDS_FROM_1900_to_1970.longValue();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   244
		if (secsSince1970 < 0) secsSince1970 = 0; // no point maintaining times in the distant past
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   245
		BigInteger picosecs = new BigInteger(picosecBytes);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   246
		long millisecs = (secsSince1970 * 1000) + (picosecs.longValue() / 1000);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   247
		return new Date(millisecs);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   248
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   249
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   250
	/**
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   251
	 * @param types
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   252
	 * @param i
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   253
	 * @return an Array
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   254
	 */
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   255
	private Object[] readArray(char[] types, int i) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   256
		int arrayLen = 0;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   257
		while (types[i + arrayLen] != ']')
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   258
			arrayLen++;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   259
		Object[] array = new Object[arrayLen];
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   260
		for (int j = 0; i < arrayLen; j++) {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   261
			array[j] = readArgument(types[i + j]);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   262
		}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   263
		return array;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   264
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   265
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   266
	private int lengthOfCurrentString() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   267
		int i = 0;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   268
		while (bytes[streamPosition + i] != 0)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   269
			i++;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   270
		return i;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   271
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   272
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   273
	private void moveToFourByteBoundry() {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   274
		// If i'm already at a 4 byte boundry, I need to move to the next one
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   275
		int mod = streamPosition % 4;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   276
		streamPosition += (4 - mod);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   277
	}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   278
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   279
}
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   280