1/*
2 * Copyright (c) 2009-2010 jMonkeyEngine
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 *   notice, this list of conditions and the following disclaimer.
11 *
12 * * Redistributions in binary form must reproduce the above copyright
13 *   notice, this list of conditions and the following disclaimer in the
14 *   documentation and/or other materials provided with the distribution.
15 *
16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17 *   may be used to endorse or promote products derived from this software
18 *   without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33package com.jme3.network.serializing.serializers;
34
35import com.jme3.network.serializing.Serializer;
36import java.io.IOException;
37import java.nio.BufferOverflowException;
38import java.nio.ByteBuffer;
39
40/**
41 * String serializer.
42 *
43 * @author Lars Wesselius
44 */
45@SuppressWarnings("unchecked")
46public class StringSerializer extends Serializer {
47
48    public String readObject(ByteBuffer data, Class c) throws IOException {
49
50        int length = -1;
51        byte type = data.get();
52        if (type == (byte)0) {
53            return null;
54        } else if (type == (byte)1) {
55            // Byte
56            length = data.get();
57        } else if (type == (byte)2) {
58            // Short
59            length = data.getShort();
60        } else if (type == (byte)3) {
61            // Int
62            length = data.getInt();
63        }
64        if (length == -1) throw new IOException("Could not read String: Invalid length identifier.");
65
66        byte[] buffer = new byte[length];
67        data.get(buffer);
68        return new String(buffer, "UTF-8");
69    }
70
71    public void writeObject(ByteBuffer buffer, Object object) throws IOException {
72        String string = (String)object;
73
74        if (string == null) {
75            // Write that it's 0.
76            buffer.put((byte)0);
77            return;
78        }
79        byte[] stringBytes = string.getBytes("UTF-8");
80        int bufferLength = stringBytes.length;
81
82        try {
83            if (bufferLength <= Byte.MAX_VALUE) {
84                buffer.put((byte)1);
85                buffer.put((byte)bufferLength);
86            } else if (bufferLength <= Short.MAX_VALUE) {
87                buffer.put((byte)2);
88                buffer.putShort((short)bufferLength);
89            } else {
90                buffer.put((byte)3);
91                buffer.putInt(bufferLength);
92            }
93            buffer.put(stringBytes);
94        }
95        catch (BufferOverflowException e) {
96            e.printStackTrace();
97        }
98    }
99}
100