CharToByteUnicode.java revision 2116
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee/*
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * Copyright 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee *
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * This code is free software; you can redistribute it and/or modify it
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * under the terms of the GNU General Public License version 2 only, as
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * published by the Free Software Foundation. Sun designates this
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * particular file as subject to the "Classpath" exception as provided
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * by Sun in the LICENSE file that accompanied this code.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee *
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * This code is distributed in the hope that it will be useful, but WITHOUT
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * version 2 for more details (a copy is included in the LICENSE file that
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * accompanied this code).
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee *
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * You should have received a copy of the GNU General Public License version
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * 2 along with this work; if not, write to the Free Software Foundation,
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee *
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * CA 95054 USA or visit www.sun.com if you need additional information or
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * have any questions.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee */
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeepackage sun.io;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeeimport java.io.*;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee/**
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * Convert arrays containing Unicode characters into arrays of bytes, using the
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * platform-default byte order.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee *
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee * @author Mark Reinhold
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee */
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeepublic class CharToByteUnicode extends CharToByteConverter {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee static final char BYTE_ORDER_MARK = (char) 0xfeff;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee protected boolean usesMark = true; /* A mark should be written */
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee private boolean markWritten = false; /* A mark has been written */
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee static final int UNKNOWN = 0;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee static final int BIG = 1;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee static final int LITTLE = 2;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee protected int byteOrder = UNKNOWN;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee public CharToByteUnicode() {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee String enc = java.security.AccessController.doPrivileged(
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee new sun.security.action.GetPropertyAction("sun.io.unicode.encoding",
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee "UnicodeBig"));
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee if (enc.equals("UnicodeBig"))
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee byteOrder = BIG;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee else if (enc.equals("UnicodeLittle"))
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee byteOrder = LITTLE;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee else
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee byteOrder = BIG;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee public CharToByteUnicode(int byteOrder, boolean usesMark) {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee this.byteOrder = byteOrder;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee this.usesMark = usesMark;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee public CharToByteUnicode(boolean usesMark) {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee this();
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee this.usesMark = usesMark;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee public String getCharacterEncoding() {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee switch (byteOrder) {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee case BIG:
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return usesMark ? "UnicodeBig" : "UnicodeBigUnmarked";
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee case LITTLE:
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return usesMark ? "UnicodeLittle" : "UnicodeLittleUnmarked";
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee default:
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return "UnicodeUnknown";
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee public int convert(char in[], int inOff, int inEnd,
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee byte out[], int outOff, int outEnd)
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee throws ConversionBufferFullException, MalformedInputException
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee charOff = inOff;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee byteOff = outOff;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee if (inOff >= inEnd)
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return 0;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee int inI = inOff,
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee outI = outOff,
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee outTop = outEnd - 2;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee if (usesMark && !markWritten) {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee if (outI > outTop)
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee throw new ConversionBufferFullException();
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee if (byteOrder == BIG) {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee out[outI++] = (byte) (BYTE_ORDER_MARK >> 8);
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee out[outI++] = (byte) (BYTE_ORDER_MARK & 0xff);
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee else {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee out[outI++] = (byte) (BYTE_ORDER_MARK & 0xff);
out[outI++] = (byte) (BYTE_ORDER_MARK >> 8);
}
markWritten = true;
}
if (byteOrder == BIG) {
while (inI < inEnd) {
if (outI > outTop) {
charOff = inI;
byteOff = outI;
throw new ConversionBufferFullException();
}
char c = in[inI++];
out[outI++] = (byte) (c >> 8);
out[outI++] = (byte) (c & 0xff);
}
}
else {
while (inI < inEnd) {
if (outI > outTop) {
charOff = inI;
byteOff = outI;
throw new ConversionBufferFullException();
}
char c = in[inI++];
out[outI++] = (byte) (c & 0xff);
out[outI++] = (byte) (c >> 8);
}
}
charOff = inI;
byteOff = outI;
return outI - outOff;
}
public int flush(byte in[], int inOff, int inEnd) {
byteOff = charOff = 0;
return 0;
}
public void reset () {
byteOff = charOff = 0;
markWritten = false;
}
public int getMaxBytesPerChar() {
return 4; /* To allow for writing the byte-order mark */
}
}