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