/*******************************************************************************
 * Copyright (c) 2000, 2015 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
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdi.internal.event;

import java.io.IOException;

import org.eclipse.jdi.TimeoutException;
import org.eclipse.jdi.internal.MirrorImpl;
import org.eclipse.jdi.internal.VirtualMachineImpl;
import org.eclipse.jdi.internal.connect.PacketReceiveManager;
import org.eclipse.jdi.internal.jdwp.JdwpCommandPacket;
import org.eclipse.jdi.internal.request.RequestID;

import com.sun.jdi.VMDisconnectedException;
import com.sun.jdi.event.EventQueue;
import com.sun.jdi.event.EventSet;

/**
 * this class implements the corresponding interfaces declared by the JDI
 * specification. See the com.sun.jdi package for more information.
 * 
 */
public class EventQueueImpl extends MirrorImpl implements EventQueue {
	/** Flag used to see if a VMDisconnectEvent has already been generated. */
	private boolean genereatedVMDisconnectEvent = false;

	/**
	 * Creates new EventQueueImpl.
	 */
	public EventQueueImpl(VirtualMachineImpl vmImpl) {
		super("EventQueue", vmImpl); //$NON-NLS-1$
	}

	/*
	 * @return Returns next EventSet from Virtual Machine.
	 */
	@Override
	public EventSet remove() throws InterruptedException {
		return remove(PacketReceiveManager.TIMEOUT_INFINITE);
	}

	/*
	 * @return Returns next EventSet from Virtual Machine, returns null if times
	 * out.
	 */
	@Override
	public EventSet remove(long timeout) throws InterruptedException {
		// Return a received EventSet or null if no EventSet is received in
		// time.
		// Note that handledJdwpEventSet() is not don in a 'finally' clause
		// because
		// it must also be done when an 'empty' set is read (i.e. a set composed
		// of internal
		// events only).
		try {
			// We remove elements from event sets that are generated from
			// inside, therefore the set may become empty.
			EventSetImpl set;
			do {
				JdwpCommandPacket packet = getCommandVM(
						JdwpCommandPacket.E_COMPOSITE, timeout);
				initJdwpEventSet(packet);
				set = EventSetImpl.read(this, packet.dataInStream());
				handledJdwpEventSet();
			} while (set.isEmpty());
			return set;
		} catch (TimeoutException e) {
			// Timeout in getCommand, JDI spec says return null.
			handledJdwpEventSet();
			return null;
		} catch (IOException e) {
			// This means the already received data is invalid.
			handledJdwpEventSet();
			defaultIOExceptionHandler(e);
			return null;
		} catch (VMDisconnectedException e) {
			// JDI spec says that a VMDisconnectedException must always be
			// preceeded by a VMDisconnectEvent.
			handledJdwpEventSet();
			if (!genereatedVMDisconnectEvent) {
				genereatedVMDisconnectEvent = true;
				return new EventSetImpl(virtualMachineImpl(),
						new VMDisconnectEventImpl(virtualMachineImpl(),
								RequestID.nullID));
			}
			throw e;
		}
	}
}
