/*******************************************************************************
 * Copyright (c) 2005, 2017 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 *******************************************************************************/
package org.eclipse.dltk.dbgp.internal;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

import org.eclipse.dltk.dbgp.IDbgpRawPacket;
import org.eclipse.dltk.dbgp.exceptions.DbgpException;
import org.eclipse.dltk.dbgp.internal.utils.DbgpXmlParser;
import org.eclipse.dltk.debug.core.DLTKDebugPlugin;
import org.eclipse.osgi.util.NLS;
import org.w3c.dom.Document;

public class DbgpRawPacket implements IDbgpRawPacket {

	protected static int readPacketSize(InputStream input) throws IOException {
		int size = 0;
		for (;;) {
			int b = input.read();
			if (b == -1) {
				throw new IOException();
			}
			if (b == 0) {
				break;
			}
			if (b >= '0' && b <= '9') {
				size = size * 10 + (b - '0');
			} else {
				final String msg = NLS.bind(
						Messages.DbgpRawPacket_invalidCharInPacketSize,
						Integer.toString(b));
				DLTKDebugPlugin.logWarning(msg);
				throw new IOException(msg);
			}
		}
		if (size == 0) {
			throw new IOException(Messages.DbgpRawPacket_zeroPacketSize);
		}
		return size;
	}

	protected static byte[] readPacketXml(InputStream input, int size)
			throws IOException {
		byte[] bytes = new byte[size];

		int offset = 0;
		int n;
		while ((offset < size)
				&& (n = input.read(bytes, offset, size - offset)) != -1) {
			offset += n;
		}

		if (offset != size) {
			throw new IOException(Messages.DbgpRawPacket_cantReadPacketBody);
		}

		if (input.read() != 0) {
			throw new IOException(Messages.DbgpRawPacket_noTerminationByte);
		}

		return bytes;
	}

	public static DbgpRawPacket readPacket(InputStream input)
			throws IOException {
		int size = readPacketSize(input);
		byte[] xml = readPacketXml(input, size);
		return new DbgpRawPacket(size, xml);
	}

	private final int size;

	private final byte[] xml;

	public DbgpRawPacket(int size, byte[] xml) {
		this.size = size;
		this.xml = xml;
	}

	public int getSize() {
		return size;
	}

	public byte[] getXml() {
		return xml;
	}

	public Document getParsedXml() throws DbgpException {
		return DbgpXmlParser.parseXml(xml);
	}

	@Override
	public String toString() {
		return "DbgpPacket (" + size + " bytes) " + xml; //$NON-NLS-1$ //$NON-NLS-2$
	}

	@Override
	public String getPacketAsString() {
		return new String(xml, StandardCharsets.US_ASCII);
	}
}
