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