diff options
| author | Gordon Sim <gsim@apache.org> | 2007-07-23 12:29:17 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2007-07-23 12:29:17 +0000 |
| commit | 0db1af31320aa010c8e97da80000f7548d889068 (patch) | |
| tree | ce2cd8dba8cf46b685dcb626b31e25c17702c1a0 /cpp/gentools | |
| parent | 747ac26509e78ac9aa9120be02cd446ac99d21cd (diff) | |
| download | qpid-python-0db1af31320aa010c8e97da80000f7548d889068.tar.gz | |
Added initial 'execution-layer' to try out methods form the 0-10 execution class.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@558700 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/gentools')
| -rw-r--r-- | cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java | 52 | ||||
| -rw-r--r-- | cpp/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl | 7 | ||||
| -rw-r--r-- | cpp/gentools/templ.cpp/MethodBodyClass.h.tmpl | 2 |
3 files changed, 58 insertions, 3 deletions
diff --git a/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java b/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java index edcf9e09e3..fd3684125c 100644 --- a/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java +++ b/cpp/gentools/src/org/apache/qpid/gentools/CppGenerator.java @@ -348,6 +348,8 @@ public class CppGenerator extends Generator return generateConstructor(thisClass, method, version, 4, 4); if (token.equals("${mb_server_operation_invoke}")) return generateServerOperationsInvoke(thisClass, method, version, 4, 4); + if (token.equals("${mb_server_operation_invoke2}")) + return generateServerOperationsInvoke2(thisClass, method, version, 4, 4); if (token.equals("${mb_buffer_param}")) return method.fieldMap.size() > 0 ? " buffer" : "/*buffer*/"; if (token.equals("${hv_latest_major}")) @@ -719,7 +721,7 @@ public class CppGenerator extends Generator sb.append(cr); sb.append(indent + "// ==================== class " + handlerClassName + " ====================" + cr); - sb.append(indent + "class " + handlerClassName); + sb.append(indent + "class " + handlerClassName + " : public virtual Invocable"); if (thisClass.versionSet.size() != globalVersionSet.size()) sb.append(" // AMQP Version(s) " + thisClass.versionSet + cr); else @@ -1085,11 +1087,11 @@ public class CppGenerator extends Generator String tab = Utils.createSpaces(tabSize); String namespace = version != null ? version.namespace() + "::" : ""; StringBuffer sb = new StringBuffer(); - sb.append(indent+tab+(method.isResponse(version) ? "" : "return ")+"channel.send(new "); + sb.append(indent+tab+(method.isResponse(version) ? "" : "return ")+"channel.send(make_shared_ptr(new "); sb.append(namespace + methodBodyClassName + "( channel.getVersion()"); if (method.isResponse(version)) sb.append(", responseTo"); sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), true, false, true)); - sb.append("));\n"); + sb.append(")));\n"); return sb.toString(); } @@ -1505,6 +1507,50 @@ public class CppGenerator extends Generator return sb.toString(); } + protected String generateServerOperationsInvoke2(AmqpClass thisClass, AmqpMethod method, + AmqpVersion version, int indentSize, int tabSize) + throws AmqpTypeMappingException + { + String indent = Utils.createSpaces(indentSize); + String tab = Utils.createSpaces(tabSize); + StringBuffer sb = new StringBuffer(); + String ptrType = "AMQP_ServerOperations:: " + thisClass.name + "Handler*"; + if (isSpecialCase(thisClass.name, method.name)) { + sb.append(indent + "bool invoke(Invocable*)" + cr); + sb.append(indent + "{" + cr); + sb.append(indent + tab + "return false;" + cr); + sb.append(indent + "}" + cr); + } else if (method.serverMethodFlagMap.size() > 0) { // At least one AMQP version defines this method as a server method + + Iterator<Boolean> bItr = method.serverMethodFlagMap.keySet().iterator(); + while (bItr.hasNext()) + { + if (bItr.next()) // This is a server operation + { + boolean fieldMapNotEmptyFlag = method.fieldMap.size() > 0; + sb.append(indent + "bool invoke(Invocable* target)" + cr); + sb.append(indent + "{" + cr); + sb.append(indent + tab + ptrType + " ptr = dynamic_cast<" + ptrType + ">(target);" + cr); + sb.append(indent + tab + "if (ptr) {" + cr); + sb.append(indent + tab + tab + "ptr->"); + sb.append(parseForReservedWords(Utils.firstLower(method.name),null) + "(" + cr); + if (fieldMapNotEmptyFlag) + { + sb.append(generateFieldList(method.fieldMap, version, false, false, indentSize + 4*tabSize)); + sb.append(indent + tab + tab + tab + tab); + } + sb.append(");" + cr); + sb.append(indent + tab + tab + "return true;" + cr); + sb.append(indent + tab + "} else {" + cr); + sb.append(indent + tab + tab + "return false;" + cr); + sb.append(indent + tab + "}" + cr); + sb.append(indent + "}" + cr); + } + } + } + return sb.toString(); + } + // Methods for generation of code snippets for amqp_methods.h/cpp files protected String generateMethodBodyIncludeList(AmqpModel model, int indentSize) diff --git a/cpp/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl b/cpp/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl index be8dc2a6b3..06ef88c84e 100644 --- a/cpp/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl +++ b/cpp/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl @@ -36,6 +36,13 @@ namespace framing { class MethodContext; +class Invocable +{ +protected: + Invocable() {} + virtual ~Invocable() {} +}; + class AMQP_ServerOperations { protected: diff --git a/cpp/gentools/templ.cpp/MethodBodyClass.h.tmpl b/cpp/gentools/templ.cpp/MethodBodyClass.h.tmpl index 2e1b2ed482..093a5ffe90 100644 --- a/cpp/gentools/templ.cpp/MethodBodyClass.h.tmpl +++ b/cpp/gentools/templ.cpp/MethodBodyClass.h.tmpl @@ -100,6 +100,8 @@ ${mb_constructor_with_initializers} ${mb_server_operation_invoke} +${mb_server_operation_invoke2} + }; // class ${CLASS}${METHOD}Body ${version_namespace_end} |
