1 /*
   2  * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package org.openjdk.buildtools.jdwpgen;
  27 
  28 import java.util.*;
  29 import java.io.*;
  30 
  31 class OutNode extends AbstractTypeListNode {
  32 
  33     String cmdName;
  34 
  35     void set(String kind, List<Node> components, int lineno) {
  36         super.set(kind, components, lineno);
  37         components.add(0, new NameNode("Out"));
  38     }
  39 
  40     void constrain(Context ctx) {
  41         super.constrain(ctx.commandWritingSubcontext());
  42         CommandNode cmd = (CommandNode)parent;
  43         cmdName = cmd.name;
  44     }
  45 
  46     void genProcessMethod(PrintWriter writer, int depth) {
  47         writer.println();
  48         indent(writer, depth);
  49         writer.print(
  50             "static " + cmdName + " process(VirtualMachineImpl vm");
  51         for (Node node : components) {
  52             TypeNode tn = (TypeNode)node;
  53             writer.println(", ");
  54             indent(writer, depth+5);
  55             writer.print(tn.javaParam());
  56         }
  57         writer.println(")");
  58         indent(writer, depth+6);
  59         writer.println("throws JDWPException {");
  60         indent(writer, depth+1);
  61         writer.print("PacketStream ps = enqueueCommand(vm");
  62         for (Node node : components) {
  63             TypeNode tn = (TypeNode)node;
  64             writer.print(", ");
  65             writer.print(tn.name());
  66         }
  67         writer.println(");");
  68         indent(writer, depth+1);
  69         writer.println("return waitForReply(vm, ps);");
  70         indent(writer, depth);
  71         writer.println("}");
  72     }
  73 
  74     void genEnqueueMethod(PrintWriter writer, int depth) {
  75         writer.println();
  76         indent(writer, depth);
  77         writer.print(
  78             "static PacketStream enqueueCommand(VirtualMachineImpl vm");
  79         for (Node node : components) {
  80             TypeNode tn = (TypeNode)node;
  81             writer.println(", ");
  82             indent(writer, depth+5);
  83             writer.print(tn.javaParam());
  84         }
  85         writer.println(") {");
  86         indent(writer, depth+1);
  87         writer.println(
  88             "PacketStream ps = new PacketStream(vm, COMMAND_SET, COMMAND);");
  89         if (Main.genDebug) {
  90             indent(writer, depth+1);
  91             writer.println(
  92                 "if ((vm.traceFlags & VirtualMachineImpl.TRACE_SENDS) != 0) {");
  93             indent(writer, depth+2);
  94             writer.print(
  95                 "vm.printTrace(\"Sending Command(id=\" + ps.pkt.id + \") ");
  96             writer.print(parent.context.whereJava);
  97             writer.println(
  98                 "\"+(ps.pkt.flags!=0?\", FLAGS=\" + ps.pkt.flags:\"\"));");
  99             indent(writer, depth+1);
 100             writer.println("}");
 101         }
 102         genJavaWrites(writer, depth+1);
 103         indent(writer, depth+1);
 104         writer.println("ps.send();");
 105         indent(writer, depth+1);
 106         writer.println("return ps;");
 107         indent(writer, depth);
 108         writer.println("}");
 109     }
 110 
 111     void genWaitMethod(PrintWriter writer, int depth) {
 112         writer.println();
 113         indent(writer, depth);
 114         writer.println(
 115             "static " + cmdName + " waitForReply(VirtualMachineImpl vm, " +
 116                                   "PacketStream ps)");
 117         indent(writer, depth+6);
 118         writer.println("throws JDWPException {");
 119         indent(writer, depth+1);
 120         writer.println("ps.waitForReply();");
 121         indent(writer, depth+1);
 122         writer.println("return new " + cmdName + "(vm, ps);");
 123         indent(writer, depth);
 124         writer.println("}");
 125     }
 126 
 127     void genJava(PrintWriter writer, int depth) {
 128         genJavaPreDef(writer, depth);
 129         super.genJava(writer, depth);
 130         genProcessMethod(writer, depth);
 131         genEnqueueMethod(writer, depth);
 132         genWaitMethod(writer, depth);
 133     }
 134 }