/* *******************************************
* Copyright (c) 2011
* HT srl, All rights reserved.
* Project : RCS, AndroidService
* File : WChar.java
* Created : Apr 9, 2011
* Author : zeno
* *******************************************/
package com.android.dvci.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import com.android.dvci.auto.Cfg;
import com.android.mm.M;
// TODO: Auto-generated Javadoc
/**
* The Class WChar.
*/
public final class WChar {
/** The debug. */
private static final String TAG = "WChar"; //$NON-NLS-1$
/**
* Gets the bytes, non zero terminated
*
* @param string
* the string
* @return the bytes
*/
public static byte[] getBytes(final String string) {
return getBytes(string, false);
}
/**
* Gets the bytes.
*
* @param string
* the string
* @param endzero
* the endzero
* @return the bytes
*/
public static byte[] getBytes( String string, final boolean endzero) {
byte[] encoded = null;
if(string==null){
string="";
}
try {
//
encoded = string.getBytes("UTF-16LE"); // UTF-16LE //$NON-NLS-1$
} catch (final UnsupportedEncodingException e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
if (Cfg.DEBUG) {
Check.log(TAG + " Error: UnsupportedEncodingException");//$NON-NLS-1$
}
try {
// 34.0=UnicodeLittleUnmarked
String encoding = M.e("UnicodeLittleUnmarked");
encoded = string.getBytes(encoding);
} catch (UnsupportedEncodingException e1) {
if (Cfg.EXCEPTION) {
Check.log(e1);
}
if (Cfg.DEBUG) {
Check.log(TAG + " Error: UnsupportedEncodingException");//$NON-NLS-1$
}
return null;
}
}
if (endzero) {
final byte[] zeroencoded = new byte[encoded.length + 2];
System.arraycopy(encoded, 0, zeroencoded, 0, encoded.length);
encoded = zeroencoded;
}
return encoded;
}
/**
* Pascalize.
*
* @param message
* the message
* @return the byte[]
*/
public static byte[] pascalize(final byte[] message) {
int len = message.length;
if (len < 2 || message[message.length - 2] != 0 || message[message.length - 1] != 0) {
len += 2; // aggiunge lo spazio per lo zero
}
final byte[] pascalzeroencoded = new byte[len + 4];
System.arraycopy(ByteArray.intToByteArray(len), 0, pascalzeroencoded, 0, 4);
System.arraycopy(message, 0, pascalzeroencoded, 4, message.length);
if (Cfg.DEBUG) {
Check.ensures(pascalzeroencoded[len - 1] == 0, "pascalize not null"); //$NON-NLS-1$
}
return pascalzeroencoded;
}
/**
* Gets the string.
*
* @param message
* the message
* @param endzero
* the endzero
* @return the string
*/
public static String getString(final byte[] message, final boolean endzero) {
return getString(message, 0, message.length, endzero);
}
/**
* Gets the string.
*
* @param message
* the message
* @param offset
* the offset
* @param length
* the length
* @param endzero
* the endzero
* @return the string
*/
public static String getString(final byte[] message, final int offset, final int length, final boolean endzero) {
String decoded = ""; //$NON-NLS-1$
try {
//
decoded = new String(message, offset, length, "UTF-16LE"); // UTF-16LE //$NON-NLS-1$
} catch (final UnsupportedEncodingException ex) {
try {
// 34.0=UnicodeLittleUnmarked
decoded = new String(message, offset, length, M.e("UnicodeLittleUnmarked")); //$NON-NLS-1$
} catch (final UnsupportedEncodingException e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
if (Cfg.DEBUG) {
Check.log(TAG + " Error: UnsupportedEncodingException");//$NON-NLS-1$
}
}
}
if (endzero) {
final int lastPos = decoded.indexOf('\0');
if (lastPos > -1) {
decoded = decoded.substring(0, lastPos);
}
}
return decoded;
}
/**
* Instantiates a new w char.
*/
private WChar() {
}
/**
* Read pascal.
*
* @param dataBuffer
* the data buffer
* @return the string
* @throws IOException
* Signals that an I/O exception has occurred.
*/
public static String readPascal(final DataBuffer dataBuffer) throws IOException {
final int len = dataBuffer.readInt();
if (len < 0 || len > 65536) {
return null;
}
final byte[] payload = new byte[len];
dataBuffer.read(payload);
return WChar.getString(payload, true);
}
/**
* Pascalize.
*
* @param string
* the string
* @return the byte[]
*/
public static byte[] pascalize(final String string) {
return pascalize(WChar.getBytes(string));
}
}