summaryrefslogtreecommitdiff
path: root/cpp/gentools
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2007-07-23 12:29:17 +0000
committerGordon Sim <gsim@apache.org>2007-07-23 12:29:17 +0000
commit0db1af31320aa010c8e97da80000f7548d889068 (patch)
treece2cd8dba8cf46b685dcb626b31e25c17702c1a0 /cpp/gentools
parent747ac26509e78ac9aa9120be02cd446ac99d21cd (diff)
downloadqpid-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.java52
-rw-r--r--cpp/gentools/templ.cpp/AMQP_ServerOperations.h.tmpl7
-rw-r--r--cpp/gentools/templ.cpp/MethodBodyClass.h.tmpl2
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}