/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package java.io;

import com.google.gwt.corp.compatibility.Numbers;

public class DataOutputStream extends OutputStream implements DataOutput {

	OutputStream os;

	public DataOutputStream (OutputStream os) {
		this.os = os;
	}

	@Override
	public void write (int b) throws IOException {
		os.write(b);
	}

	public void writeBoolean (boolean v) throws IOException {
		os.write(v ? 1 : 0);
	}

	public void writeByte (int v) throws IOException {
		os.write(v);
	}

	public void writeBytes (String s) throws IOException {
		int len = s.length();
		for (int i = 0; i < len; i++) {
			os.write(s.charAt(i) & 0xff);
		}
	}

	public void writeChar (int v) throws IOException {
		os.write(v >> 8);
		os.write(v);
	}

	public void writeChars (String s) throws IOException {
		throw new RuntimeException("writeChars NYI");
	}

	public void writeDouble (double v) throws IOException {
		writeLong(Double.doubleToLongBits(v));
	}

	public void writeFloat (float v) throws IOException {
		writeInt(Numbers.floatToIntBits(v));
	}

	public void writeInt (int v) throws IOException {
		os.write(v >> 24);
		os.write(v >> 16);
		os.write(v >> 8);
		os.write(v);
	}

	public void writeLong (long v) throws IOException {
		writeInt((int)(v >> 32L));
		writeInt((int)v);
	}

	public void writeShort (int v) throws IOException {
		os.write(v >> 8);
		os.write(v);
	}

	public void writeUTF (String s) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (c > 0 && c < 80) {
				baos.write(c);
			} else if (c < '\u0800') {
				baos.write(0xc0 | (0x1f & (c >> 6)));
				baos.write(0x80 | (0x3f & c));
			} else {
				baos.write(0xe0 | (0x0f & (c >> 12)));
				baos.write(0x80 | (0x3f & (c >> 6)));
				baos.write(0x80 | (0x3f & c));
			}
		}
		writeShort(baos.count);
		os.write(baos.buf, 0, baos.count);
	}
}
