/*******************************************************************************
 * Copyright (c) 2007 compeople AG 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
 *
 * Contributors:
 * 	compeople AG (Stefan Liebig) - initial API and implementation
 *  IBM Corporation - bug fixes and enhancements
 *******************************************************************************/
package org.eclipse.equinox.internal.p2.sar;

import java.io.IOException;
import java.util.Date;
import java.util.zip.ZipEntry;

/**
 * A SarEntry is the header information for an entry within a
 * org.eclipse.equinox.p2.sar stream.<br>
 * <b>Note: </b>The setTime() and getTime() methods of ZipEntry (our super
 * class) perform time zone dependent (!) conversions. For our serialization and
 * deserialization the stored time has to be time zone neutral. Therefore it is
 * necessary to invert those calculations. This is also the reason for
 * duplicating the javaToDosTime() and dosToJavaTime() methods.
 */
public class SarEntry extends ZipEntry {

	private boolean isEof;
	private boolean isZip;

	/**
	 * The name of the eof org.eclipse.equinox.p2.sar entry.
	 */
	private static final String EOF_ENTRY_NAME = "<eof-org.eclipse.equinox.p2.sar>"; //$NON-NLS-1$

	private static final boolean DEBUG = SarConstants.DEBUG;

	/**
	 * Creates an eof org.eclipse.equinox.p2.sar entry
	 */
	public SarEntry() {
		super(EOF_ENTRY_NAME);
		setMethod(ZipEntry.DEFLATED);
		this.isEof = true;
		this.isZip = false;
	}

	/**
	 * @param zipEntry
	 */
	public SarEntry(ZipEntry zipEntry) {
		super(zipEntry);
		this.isZip = false;
		this.isEof = false;
	}

	/**
	 * @param zipEntry
	 * @param isZip
	 */
	public SarEntry(ZipEntry zipEntry, boolean isZip) {
		super(zipEntry);
		this.isZip = isZip;
		this.isEof = false;
	}

	/**
	 * @param sarInputStream
	 * @throws IOException
	 */
	public SarEntry(SarInputStream sarInputStream) throws IOException {
		// read name!
		super(sarInputStream.readString());

		String comment = sarInputStream.readString();
		long compressedSize = sarInputStream.readLong();
		long crc = sarInputStream.readLong();
		byte[] extra = sarInputStream.readBytes();
		int method = sarInputStream.readInt();
		long size = sarInputStream.readLong();
		long dosTime = sarInputStream.readLong();
		boolean isEof = sarInputStream.readBoolean();
		boolean isZip = sarInputStream.readBoolean();

		if (DEBUG) {
			System.out.println(getName() + "," + comment + "," + compressedSize + "," + crc + "," + extra + "," + method + "," + size + "," + dosTime + "," + isEof + "," + isZip);
		}

		if (method == ZipEntry.STORED) {
			setCompressedSize(compressedSize);
			setCrc(crc);
			setSize(size);
		}

		setComment(comment);
		setExtra(extra);
		setMethod(method);
		setTime(dosToJavaTime(dosTime));
		setEof(isEof);
		setZip(isZip);
	}

	/**
	 * @param sarOutputStream
	 * @throws IOException
	 */
	public void writeTo(SarOutputStream sarOutputStream) throws IOException {
		String comment = this.getComment();
		long compressedSize = this.getCompressedSize();
		long crc = this.getCrc();
		byte[] extra = this.getExtra();
		int method = this.getMethod();
		String name = this.getName();
		long size = this.getSize();
		long dosTime = javaToDosTime(this.getTime());
		boolean isZip = this.isZip();
		boolean isEof = this.isEof();

		if (DEBUG) {
			System.out.println(name + "," + comment + "," + compressedSize + "," + crc + "," + extra + "," + method + "," + size + "," + dosTime + "," + isEof + "," + isZip);
		}

		sarOutputStream.writeString(name);
		sarOutputStream.writeString(comment);
		sarOutputStream.writeLong(compressedSize);
		sarOutputStream.writeLong(crc);
		sarOutputStream.writeBytes(extra);
		sarOutputStream.writeInt(method);
		sarOutputStream.writeLong(size);
		sarOutputStream.writeLong(dosTime);
		sarOutputStream.writeBool(isEof);
		sarOutputStream.writeBool(isZip);
	}

	/**
	 * Is this the eof org.eclipse.equinox.p2.sar entry?
	 * 
	 * @return the answer
	 */
	public boolean isEof() {
		return isEof;
	}

	private void setEof(boolean isEof) {
		this.isEof = isEof;
	}

	/**
	 * @return boolean
	 */
	public boolean isZip() {
		return isZip;
	}

	/**
	 * @param isZip
	 */
	private void setZip(boolean isZip) {
		this.isZip = isZip;
	}

	/*
	 * Converts DOS time to Java time (number of milliseconds since epoch).
	 */
	public final static long dosToJavaTime(long dtime) {
		Date d = new Date((int) (((dtime >> 25) & 0x7f) + 80), (int) (((dtime >> 21) & 0x0f) - 1), (int) ((dtime >> 16) & 0x1f), (int) ((dtime >> 11) & 0x1f), (int) ((dtime >> 5) & 0x3f), (int) ((dtime << 1) & 0x3e));
		return d.getTime();
	}

	/*
	 * Converts Java time to DOS time.
	 */
	public final static long javaToDosTime(long time) {
		Date d = new Date(time);
		int year = d.getYear() + 1900;
		if (year < 1980) {
			return (1 << 21) | (1 << 16);
		}
		return (year - 1980) << 25 | (d.getMonth() + 1) << 21 | d.getDate() << 16 | d.getHours() << 11 | d.getMinutes() << 5 | d.getSeconds() >> 1;
	}

}
