diff options
| author | Gordon Sim <gsim@apache.org> | 2007-07-19 08:27:36 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2007-07-19 08:27:36 +0000 |
| commit | 1f4463ff0c56261e2ee7f5a163ba2ba8ced80793 (patch) | |
| tree | c57b784be11c1eb3e203f433b81660d4cc339eb5 /qpid/cpp/gentools | |
| parent | 3f8fc92fbc2303d3a97b04e65a18d25f1d6cc7e8 (diff) | |
| download | qpid-python-1f4463ff0c56261e2ee7f5a163ba2ba8ced80793.tar.gz | |
removed the need to pass MethodContext/RequestId through proxy and handler/adapter interfaces
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@557522 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/gentools')
4 files changed, 45 insertions, 9 deletions
diff --git a/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpClass.java b/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpClass.java index 2e8bdaf971..1bc9dc456a 100644 --- a/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpClass.java +++ b/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpClass.java @@ -93,6 +93,9 @@ public class AmqpClass implements Printable, NodeAware thisMethod = new AmqpMethod(methodName, converter); methodMap.put(methodName, thisMethod); } + int content = Utils.getNamedIntegerAttribute(child, Utils.ATTRIBUTE_CONTENT, 0); + thisMethod.content = (content == 1); + if (!thisMethod.addFromNode(child, 0, version)) { String className = converter.prepareClassName(Utils.getNamedAttribute(classNode, diff --git a/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpMethod.java b/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpMethod.java index f3c5bdd935..e78eec112f 100644 --- a/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpMethod.java +++ b/qpid/cpp/gentools/src/org/apache/qpid/gentools/AmqpMethod.java @@ -36,6 +36,7 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck public AmqpFlagMap clientMethodFlagMap; // Method called on client (<chassis name="server"> in XML) public AmqpFlagMap serverMethodFlagMap; // Method called on server (<chassis name="client"> in XML) public AmqpFlagMap isResponseFlagMap; + public boolean content; public AmqpMethod(String name, LanguageConverter converter) { diff --git a/qpid/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java b/qpid/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java index 26b189a1ff..edcf9e09e3 100644 --- a/qpid/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java +++ b/qpid/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java @@ -763,14 +763,23 @@ public class CppGenerator extends Generator AmqpVersionSet versionSet = overloadededParameterMap.get(thisFieldMap); if (!first) sb.append(cr); sb.append(indent + "virtual "+returnType+" "+ methodName + "("); - if (abstractMethodFlag) sb.append("const MethodContext& context"); - boolean leadingComma = abstractMethodFlag; - int paramIndent = indentSize + (5*tabSize); - sb.append(generateMethodParameterList(thisFieldMap, paramIndent, leadingComma, true, true)); + + if (abstractMethodFlag && isSpecialCase(thisClass.name, method.name)) { + sb.append("const MethodContext& context"); + } else { + sb.append(generateMethodParameterList(thisFieldMap, indentSize + (5*tabSize), false, true, true)); + } + + //if (abstractMethodFlag) sb.append("const MethodContext& context"); + //boolean leadingComma = abstractMethodFlag; + //int paramIndent = indentSize + (5*tabSize); + // sb.append(generateMethodParameterList(thisFieldMap, paramIndent, leadingComma, true, true)); + /* if (!abstractMethodFlag && method.isResponse(null)) { if (!thisFieldMap.isEmpty()) sb.append(", \n"+Utils.createSpaces(paramIndent)); sb.append(" RequestId responseTo"); } + */ sb.append(" )"); if (abstractMethodFlag) sb.append(" = 0"); @@ -888,6 +897,7 @@ public class CppGenerator extends Generator sb.append(indent + "{" + cr); sb.append(indent + "private:" + cr); sb.append(indent + tab + "ChannelAdapter& channel;" + cr); + sb.append(indent + tab + "RequestId responseTo;" + cr); sb.append(cr); sb.append(indent + "public:" + cr); sb.append(indent + tab + "// Constructors and destructors" + cr); @@ -897,6 +907,9 @@ public class CppGenerator extends Generator sb.append(indent + tab + "virtual ~" + className + "() {}" + cr); sb.append(cr); sb.append(indent + tab + "static "+className+"& get(" + proxyOuterClassName(serverFlag)+"& proxy) { return proxy.get"+className+"();}\n\n"); + sb.append(indent + tab + "// set for response correlation" + cr); + sb.append(indent + tab + "void setResponseTo(RequestId r) { responseTo = r; }" + cr); + sb.append(cr); sb.append(indent + tab + "// Protocol methods" + cr); sb.append(cr); sb.append(generateInnerClassMethods(thisClass, serverFlag, false, indentSize + tabSize, tabSize)); @@ -1004,8 +1017,10 @@ public class CppGenerator extends Generator methodName + "("); sb.append(generateMethodParameterList(thisFieldMap, indentSize + (5*tabSize), false, true, true)); if (method.isResponse(null)) { + /* if (!thisFieldMap.isEmpty()) sb.append(", "); - sb.append("RequestId responseTo"); + sb.append("RequestId responseTo"); + */ } sb.append(")"); if (versionSet.size() != globalVersionSet.size()) @@ -1457,6 +1472,7 @@ public class CppGenerator extends Generator String indent = Utils.createSpaces(indentSize); String tab = Utils.createSpaces(tabSize); StringBuffer sb = new StringBuffer(); + boolean special = isSpecialCase(thisClass.name, method.name); if (method.serverMethodFlagMap.size() > 0) // At least one AMQP version defines this method as a server method { @@ -1466,14 +1482,18 @@ public class CppGenerator extends Generator if (bItr.next()) // This is a server operation { boolean fieldMapNotEmptyFlag = method.fieldMap.size() > 0; - sb.append(indent + "void invoke(AMQP_ServerOperations& target, const MethodContext& context)" + cr); + sb.append(indent + "void invoke(AMQP_ServerOperations& target, const MethodContext&" + + (special ? " context)" : " )") + cr); sb.append(indent + "{" + cr); sb.append(indent + tab + "target.get" + thisClass.name + "Handler()->" + parseForReservedWords(Utils.firstLower(method.name), - thisClass.name + Utils.firstUpper(method.name) + "Body.invoke()") + "(context"); - if (fieldMapNotEmptyFlag) + thisClass.name + Utils.firstUpper(method.name) + "Body.invoke()") + "("); + if (special) + { + sb.append("context"); + } + else if (fieldMapNotEmptyFlag) { - sb.append("," + cr); sb.append(generateFieldList(method.fieldMap, version, false, false, indentSize + 4*tabSize)); sb.append(indent + tab + tab + tab + tab); } @@ -1632,4 +1652,9 @@ public class CppGenerator extends Generator } return ccn.toString(); } + + private boolean isSpecialCase(String className, String methodName) + { + return "message".equalsIgnoreCase(className) && ("transfer".equalsIgnoreCase(methodName) || "append".equalsIgnoreCase(methodName)); + } } diff --git a/qpid/cpp/gentools/src/org/apache/qpid/gentools/Utils.java b/qpid/cpp/gentools/src/org/apache/qpid/gentools/Utils.java index ade00cd8c7..e1c4661acf 100644 --- a/qpid/cpp/gentools/src/org/apache/qpid/gentools/Utils.java +++ b/qpid/cpp/gentools/src/org/apache/qpid/gentools/Utils.java @@ -70,6 +70,13 @@ public class Utils { return Integer.parseInt(getNamedAttribute(n, attrName)); } + + public static int getNamedIntegerAttribute(Node node, String name, int defaultValue) throws AmqpParseException + { + NamedNodeMap attributes = node.getAttributes(); + Attr a = attributes == null ? null : (Attr) attributes.getNamedItem(name); + return a == null ? defaultValue : Integer.parseInt(a.getNodeValue()); + } // Element functions |
