bridge-constructor: added dbus-xml constructor (used for Qt frontend)
This commit is contained in:
parent
60cb43435f
commit
85f6723867
1 changed files with 82 additions and 18 deletions
|
|
@ -35,7 +35,7 @@ under certain conditions.
|
|||
|
||||
This script construct a SàT bridge using the given protocol
|
||||
"""
|
||||
MANAGED_PROTOCOLES=['dbus','mediawiki']
|
||||
MANAGED_PROTOCOLES=['dbus','mediawiki', 'dbus-xml']
|
||||
DEFAULT_PROTOCOLE='dbus'
|
||||
FLAGS=['deprecated', 'async']
|
||||
|
||||
|
|
@ -49,6 +49,7 @@ from ConfigParser import SafeConfigParser as Parser
|
|||
from ConfigParser import NoOptionError
|
||||
import re
|
||||
from datetime import datetime
|
||||
from xml.dom import minidom
|
||||
|
||||
|
||||
class ParseError(Exception):
|
||||
|
|
@ -132,32 +133,23 @@ class Constructor:
|
|||
if self.bridge_template.has_option(name, "doc"):
|
||||
return self.bridge_template.get(name, "doc")
|
||||
return None
|
||||
|
||||
def getArguments(self, signature, name=None, default=None, unicode_protect=False):
|
||||
"""Return arguments to user given a signature
|
||||
@param signature: signature in the short form (using s,a,i,b etc)
|
||||
@param name: dictionary of arguments name like given by getArguments
|
||||
@param default: dictionary of default values, like given by getDefault
|
||||
@param unicode_protect: activate unicode protection on strings (return strings as unicode(str))
|
||||
@return: list of arguments that correspond to a signature (e.g.: "sss" return "arg1, arg2, arg3")"""
|
||||
|
||||
|
||||
def argumentsParser(self, signature):
|
||||
"""Generator which return individual arguments signatures from a global signature"""
|
||||
start=0
|
||||
i=0
|
||||
idx=0
|
||||
attr_string=[]
|
||||
|
||||
while i<len(signature):
|
||||
if signature[i] not in ['b','y','n','i','x','q','u','t','d','s','a']:
|
||||
raise ParseError("Unmanaged attribute type [%c]" % signature[i])
|
||||
|
||||
attr_string.append(("unicode(%(name)s)%(default)s" if (unicode_protect and signature[i]=='s') else "%(name)s%(default)s") % {
|
||||
'name':name[idx][0] if (name and name.has_key(idx)) else "arg_%i" % idx,
|
||||
'default':"="+default[idx] if (default and default.has_key(idx)) else ''
|
||||
}) #give arg_1, arg2, etc or name1, name2=default, etc. \
|
||||
#give unicode(arg_1), unicode(arg_2), etc. if unicode_protect is set and arg is a string
|
||||
idx+=1
|
||||
|
||||
if signature[i] == 'a':
|
||||
i+=1
|
||||
if signature[i]!='{' and signature[i]!='(': #FIXME: must manage tuples out of arrays
|
||||
i+=1
|
||||
yield signature[start:i]
|
||||
start=i
|
||||
continue #we have a simple type for the array
|
||||
opening_car = signature[i]
|
||||
assert(opening_car in ['{','('])
|
||||
|
|
@ -174,6 +166,27 @@ class Constructor:
|
|||
if opening_count == 0:
|
||||
break
|
||||
i+=1
|
||||
yield signature[start:i]
|
||||
start=i
|
||||
|
||||
def getArguments(self, signature, name=None, default=None, unicode_protect=False):
|
||||
"""Return arguments to user given a signature
|
||||
@param signature: signature in the short form (using s,a,i,b etc)
|
||||
@param name: dictionary of arguments name like given by getArguments
|
||||
@param default: dictionary of default values, like given by getDefault
|
||||
@param unicode_protect: activate unicode protection on strings (return strings as unicode(str))
|
||||
@return: list of arguments that correspond to a signature (e.g.: "sss" return "arg1, arg2, arg3")"""
|
||||
idx=0
|
||||
attr_string=[]
|
||||
|
||||
for arg in self.argumentsParser(signature):
|
||||
attr_string.append(("unicode(%(name)s)%(default)s" if (unicode_protect and arg=='s') else "%(name)s%(default)s") % {
|
||||
'name':name[idx][0] if (name and name.has_key(idx)) else "arg_%i" % idx,
|
||||
'default':"="+default[idx] if (default and default.has_key(idx)) else ''
|
||||
}) #give arg_1, arg2, etc or name1, name2=default, etc. \
|
||||
#give unicode(arg_1), unicode(arg_2), etc. if unicode_protect is set and arg is a string
|
||||
idx+=1
|
||||
|
||||
return ", ".join(attr_string)
|
||||
|
||||
def generateCoreSide(self):
|
||||
|
|
@ -462,6 +475,55 @@ class DbusConstructor(Constructor):
|
|||
#now we write to final file
|
||||
self.finalWrite(self.frontend_dest, frontend_bridge)
|
||||
|
||||
class DbusXmlConstructor(Constructor):
|
||||
"""Constructor for DBus XML syntaxt (used by Qt frontend)"""
|
||||
|
||||
def __init__(self, bridge_template, options):
|
||||
Constructor.__init__(self, bridge_template, options)
|
||||
|
||||
self.template="dbus_xml_template.xml"
|
||||
self.core_dest="org.goffi.sat.xml"
|
||||
|
||||
def generateCoreSide(self):
|
||||
try:
|
||||
doc = minidom.parse(self.template)
|
||||
interface_elt = doc.getElementsByTagName('interface')[0]
|
||||
except IOError:
|
||||
print ("Can't access template")
|
||||
sys.exit(1)
|
||||
except IndexError:
|
||||
print ("Template error")
|
||||
sys.exit(1)
|
||||
|
||||
sections = self.bridge_template.sections()
|
||||
sections.sort()
|
||||
for section in sections:
|
||||
function = self.getValues(section)
|
||||
print ("Adding %s %s" % (section, function["type"]))
|
||||
new_elt = doc.createElement('method' if function["type"]=='method' else 'signal')
|
||||
new_elt.setAttribute('name', section)
|
||||
args_in_str = self.getArguments(function['sig_in'])
|
||||
|
||||
idx=0
|
||||
args_doc = self.getArgumentsDoc(section)
|
||||
for arg in self.argumentsParser(function['sig_in'] or ''):
|
||||
arg_elt = doc.createElement('arg')
|
||||
arg_elt.setAttribute('name', args_doc[idx][0] if args_doc.has_key(idx) else "arg_%i" % idx)
|
||||
arg_elt.setAttribute('type', arg)
|
||||
arg_elt.setAttribute('direction', 'in' if function["type"]=='method' else 'out')
|
||||
new_elt.appendChild(arg_elt)
|
||||
idx+=1
|
||||
|
||||
if function['sig_out']:
|
||||
arg_elt = doc.createElement('arg')
|
||||
arg_elt.setAttribute('type', function['sig_out'])
|
||||
arg_elt.setAttribute('direction', 'out')
|
||||
new_elt.appendChild(arg_elt)
|
||||
|
||||
interface_elt.appendChild(new_elt)
|
||||
|
||||
#now we write to final file
|
||||
self.finalWrite(self.core_dest, [doc.toprettyxml()])
|
||||
|
||||
class ConstructorError(Exception):
|
||||
pass
|
||||
|
|
@ -472,6 +534,8 @@ class ConstructorFactory:
|
|||
return DbusConstructor(bridge_template, options)
|
||||
elif options.protocole=='mediawiki':
|
||||
return MediawikiConstructor(bridge_template, options)
|
||||
elif options.protocole=='dbus-xml':
|
||||
return DbusXmlConstructor(bridge_template, options)
|
||||
|
||||
raise ConstructorError('Unknown constructor type')
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue