/******************************************************************************* * Copyright (C) 2013 JMaNGOS <http://jmangos.org/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package org.jmangos.tools.dbc.dataholder; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import javolution.io.Struct; public class DBCBaseStruct extends Struct { public final static int HEADER_SIZE = 20; protected int stringBufPos; private int lang = -1; protected static final Class<?> INTERNALSTRING = new InternalString[0].getClass(); public class InternalString extends Member { private final byte[] string = new byte[2024]; private final CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); public InternalString() { super(32, 4); } public String get() { int i = 0; final int index = getByteBufferPosition() + offset(); for (; (this.string[i] = getByteBuffer().get( i + DBCBaseStruct.this.stringBufPos + getByteBuffer().getInt(index))) != 0; i++) {} try { return this.decoder.decode(ByteBuffer.wrap(this.string, 0, i)).toString(); } catch (final CharacterCodingException e) { e.printStackTrace(); } return ""; } @Override public String toString() { return get(); } } @Override public ByteOrder byteOrder() { return ByteOrder.LITTLE_ENDIAN; } public class MultiInternalString extends Member { private final byte[] string = new byte[2024]; private final CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); public MultiInternalString() { super(32 * 17, 4); } public String get() { int i = 0; if (DBCBaseStruct.this.lang < 0) { for (int j = 0; j < 16; j++) { if (getByteBuffer().getInt(getByteBufferPosition() + offset() + (4 * j)) > 0) { DBCBaseStruct.this.lang = j; break; } } } if (DBCBaseStruct.this.lang < 0) { return ""; } for (; (this.string[i] = getByteBuffer().get( i + DBCBaseStruct.this.stringBufPos + getByteBuffer().getInt( getByteBufferPosition() + offset() + (4 * DBCBaseStruct.this.lang)))) != 0; i++) {} try { return this.decoder.decode(ByteBuffer.wrap(this.string, 0, i)).toString(); } catch (final CharacterCodingException e) { e.printStackTrace(); } return ""; } @Override public String toString() { return get(); } } public DBCBaseStruct() { super(); } }