summaryrefslogtreecommitdiff
path: root/qpid/cpp/managementgen
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2008-10-07 21:47:35 +0000
committerTed Ross <tross@apache.org>2008-10-07 21:47:35 +0000
commitb56f731ad9d5d4b4b21f953dbd1103662b3d0b06 (patch)
tree35a8f96fd5dc029c256bdda622c2a70b8ac2b8ec /qpid/cpp/managementgen
parent15e9b9a0d064e142e6e971475338c0fff72579ad (diff)
downloadqpid-python-b56f731ad9d5d4b4b21f953dbd1103662b3d0b06.tar.gz
QPID-1327 - Event support for Management
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@702651 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/managementgen')
-rwxr-xr-xqpid/cpp/managementgen/qmf-gen2
-rwxr-xr-xqpid/cpp/managementgen/qmf/generate.py18
-rw-r--r--qpid/cpp/managementgen/qmf/management-types.xml2
-rwxr-xr-xqpid/cpp/managementgen/qmf/schema.py246
-rw-r--r--qpid/cpp/managementgen/qmf/templates/Class.cpp11
-rw-r--r--qpid/cpp/managementgen/qmf/templates/Class.h12
-rw-r--r--qpid/cpp/managementgen/qmf/templates/Event.cpp77
-rw-r--r--qpid/cpp/managementgen/qmf/templates/Event.h58
8 files changed, 315 insertions, 111 deletions
diff --git a/qpid/cpp/managementgen/qmf-gen b/qpid/cpp/managementgen/qmf-gen
index 523579fe6c..62362e3cad 100755
--- a/qpid/cpp/managementgen/qmf-gen
+++ b/qpid/cpp/managementgen/qmf-gen
@@ -58,6 +58,8 @@ for schemafile in args:
gen.makeClassFiles ("Class.h", package)
gen.makeClassFiles ("Class.cpp", package)
gen.makeMethodFiles ("Args.h", package)
+ gen.makeEventFiles ("Event.h", package)
+ gen.makeEventFiles ("Event.cpp", package)
gen.makePackageFile ("Package.h", package)
gen.makePackageFile ("Package.cpp", package)
diff --git a/qpid/cpp/managementgen/qmf/generate.py b/qpid/cpp/managementgen/qmf/generate.py
index 7346200a28..958728d739 100755
--- a/qpid/cpp/managementgen/qmf/generate.py
+++ b/qpid/cpp/managementgen/qmf/generate.py
@@ -250,6 +250,14 @@ class Generator:
path = self.packagePath + _class.getNameCap () + extension
return path
+ def targetEventFile (self, event, templateFile):
+ dot = templateFile.find(".")
+ if dot == -1:
+ raise ValueError ("Invalid template file name %s" % templateFile)
+ extension = templateFile[dot:len (templateFile)]
+ path = self.packagePath + "Event" + event.getNameCap () + extension
+ return path
+
def targetMethodFile (self, method, templateFile):
""" Return the file name for a method file """
dot = templateFile.rfind(".")
@@ -293,6 +301,16 @@ class Generator:
stream = template.expand (_class)
self.writeIfChanged (stream, target, force)
+ def makeEventFiles (self, templateFile, schema, force=False):
+ """ Generate an expanded template per schema event """
+ events = schema.getEvents()
+ template = Template (self.input + templateFile, self)
+ self.templateFiles.append (templateFile)
+ for event in events:
+ target = self.targetEventFile(event, templateFile)
+ stream = template.expand(event)
+ self.writeIfChanged(stream, target, force)
+
def makeMethodFiles (self, templateFile, schema, force=False):
""" Generate an expanded template per method-with-arguments """
classes = schema.getClasses ()
diff --git a/qpid/cpp/managementgen/qmf/management-types.xml b/qpid/cpp/managementgen/qmf/management-types.xml
index 6e34421d99..626880afb3 100644
--- a/qpid/cpp/managementgen/qmf/management-types.xml
+++ b/qpid/cpp/managementgen/qmf/management-types.xml
@@ -30,7 +30,7 @@
<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" accessor="direct" init="0"/>
<type name="bool" base="BOOL" cpp="uint8_t" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" accessor="direct" init="0"/>
<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" accessor="direct" init='""' byRef="y"/>
-<type name="lstr" base="LSTR" cpp="std::string" encode="@.putLongString(#)" decode="@.getLongString(#)" accessor="direct" init='""' byRef="y"/>
+<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" accessor="direct" init='""' byRef="y"/>
<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
<type name="deltaTime" base="DELTATIME" cpp="uint64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" accessor="direct" init="0"/>
<type name="float" base="FLOAT" cpp="float" encode="@.putFloat(#)" decode="# = @.getFloat()" accessor="direct" init="0."/>
diff --git a/qpid/cpp/managementgen/qmf/schema.py b/qpid/cpp/managementgen/qmf/schema.py
index 2ecf9c351f..48e697ab4a 100755
--- a/qpid/cpp/managementgen/qmf/schema.py
+++ b/qpid/cpp/managementgen/qmf/schema.py
@@ -21,6 +21,32 @@ from xml.dom.minidom import parse, parseString, Node
from cStringIO import StringIO
import md5
+class Hash:
+ """ Manage the hash of an XML sub-tree """
+ def __init__(self, node):
+ self.md5Sum = md5.new()
+ self._compute(node)
+
+ def addSubHash(self, hash):
+ """ Use this method to add the hash of a dependend-on XML fragment that is not in the sub-tree """
+ self.md5Sum.update(hash.getDigest())
+
+ def getDigest(self):
+ return self.md5Sum.digest()
+
+ def _compute(self, node):
+ attrs = node.attributes
+ self.md5Sum.update(node.nodeName)
+
+ for idx in range(attrs.length):
+ self.md5Sum.update(attrs.item(idx).nodeName)
+ self.md5Sum.update(attrs.item(idx).nodeValue)
+
+ for child in node.childNodes:
+ if child.nodeType == Node.ELEMENT_NODE:
+ self._compute(child)
+
+
#=====================================================================================
#
#=====================================================================================
@@ -525,6 +551,7 @@ class SchemaArg:
self.maxLen = None
self.desc = None
self.default = None
+ self.hash = Hash(node)
attrs = node.attributes
for idx in range (attrs.length):
@@ -675,12 +702,12 @@ class SchemaMethod:
#
#=====================================================================================
class SchemaEvent:
- def __init__ (self, parent, node, typespec):
- self.parent = parent
- self.name = None
- self.desc = None
- self.args = []
- self.defaultSeverity = None
+ def __init__ (self, package, node, typespec, argset):
+ self.packageName = package
+ self.name = None
+ self.desc = None
+ self.args = []
+ self.hash = Hash(node)
attrs = node.attributes
for idx in range (attrs.length):
@@ -692,72 +719,96 @@ class SchemaEvent:
elif key == 'desc':
self.desc = val
- elif key == 'defaultSeverity':
- self.defaultSeverity = val
+ elif key == 'args':
+ list = val.replace(" ", "").split(",")
+ for item in list:
+ if item not in argset.args:
+ raise Exception("undefined argument '%s' in event" % item)
+ self.args.append(argset.args[item])
+ self.hash.addSubHash(argset.args[item].hash)
else:
raise ValueError ("Unknown attribute in event '%s'" % key)
- for child in node.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- if child.nodeName == 'arg':
- arg = SchemaArg (child, typespec)
- self.args.append (arg)
- else:
- raise ValueError ("Unknown event tag '%s'" % child.nodeName)
-
def getName (self):
return self.name
+ def getNameCap(self):
+ return capitalize(self.name)
+
def getFullName (self):
- return capitalize(self.parent.getName()) + capitalize(self.name)
+ return capitalize(self.package + capitalize(self.name))
def getArgCount (self):
return len (self.args)
- def genMethodBody (self, stream, variables, classObject):
- stream.write("void ")
- classObject.genNameCap(stream, variables)
- stream.write("::event_%s(" % self.name)
- count = 0
+ def genArgCount (self, stream, variables):
+ stream.write("%d" % len(self.args))
+
+ def genArgDeclarations(self, stream, variables):
for arg in self.args:
- arg.genFormalParam(stream, variables)
- count += 1
- if count < len(self.args):
- stream.write(", ")
- stream.write(") {\n")
- stream.write(" ::qpid::sys::Mutex::ScopedLock mutex(getMutex());\n")
- stream.write(" Buffer* buf = startEventLH();\n")
- stream.write(" objectId.encode(*buf);\n")
- stream.write(" buf->putShortString(packageName);\n")
- stream.write(" buf->putShortString(className);\n")
- stream.write(" buf->putBin128(md5Sum);\n")
- stream.write(" buf->putShortString(\"%s\");\n" % self.name)
+ if arg.type.type.byRef:
+ ref = "&"
+ else:
+ ref = ""
+ stream.write(" const %s%s %s;\n" % (arg.type.type.cpp, ref, arg.name))
+
+ def genCloseNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("}")
+
+ def genConstructorArgs(self, stream, variables):
+ pre = ""
for arg in self.args:
- stream.write(" %s;\n" % arg.type.type.encode.replace("@", "(*buf)").replace("#", "_" + arg.name))
- stream.write(" finishEventLH(buf);\n")
- stream.write("}\n\n")
+ if arg.type.type.byRef:
+ ref = "&"
+ else:
+ ref = ""
+ stream.write("%sconst %s%s _%s" % (pre, arg.type.type.cpp, ref, arg.name))
+ pre = ",\n "
- def genMethodDecl (self, stream, variables):
- stream.write(" void event_%s(" % self.name)
- count = 0
+ def genConstructorInits(self, stream, variables):
+ pre = ""
for arg in self.args:
- arg.genFormalParam(stream, variables)
- count += 1
- if count < len(self.args):
- stream.write(", ")
- stream.write(");\n")
+ stream.write("%s%s(_%s)" % (pre, arg.name, arg.name))
+ pre = ",\n "
- def genSchema(self, stream, variables):
- stream.write (" ft = FieldTable ();\n")
- stream.write (" ft.setString (NAME, \"" + self.name + "\");\n")
- stream.write (" ft.setInt (ARGCOUNT, " + str (len (self.args)) + ");\n")
- if self.desc != None:
- stream.write (" ft.setString (DESC, \"" + self.desc + "\");\n")
- stream.write (" buf.put (ft);\n\n")
+ def genName(self, stream, variables):
+ stream.write(self.name)
+
+ def genNameCap(self, stream, variables):
+ stream.write(capitalize(self.name))
+
+ def genNamespace (self, stream, variables):
+ stream.write("::".join(self.packageName.split(".")))
+
+ def genNameLower(self, stream, variables):
+ stream.write(self.name.lower())
+
+ def genNameUpper(self, stream, variables):
+ stream.write(self.name.upper())
+
+ def genNamePackageLower(self, stream, variables):
+ stream.write(self.packageName.lower())
+
+ def genOpenNamespaces (self, stream, variables):
+ for item in self.packageName.split("."):
+ stream.write ("namespace %s {\n" % item)
+
+ def genArgEncodes(self, stream, variables):
+ for arg in self.args:
+ stream.write(" " + arg.type.type.encode.replace("@", "buf").replace("#", arg.name) + ";\n")
+
+ def genArgSchema(self, stream, variables):
for arg in self.args:
- arg.genSchema (stream, True)
+ arg.genSchema(stream, True)
+ def genSchemaMD5(self, stream, variables):
+ sum = self.hash.getDigest()
+ for idx in range (len (sum)):
+ if idx != 0:
+ stream.write (",")
+ stream.write (hex (ord (sum[idx])))
class SchemaClass:
@@ -768,9 +819,7 @@ class SchemaClass:
self.methods = []
self.events = []
self.options = options
- self.md5Sum = md5.new ()
-
- self.hash (node)
+ self.hash = Hash(node)
attrs = node.attributes
self.name = makeValidCppSymbol(attrs['name'].nodeValue)
@@ -790,10 +839,6 @@ class SchemaClass:
sub = SchemaMethod (self, child, typespec)
self.methods.append (sub)
- elif child.nodeName == 'event':
- sub = SchemaEvent (self, child, typespec)
- self.events.append (sub)
-
elif child.nodeName == 'group':
self.expandFragment (child, fragments)
@@ -820,24 +865,12 @@ class SchemaClass:
result = result[0:pos] + "threadStats->" + result[pos:]
start = pos + 9 + len(next[1])
- def hash (self, node):
- attrs = node.attributes
- self.md5Sum.update (node.nodeName)
-
- for idx in range (attrs.length):
- self.md5Sum.update (attrs.item(idx).nodeName)
- self.md5Sum.update (attrs.item(idx).nodeValue)
-
- for child in node.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- self.hash (child)
-
def expandFragment (self, node, fragments):
attrs = node.attributes
name = attrs['name'].nodeValue
for fragment in fragments:
if fragment.name == name:
- self.md5Sum.update (fragment.md5Sum.digest())
+ self.hash.addSubHash(fragment.hash)
for config in fragment.properties:
self.properties.append (config)
for inst in fragment.statistics:
@@ -937,27 +970,12 @@ class SchemaClass:
inArgCount = inArgCount + 1
if methodCount == 0:
- stream.write ("string, Buffer&, Buffer& outBuf")
+ stream.write ("string&, Buffer&, Buffer& outBuf")
else:
if inArgCount == 0:
- stream.write ("string methodName, Buffer&, Buffer& outBuf")
+ stream.write ("string& methodName, Buffer&, Buffer& outBuf")
else:
- stream.write ("string methodName, Buffer& inBuf, Buffer& outBuf")
-
- def genEventCount (self, stream, variables):
- stream.write ("%d" % len (self.events))
-
- def genEventMethodBodies (self, stream, variables):
- for event in self.events:
- event.genMethodBody (stream, variables, self)
-
- def genEventMethodDecls (self, stream, variables):
- for event in self.events:
- event.genMethodDecl (stream, variables)
-
- def genEventSchema (self, stream, variables):
- for event in self.events:
- event.genSchema (stream, variables)
+ stream.write ("string& methodName, Buffer& inBuf, Buffer& outBuf")
def genHiLoStatResets (self, stream, variables):
for inst in self.statistics:
@@ -1124,7 +1142,7 @@ class SchemaClass:
return
def genSchemaMD5 (self, stream, variables):
- sum = self.md5Sum.digest ()
+ sum = self.hash.getDigest()
for idx in range (len (sum)):
if idx != 0:
stream.write (",")
@@ -1149,6 +1167,20 @@ class SchemaClass:
stat.genWrite (stream)
+class SchemaEventArgs:
+ def __init__(self, package, node, typespec, fragments, options):
+ self.packageName = package
+ self.options = options
+ self.args = {}
+
+ children = node.childNodes
+ for child in children:
+ if child.nodeType == Node.ELEMENT_NODE:
+ if child.nodeName == 'arg':
+ arg = SchemaArg(child, typespec)
+ self.args[arg.name] = arg
+ else:
+ raise Exception("Unknown tag '%s' in <eventArguments>" % child.nodeName)
class SchemaPackage:
def __init__ (self, typefile, schemafile, options):
@@ -1156,6 +1188,8 @@ class SchemaPackage:
self.classes = []
self.fragments = []
self.typespec = TypeSpec (typefile)
+ self.eventArgSet = None
+ self.events = []
dom = parse (schemafile)
document = dom.documentElement
@@ -1179,6 +1213,15 @@ class SchemaPackage:
self.fragments, options)
self.fragments.append (cls)
+ elif child.nodeName == 'eventArguments':
+ if self.eventArgSet:
+ raise Exception("Only one <eventArguments> may appear in a package")
+ self.eventArgSet = SchemaEventArgs(self.packageName, child, self.typespec, self.fragments, options)
+
+ elif child.nodeName == 'event':
+ event = SchemaEvent(self.packageName, child, self.typespec, self.eventArgSet)
+ self.events.append(event)
+
else:
raise ValueError ("Unknown schema tag '%s'" % child.nodeName)
@@ -1194,6 +1237,9 @@ class SchemaPackage:
def getClasses (self):
return self.classes
+ def getEvents(self):
+ return self.events
+
def genCloseNamespaces (self, stream, variables):
for item in self.packageName.split("."):
stream.write ("}")
@@ -1217,12 +1263,20 @@ class SchemaPackage:
stream.write ("#include \"")
_class.genNameCap (stream, variables)
stream.write (".h\"\n")
+ for _event in self.events:
+ stream.write ("#include \"Event")
+ _event.genNameCap(stream, variables)
+ stream.write (".h\"\n")
- def genClassRegisters (self, stream, variables):
+ def genClassRegisters(self, stream, variables):
for _class in self.classes:
- stream.write (" ")
- _class.genNameCap (stream, variables)
- stream.write ("::registerClass(agent);\n")
+ stream.write(" ")
+ _class.genNameCap(stream, variables)
+ stream.write("::registerSelf(agent);\n")
+ for _event in self.events:
+ stream.write(" Event")
+ _event.genNameCap(stream, variables)
+ stream.write("::registerSelf(agent);\n")
#=====================================================================================
diff --git a/qpid/cpp/managementgen/qmf/templates/Class.cpp b/qpid/cpp/managementgen/qmf/templates/Class.cpp
index 964e6f8349..0a69939821 100644
--- a/qpid/cpp/managementgen/qmf/templates/Class.cpp
+++ b/qpid/cpp/managementgen/qmf/templates/Class.cpp
@@ -85,9 +85,9 @@ namespace {
const string DEFAULT("default");
}
-void /*MGEN:Class.NameCap*/::registerClass(ManagementAgent* agent)
+void /*MGEN:Class.NameCap*/::registerSelf(ManagementAgent* agent)
{
- agent->RegisterClass(packageName, className, md5Sum, writeSchema);
+ agent->registerClass(packageName, className, md5Sum, writeSchema);
}
void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
@@ -95,13 +95,13 @@ void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
FieldTable ft;
// Schema class header:
+ buf.putOctet (CLASS_KIND_TABLE);
buf.putShortString (packageName); // Package Name
buf.putShortString (className); // Class Name
buf.putBin128 (md5Sum); // Schema Hash
buf.putShort (/*MGEN:Class.ConfigCount*/); // Config Element Count
buf.putShort (/*MGEN:Class.InstCount*/); // Inst Element Count
buf.putShort (/*MGEN:Class.MethodCount*/); // Method Count
- buf.putShort (/*MGEN:Class.EventCount*/); // Event Count
// Properties
/*MGEN:Class.PropertySchema*/
@@ -109,8 +109,6 @@ void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
/*MGEN:Class.StatisticSchema*/
// Methods
/*MGEN:Class.MethodSchema*/
- // Events
-/*MGEN:Class.EventSchema*/
}
/*MGEN:IF(Class.ExistPerThreadStats)*/
@@ -176,9 +174,8 @@ void /*MGEN:Class.NameCap*/::doMethod (/*MGEN:Class.DoMethodArgs*/)
{
Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD;
std::string text;
+
/*MGEN:Class.MethodHandlers*/
outBuf.putLong(status);
outBuf.putShortString(Manageable::StatusText(status, text));
}
-
-/*MGEN:Class.EventMethodBodies*/
diff --git a/qpid/cpp/managementgen/qmf/templates/Class.h b/qpid/cpp/managementgen/qmf/templates/Class.h
index 99ebc68789..2a995c95a5 100644
--- a/qpid/cpp/managementgen/qmf/templates/Class.h
+++ b/qpid/cpp/managementgen/qmf/templates/Class.h
@@ -72,7 +72,7 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
void writeProperties (::qpid::framing::Buffer& buf);
void writeStatistics (::qpid::framing::Buffer& buf,
bool skipHeaders = false);
- void doMethod (std::string methodName,
+ void doMethod (std::string& methodName,
::qpid::framing::Buffer& inBuf,
::qpid::framing::Buffer& outBuf);
writeSchemaCall_t getWriteSchemaCall(void) { return writeSchema; }
@@ -88,17 +88,15 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
/*MGEN:Class.SetGeneralReferenceDeclaration*/
- static void registerClass (::qpid::management::ManagementAgent* agent);
- std::string& getPackageName (void) { return packageName; }
- std::string& getClassName (void) { return className; }
- uint8_t* getMd5Sum (void) { return md5Sum; }
+ static void registerSelf (::qpid::management::ManagementAgent* agent);
+ std::string& getPackageName (void) const { return packageName; }
+ std::string& getClassName (void) const { return className; }
+ uint8_t* getMd5Sum (void) const { return md5Sum; }
// Method IDs
/*MGEN:Class.MethodIdDeclarations*/
// Accessor Methods
/*MGEN:Class.AccessorMethods*/
- // Event Methods
-/*MGEN:Class.EventMethodDecls*/
};
}/*MGEN:Class.CloseNamespaces*/
diff --git a/qpid/cpp/managementgen/qmf/templates/Event.cpp b/qpid/cpp/managementgen/qmf/templates/Event.cpp
new file mode 100644
index 0000000000..cdb40c6d79
--- /dev/null
+++ b/qpid/cpp/managementgen/qmf/templates/Event.cpp
@@ -0,0 +1,77 @@
+/*MGEN:commentPrefix=//*/
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+/*MGEN:Root.Disclaimer*/
+
+#include "qpid/log/Statement.h"
+#include "qpid/framing/FieldTable.h"
+#include "qpid/management/Manageable.h"
+#include "qpid/agent/ManagementAgent.h"
+#include "Event/*MGEN:Event.NameCap*/.h"
+
+using namespace qmf::/*MGEN:Event.Namespace*/;
+using namespace qpid::framing;
+using qpid::management::ManagementAgent;
+using qpid::management::Manageable;
+using qpid::management::ManagementObject;
+using qpid::management::Args;
+using std::string;
+
+string Event/*MGEN:Event.NameCap*/::packageName = string ("/*MGEN:Event.NamePackageLower*/");
+string Event/*MGEN:Event.NameCap*/::eventName = string ("/*MGEN:Event.Name*/");
+uint8_t Event/*MGEN:Event.NameCap*/::md5Sum[16] =
+ {/*MGEN:Event.SchemaMD5*/};
+
+Event/*MGEN:Event.NameCap*/::Event/*MGEN:Event.NameCap*/ (/*MGEN:Event.ConstructorArgs*/) :
+ /*MGEN:Event.ConstructorInits*/
+{}
+
+namespace {
+ const string NAME("name");
+ const string TYPE("type");
+ const string DESC("desc");
+ const string ARGCOUNT("argCount");
+ const string ARGS("args");
+}
+
+void Event/*MGEN:Event.NameCap*/::registerSelf(ManagementAgent* agent)
+{
+ agent->registerEvent(packageName, eventName, md5Sum, writeSchema);
+}
+
+void Event/*MGEN:Event.NameCap*/::writeSchema (Buffer& buf)
+{
+ FieldTable ft;
+
+ // Schema class header:
+ buf.putOctet (CLASS_KIND_EVENT);
+ buf.putShortString (packageName); // Package Name
+ buf.putShortString (eventName); // Event Name
+ buf.putBin128 (md5Sum); // Schema Hash
+ buf.putShort (/*MGEN:Event.ArgCount*/); // Argument Count
+
+ // Arguments
+/*MGEN:Event.ArgSchema*/
+}
+
+void Event/*MGEN:Event.NameCap*/::encode(::qpid::framing::Buffer& buf) const
+{
+/*MGEN:Event.ArgEncodes*/
+}
diff --git a/qpid/cpp/managementgen/qmf/templates/Event.h b/qpid/cpp/managementgen/qmf/templates/Event.h
new file mode 100644
index 0000000000..a943c0c501
--- /dev/null
+++ b/qpid/cpp/managementgen/qmf/templates/Event.h
@@ -0,0 +1,58 @@
+/*MGEN:commentPrefix=//*/
+#ifndef _MANAGEMENT_/*MGEN:Event.NameUpper*/_
+#define _MANAGEMENT_/*MGEN:Event.NameUpper*/_
+
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+/*MGEN:Root.Disclaimer*/
+
+#include "qpid/management/ManagementEvent.h"
+#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/Uuid.h"
+
+namespace qmf {
+/*MGEN:Event.OpenNamespaces*/
+
+class Event/*MGEN:Event.NameCap*/ : public ::qpid::management::ManagementEvent
+{
+ private:
+ static void writeSchema (::qpid::framing::Buffer& buf);
+ static std::string packageName;
+ static std::string eventName;
+ static uint8_t md5Sum[16];
+
+/*MGEN:Event.ArgDeclarations*/
+
+ public:
+ writeSchemaCall_t getWriteSchemaCall(void) { return writeSchema; }
+
+ Event/*MGEN:Event.NameCap*/(/*MGEN:Event.ConstructorArgs*/);
+ ~Event/*MGEN:Class.NameCap*/() {};
+
+ static void registerSelf(::qpid::management::ManagementAgent* agent);
+ std::string& getPackageName() const { return packageName; }
+ std::string& getEventName() const { return eventName; }
+ uint8_t* getMd5Sum() const { return md5Sum; }
+ void encode(::qpid::framing::Buffer& buffer) const;
+};
+
+}/*MGEN:Event.CloseNamespaces*/
+
+#endif /*!_MANAGEMENT_/*MGEN:Event.NameUpper*/_*/