/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.cldchi.tools.memoryprofiler.jdwp; /** * This class encapsulates JDWP command. Its superclass * is <code>Packet</code> so it's based on <code>ByteBuffer</code>. * The class allows to set and get JDWP command number and automatically * assign command ID. The typical use of <code>Command</code> class is * as follows: * <ul> * <li> Create a new command object with specified command number * <li> Fill command's data using standard <code>ByteBuffer</code> * and <code>Packet</code> methods (for example, <code>addInt()</code> or * <code>addReferenceTypeID()</code>) * <li> Execute command using <code>BackEndTest.checkReplyF()</code>, * <code>BackEndTest.sendCommand()</code> or * <code>BackEndTest.checkReply()</code> * <li> Work with received <code>Reply</code> object if needed * </ul> * * @see jdwp.Packet * @see jdwp.ByteBuffer * @see jdwp.BackEndTest#checkReplyF(jdwp.Command) * @see jdwp.BackEndTest#sendCommand(jdwp.Command) * @see jdwp.BackEndTest#checkReply(jdwp.Command) * @see jdwp.Reply * */ class Command extends Packet { /** * ID of next command. Each JDWP command must have * unique ID. The simplest way (that is used here) for generating * these IDs is a incremental counter. So this variable is incremented * after creating of each command and contains ID of next command. */ private static int nextID = 1; /** * Creates a new <code>Command</code> object, assign an unique ID, * the specified command number and sets flags to <code>flNoFlags</code>. * Command number is two-byte integer where hi-order byte specifies the * JDWP command set and low-order byte specifies the command number in the * command set. For example, ArrayReference/GetValues JDWP command has a * number <code>0x0D02</code> where <code>0x0D = 14</code> is a number * of ArrayReference command set and <code>0x02</code> is a number of * GetValues command in this command set. For information about numbers * of specific commands and command sets see JDWP specification. * * @param command a command number for this command */ public Command(int command) { super(); setID(nextID++); setFlags(flNoFlags); setCommand(command); } /** * Gets number of the command assigned for this object. For information * about command numbers see description of the constructor. * * I suspect this method is not used currently by KJDB * * @return a command number */ public int getCommand() { int id = 0; try { id = (int) getID(CommandOffset, 2); } catch (BoundException e) {}; return id; } /** * Assign a command number to the object. For information * about command numbers see description of the constructor. * This method is used internally by constructor. * * @param command a command number to be assigned */ public void setCommand(int command) { try { putID(CommandOffset, command, 2); } catch (BoundException e) {}; } /** * Returns string representation of the object. This method is invoked * when reply packet of the command is not received (usually it's a * fatal error). It's useful for locating the problem. * * @return a string representation of the object */ public String toString() { int l = 0; try { l = getInt(LengthOffset); } catch (BoundException e) {}; return "length " + Tools.Hex(l, 8) + "\n" + "id " + Tools.Hex(getID(), 8) + "\n" + "flags " + Tools.Hex(getFlags(), 2) + "\n" + "command " + Tools.Hex(getCommand(), 4) + "\n" + super.toString(PacketHeaderSize); } /** * Returns the ID of the command last created. I think that * this method is not used currently by KJDB. * * @return ID of last command */ public static int getLastID() { return (nextID - 1); } }