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