001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.activemq.openwire.tool;
018
019 import java.io.PrintWriter;
020 import java.util.Iterator;
021 import java.util.List;
022
023 import org.codehaus.jam.JClass;
024 import org.codehaus.jam.JProperty;
025
026 /**
027 * @version $Revision: 379734 $
028 */
029 public class CppHeadersGenerator extends CppClassesGenerator {
030
031 protected String getFilePostFix() {
032 return ".hpp";
033 }
034
035 protected void generateFile(PrintWriter out) {
036 generateLicence(out);
037
038 out.println("#ifndef ActiveMQ_" + className + "_hpp_");
039 out.println("#define ActiveMQ_" + className + "_hpp_");
040 out.println("");
041 out.println("// Turn off warning message for ignored exception specification");
042 out.println("#ifdef _MSC_VER");
043 out.println("#pragma warning( disable : 4290 )");
044 out.println("#endif");
045 out.println("");
046 out.println("#include <string>");
047 out.println("#include \"activemq/command/" + baseClass + ".hpp\"");
048
049 List properties = getProperties();
050 for (Iterator iter = properties.iterator(); iter.hasNext();) {
051 JProperty property = (JProperty)iter.next();
052 if (!property.getType().isPrimitiveType() && !property.getType().getSimpleName().equals("String") && !property.getType().getSimpleName().equals("ByteSequence")) {
053 String includeName = toCppType(property.getType());
054 if (property.getType().isArrayType()) {
055 JClass arrayType = property.getType().getArrayComponentType();
056 if (arrayType.isPrimitiveType()) {
057 continue;
058 }
059 }
060 if (includeName.startsWith("array<")) {
061 includeName = includeName.substring(6, includeName.length() - 1);
062 } else if (includeName.startsWith("p<")) {
063 includeName = includeName.substring(2, includeName.length() - 1);
064 }
065 if (includeName.equals("IDataStructure")) {
066 out.println("#include \"activemq/" + includeName + ".hpp\"");
067 } else {
068 out.println("#include \"activemq/command/" + includeName + ".hpp\"");
069 }
070 }
071 }
072 out.println("");
073 out.println("#include \"activemq/protocol/IMarshaller.hpp\"");
074 out.println("#include \"ppr/io/IOutputStream.hpp\"");
075 out.println("#include \"ppr/io/IInputStream.hpp\"");
076 out.println("#include \"ppr/io/IOException.hpp\"");
077 out.println("#include \"ppr/util/ifr/array\"");
078 out.println("#include \"ppr/util/ifr/p\"");
079 out.println("");
080 out.println("namespace apache");
081 out.println("{");
082 out.println(" namespace activemq");
083 out.println(" {");
084 out.println(" namespace command");
085 out.println(" {");
086 out.println(" using namespace ifr;");
087 out.println(" using namespace std;");
088 out.println(" using namespace apache::activemq;");
089 out.println(" using namespace apache::activemq::protocol;");
090 out.println(" using namespace apache::ppr::io;");
091 out.println("");
092 out.println("/*");
093 out.println(" *");
094 out.println(" * Command and marshalling code for OpenWire format for " + className + "");
095 out.println(" *");
096 out.println(" *");
097 out.println(" * NOTE!: This file is autogenerated - do not modify!");
098 out.println(" * if you need to make a change, please see the Groovy scripts in the");
099 out.println(" * activemq-core module");
100 out.println(" *");
101 out.println(" */");
102 out.println("class " + className + " : public " + baseClass + "");
103 out.println("{");
104 out.println("protected:");
105
106 for (Iterator iter = properties.iterator(); iter.hasNext();) {
107 JProperty property = (JProperty)iter.next();
108 String type = toCppType(property.getType());
109 String name = decapitalize(property.getSimpleName());
110 out.println(" " + type + " " + name + " ;");
111 }
112 out.println("");
113 out.println("public:");
114 out.println(" const static unsigned char TYPE = " + getOpenWireOpCode(jclass) + ";");
115 out.println("");
116 out.println("public:");
117 out.println(" " + className + "() ;");
118 out.println(" virtual ~" + className + "() ;");
119 out.println("");
120 out.println(" virtual unsigned char getDataStructureType() ;");
121
122 for (Iterator iter = properties.iterator(); iter.hasNext();) {
123 JProperty property = (JProperty)iter.next();
124 String type = toCppType(property.getType());
125 String propertyName = property.getSimpleName();
126 String parameterName = decapitalize(propertyName);
127 out.println("");
128 out.println(" virtual " + type + " get" + propertyName + "() ;");
129 out.println(" virtual void set" + propertyName + "(" + type + " " + parameterName + ") ;");
130 }
131 out.println("");
132 out.println(" virtual int marshal(p<IMarshaller> marshaller, int mode, p<IOutputStream> ostream) throw (IOException) ;");
133 out.println(" virtual void unmarshal(p<IMarshaller> marshaller, int mode, p<IInputStream> istream) throw (IOException) ;");
134 out.println("} ;");
135 out.println("");
136 out.println("/* namespace */");
137 out.println(" }");
138 out.println(" }");
139 out.println("}");
140 out.println("");
141 out.println("#endif /*ActiveMQ_" + className + "_hpp_*/");
142 }
143
144 }