/*******************************************************************************
 * Copyright (c) 2000, 2011 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.request;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import org.eclipse.jdi.internal.VirtualMachineImpl;
import org.eclipse.jdi.internal.event.EventImpl;
import org.eclipse.jdi.internal.jdwp.JdwpCommandPacket;
import org.eclipse.jdi.internal.jdwp.JdwpReplyPacket;

/**
 * this class implements the corresponding interfaces declared by the OTI Hot
 * Code Replacement extentions of the JDI specification.
 */

public class ReenterStepRequestImpl extends StepRequestImpl implements
		org.eclipse.jdi.hcr.ReenterStepRequest {
	/**
	 * Creates new ReenterStepRequestImpl.
	 */
	public ReenterStepRequestImpl(VirtualMachineImpl vmImpl) {
		super("ReenterStepRequest", vmImpl); //$NON-NLS-1$
	}

	/**
	 * @return Returns JDWP constant for step depth.
	 */
	@Override
	public int threadStepDepthJDWP(int threadStepDepth) {
		return STEP_DEPTH_REENTER_JDWP_HCR;
	}

	/**
	 * Enables event request.
	 */
	@Override
	public void enable() {
		if (isEnabled())
			return;

		initJdwpRequest();
		try {
			ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
			DataOutputStream outData = new DataOutputStream(outBytes);
			writeByte(eventKind(),
					"event kind", EventImpl.eventKindMap(), outData); // Always 01 for Step event. //$NON-NLS-1$
			writeByte(suspendPolicyJDWP(), "suspend policy", outData); //$NON-NLS-1$
			writeInt(modifierCount(), "modifiers", outData); //$NON-NLS-1$
			writeModifiers(outData);

			JdwpReplyPacket replyPacket = requestVM(
					JdwpCommandPacket.HCR_REENTER_ON_EXIT, outBytes);
			defaultReplyErrorHandler(replyPacket.errorCode());
			DataInputStream replyData = replyPacket.dataInStream();
			fRequestID = RequestID.read(this, replyData);
			virtualMachineImpl().eventRequestManagerImpl().addRequestIDMapping(
					this);
		} catch (IOException e) {
			defaultIOExceptionHandler(e);
		} finally {
			handledJdwpRequest();
		}
	}
}
