blob: 067f488d3f644bbfc5afefe7c68c3938b0568328 [file] [log] [blame]
#!/usr/bin/python
#
# PACKAGE DEPENDENCIES: python python-lxml
#
#import easy to use xml parser called minidom:
from lxml import etree
#from copy import deepcopy
from lxml import objectify
import re, sys, getopt
def rreplace(s, old, new, occurrence):
li = s.rsplit(old, occurrence)
return new.join(li)
def usage():
print "jni-xml2cpp.py --file <file> | -i <file>"
# main
inputfile = "./dbus/callmanager-introspec.xml"
outputfile = "./dbus/callmanager-jni.h"
try:
opts, args = getopt.getopt(sys.argv[1:], "hi:o:", ["help", "input=", "output="])
except getopt.GetoptError, err:
usage()
print str(err)
#print opts
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
usage()
sys.exit(0)
elif opt in ("-i", "--input"):
inputfile = arg
elif opt in ("-o", "--output"):
outputfile = arg
else:
print "error: argument not recognized"
sys.exit(3)
print "inputfile = %s" % (inputfile)
print "outputfile = %s" % (outputfile)
source = "".join(args)
# lxml.objectify
# FIXME relative path
cm_obj_tree = objectify.parse(inputfile)
cm_obj_root = cm_obj_tree.getroot()
# http://www.skymind.com/~ocrow/python_string/
# method 4: list of strings
prototype = []
# iteration on methods
for meth in cm_obj_root.interface.iter(tag="method"):
# iteration on arguments
prototype.append(meth.get("name"))
prototype.append("(")
for argum in meth.iter(tag="arg"):
name = argum.get("name")
typ = argum.get("type")
# FIXME
if typ == 's':
prototype.append("string %s, " % (name))
elif typ == 'i':
prototype.append("int %s, " % (name))
elif typ == 'd':
prototype.append("unsigned int %s, " % (name))
elif typ == 'as':
prototype.append("std::vector< std::string > &%s, " % (name))
else:
prototype.append("void %s, " % (name))
prototype.append(");\n")
# starting from the end of string,
# replace the first and 1-only comma by nothing
#rreplace(prototype[tostring(), ',', '', 1)
p = re.compile(", \);")
prototypes = p.sub(");", ''.join(prototype))
# FIXME relative path
outfile = open(outputfile, "w")
outfile.write(prototypes)
outfile.close()