summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-02-04 22:24:06 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-02-04 22:24:06 +0000
commit7808c4cffaa5ae606186149d9434380b52e89e7c (patch)
treee7b2fc0834a5f22b9bfac4539ace162117c23ce6
parente6a07df2bc362d57a422216a4af834d980b1b2d7 (diff)
downloadlasso-7808c4cffaa5ae606186149d9434380b52e89e7c.tar.gz
lasso-7808c4cffaa5ae606186149d9434380b52e89e7c.tar.xz
lasso-7808c4cffaa5ae606186149d9434380b52e89e7c.zip
Bindings: restore ID-WSF constants, improve python getters,
* bindings/bindings.py: parse idwsf_strings.h to get ID-WSF constants. * bindings/utils.py: add an is_rc check function, to check for 'error code' return type. * bindings/perl/lang.py: only raise errors for 'int' or 'gint' return type * bindings/python/lang.py: - always create a normal function binding. - for functions starting with 'get' try to create a corresponding property, but if a corresponding member already exists, fails, and print a warning about getter function/member field clash. - make type dispatching on return_type more explicite.
-rw-r--r--bindings/bindings.py31
-rw-r--r--bindings/perl/lang.py2
-rw-r--r--bindings/python/lang.py142
-rw-r--r--bindings/utils.py3
4 files changed, 89 insertions, 89 deletions
diff --git a/bindings/bindings.py b/bindings/bindings.py
index 5337665b..1d45e47a 100644
--- a/bindings/bindings.py
+++ b/bindings/bindings.py
@@ -197,6 +197,20 @@ class Struct:
for m in self.methods:
print ' ', m
+ def getMember(self, name):
+ l = [m for m in self.members if arg_name(m) == name]
+ if l:
+ return l[0]
+ else:
+ return None
+
+ def getMethod(self, name):
+ l = [m for m in self.methods if m.name == name]
+ if l:
+ return l[0]
+ else:
+ return None
+
toskip = None
@@ -422,14 +436,15 @@ def parse_header(header_file):
elif line.startswith('#define'):
m = re.match(r'#define\s+([a-zA-Z0-9_]+)\s+[-\w"]', line)
if m:
- constant = m.group(1)
- if constant[0] != '_':
+ constant_name = m.group(1)
+ if constant_name[0] != '_':
# ignore private constants
if '"' in line:
constant_type = 's'
else:
constant_type = 'i'
- binding.constants.append((constant_type, constant))
+ constant = (constant_type, constant_name)
+ binding.constants.append(constant)
elif line.startswith('typedef enum {'):
in_enum = True
elif line.startswith('typedef struct'):
@@ -534,6 +549,11 @@ def parse_headers(srcdir):
srcdir = os.path.abspath(srcdir)
parentdir = os.path.dirname(srcdir)
+ exclusion = ('xml_idff.h', 'xml_idwsf.h', 'xml_saml2.h', \
+ 'xml_idwsf2.h', 'xml_soap11.h',
+ 'lasso_config.h' )
+ if not binding.options.idwsf:
+ exclusion += 'idwsf_strings.h'
for base, dirnames, filenames in os.walk(srcdir):
if base.endswith('/.svn'):
# ignore svn directories
@@ -547,11 +567,6 @@ def parse_headers(srcdir):
continue
makefile_am = open(os.path.join(base, 'Makefile.am')).read()
filenames = [x for x in filenames if x.endswith('.h') if x in makefile_am]
- exclusion = ('xml_idff.h', 'xml_idwsf.h', 'xml_saml2.h', \
- 'xml_idwsf2.h', 'xml_soap11.h',
- 'lasso_config.h')
- if binding.options.idwsf:
- exclusion += ('idwsf_strings.h',)
for filename in filenames:
if filename in exclusion:
continue
diff --git a/bindings/perl/lang.py b/bindings/perl/lang.py
index 9c5604de..ee5f9f80 100644
--- a/bindings/perl/lang.py
+++ b/bindings/perl/lang.py
@@ -336,7 +336,7 @@ INCLUDE: LassoNode.xs
cleanup.append('lasso_unref(RETVAL);')
elif func.return_type and is_object(func.return_type) and not is_int(func.return_type, self.binding_data) and func.return_owner:
cleanup.append('lasso_unref(RETVAL);')
- elif is_int(func.return_arg, self.binding_data):
+ elif is_rc(func.return_arg):
if name == 'lasso_check_version':
cleanup.append('if (RETVAL != 1)')
cleanup.append('gperl_lasso_error(RETVAL);')
diff --git a/bindings/python/lang.py b/bindings/python/lang.py
index 559444d0..c930ec92 100644
--- a/bindings/python/lang.py
+++ b/bindings/python/lang.py
@@ -228,7 +228,6 @@ NodeList = list
StringList = list
StringDict = dict
registerIdWsf2DstService = registerIdwsf2DstService
-Provider.setEncryptionMode = Provider.set_encryptionMode
if WSF_SUPPORT:
DiscoDescription_newWithBriefSoapHttpDescription = DiscoDescription.newWithBriefSoapHttpDescription
@@ -275,13 +274,13 @@ if WSF_SUPPORT:
c_args = []
py_args = []
for o in m.args:
- type, arg_name, arg_options = o
+ type, aname, arg_options = o
py_args.append(get_python_arg_decl(o))
if self.is_pygobject(type):
- c_args.append('%s and %s._cptr' % (arg_name, arg_name))
+ c_args.append('%s and %s._cptr' % (aname, aname))
else:
- c_args.append(arg_name)
+ c_args.append(aname)
c_args = ', '.join(c_args)
py_args = ', ' + ', '.join(py_args)
@@ -300,13 +299,13 @@ if WSF_SUPPORT:
c_args = []
py_args = []
for o in m.args:
- type, arg_name, arg_options = o
+ type, aname, arg_options = o
py_args.append(get_python_arg_decl(o))
if self.is_pygobject(type):
- c_args.append('%s and %s._cptr' % (arg_name, arg_name))
+ c_args.append('%s and %s._cptr' % (aname, aname))
else:
- c_args.append(arg_name)
+ c_args.append(aname)
c_args = ', '.join(c_args)
py_args = ', ' + ', '.join(py_args)
print >> fd, ' @classmethod'
@@ -382,55 +381,6 @@ if WSF_SUPPORT:
print >> fd, ''
# first pass on methods, getting accessors
- for m in clss.methods:
- if not ('_get_' in m.name and len(m.args) == 1):
- continue
- methods.remove(m)
- try:
- setter_name = m.name.replace('_get_', '_set_')
- setter = [x for x in methods if x.name == setter_name][0]
- methods.remove(setter)
- except IndexError:
- setter = None
- if m.rename:
- mname = m.rename
- if mname.startswith('lasso_'):
- mname = mname[6:]
- mname = '%s%s' % (mname[0].lower(), mname[1:])
- print >> fd, ' def get_%s(self):' % mname
- function_name = m.rename
- if function_name.startswith('lasso_'):
- function_name = function_name[6:]
- else:
- mname = m.name
- try:
- mname = re.match(r'lasso_.*_get_(\w+)', mname).group(1)
- except:
- raise
- mname = format_underscore_as_camelcase(mname)
- print >> fd, ' def get_%s(self):' % mname
- function_name = m.name[6:]
-
- if is_object(m.return_arg):
- print >> fd, ' t = _lasso.%s(self._cptr)' % function_name
- print >> fd, ' return cptrToPy(t)'
- else:
- print >> fd, ' return _lasso.%s(self._cptr)' % function_name
-
- if mname[0] == mname[0].lower() and not m.rename:
- # API compatibility with SWIG bindings which didn't have
- # accessors for those methods and used totally pythonified
- # method name instead, such as getNextProviderId
- print >> fd, ' get%s%s = get_%s' % (
- mname[0].upper(), mname[1:], mname)
- if setter:
- print >> fd, ' def set_%s(self, value):' % mname
- print >> fd, ' _lasso.%s(self._cptr, value)' % setter.name[6:]
- print >> fd, ' %s = property(get_%s, set_%s)' % (mname, mname, mname)
- else:
- print >> fd, ' %s = property(get_%s)' % (mname, mname)
- print >> fd, ''
-
# second pass on methods, real methods
for m in methods:
if m.name.endswith('_new') or m.name.endswith('_new_from_dump') or \
@@ -450,20 +400,20 @@ if WSF_SUPPORT:
c_args = []
outarg = None
for o in m.args[1:]:
- type, arg_name, arg_options = o
+ type, aname, arg_options = o
if is_out(o):
assert not outarg
outarg = o
- outvar = '_%s_out' % arg_name
+ outvar = '_%s_out' % aname
else:
py_args.append(get_python_arg_decl(o))
if is_out(o):
c_args.append(outvar)
elif not self.is_pygobject(type):
- c_args.append(arg_name)
+ c_args.append(aname)
else:
- c_args.append('%s and %s._cptr' % (arg_name, arg_name))
+ c_args.append('%s and %s._cptr' % (aname, aname))
# check py_args
opt = False
for x in py_args:
@@ -493,29 +443,61 @@ if WSF_SUPPORT:
return_type = m.return_type
return_type_qualifier = m.return_type_qualifier
assert is_int(make_arg(return_type),self.binding_data) or not outarg
- if return_type in ('gint', 'int'):
+ if return_type in (None, 'void'):
+ print >> fd, ' _lasso.%s(self._cptr%s)' % (
+ function_name, c_args)
+ elif is_rc(m.return_arg):
print >> fd, ' rc = _lasso.%s(self._cptr%s)' % (
function_name, c_args)
print >> fd, ' if rc != 0:'
print >> fd, ' raise Error.raise_on_rc(rc)'
- elif return_type in (None, 'void'):
- print >> fd, ' _lasso.%s(self._cptr%s)' % (
- function_name, c_args)
- elif return_type == 'GList*' and self.is_pygobject(return_type_qualifier):
- print >> fd, ' value = _lasso.%s(self._cptr%s)' % (
+ elif is_int(m.return_arg, self.binding_data) or is_xml_node(m.return_arg) or is_cstring(m.return_arg) or is_boolean(m.return_arg):
+ print >> fd, ' return _lasso.%s(self._cptr%s)' % (
function_name, c_args)
- print >> fd, ' if value is not None:'
- print >> fd, ' value = tuple([cptrToPy(x) for x in value])'
- print >> fd, ' return value'
+ elif is_glist(m.return_arg):
+ el_type = element_type(m.return_arg)
+ if is_object(el_type):
+ print >> fd, ' value = _lasso.%s(self._cptr%s)' % (
+ function_name, c_args)
+ print >> fd, ' if value is not None:'
+ print >> fd, ' value = tuple([cptrToPy(x) for x in value])'
+ print >> fd, ' return value'
+ elif is_cstring(el_type):
+ print >> fd, ' return _lasso.%s(self._cptr%s)' % (
+ function_name, c_args)
+ else:
+ raise Exception('Return Type GList<%s> is not supported' % el_type)
+ elif is_hashtable(m.return_arg):
+ raise Exception('Return type GHashTable unsupported')
elif is_object(m.return_arg):
print >> fd, ' return cptrToPy(_lasso.%s(self._cptr%s))' % (
function_name, c_args)
else:
- print >> fd, ' return _lasso.%s(self._cptr%s)' % (
- function_name, c_args)
+ raise Exception('Return type %s is unsupported' % (m.return_arg,))
if outarg:
print >> fd, ' return %s[0]' % outvar
print >> fd, ''
+ # transform methods to properties
+ for m in methods:
+ name = m.rename or m.name
+ suffix = name[len(method_prefix)+len('get_'):]
+ if clss.getMember(suffix):
+ print >>sys.stderr, 'W: method %s and member %s clashes' % (m.name, arg_name(clss.getMember(suffix)))
+ continue
+ if not name.startswith(method_prefix) or not name[len(method_prefix):].startswith('get_'):
+ continue
+ setter_suffix = 'set_' + suffix
+ setter = None
+ for n in methods:
+ if n.name.endswith(setter_suffix):
+ setter = n
+ pname = format_as_camelcase(name[len(method_prefix)+len('get_'):])
+ fname = format_as_camelcase(name[len(method_prefix):])
+ if not setter:
+ print >> fd, ' %s = property(%s)' % (pname, fname)
+ else:
+ f2name = format_as_camelcase(setter.name[len(method_prefix):])
+ print >> fd, ' %s = property(%s, %s)' % (pname, fname, f2name)
print >> fd, ''
@@ -847,7 +829,7 @@ register_constants(PyObject *d)
parse_tuple_format = []
parse_tuple_args = []
for arg in m.args:
- arg_type, arg_name, arg_options = arg
+ arg_type, aname, arg_options = arg
arg_def = None
python_cvt_def = None
defval = None
@@ -860,11 +842,11 @@ register_constants(PyObject *d)
parse_tuple_format.append('z')
else:
parse_tuple_format.append('s')
- parse_tuple_args.append('&%s' % arg_name)
+ parse_tuple_args.append('&%s' % aname)
arg_def = ' %s %s = NULL;' % (arg[0], arg[1])
elif arg_type in ['GType', 'int', 'gint', 'gboolean', 'const gboolean', 'time_t'] + self.binding_data.enums:
parse_tuple_format.append('i')
- parse_tuple_args.append('&%s' % arg_name)
+ parse_tuple_args.append('&%s' % aname)
if arg_options.get('default'):
defval = arg_options.get('default')
if defval.startswith('b:'):
@@ -876,21 +858,21 @@ register_constants(PyObject *d)
arg_def = ' %s %s;' % (arg[0], arg[1])
elif is_xml_node(arg) or is_list(arg) or is_time_t_pointer(arg):
parse_tuple_format.append('O')
- parse_tuple_args.append('&cvt_%s' % arg_name)
+ parse_tuple_args.append('&cvt_%s' % aname)
arg_def = ' %s %s = NULL;' % (arg[0], arg[1])
- python_cvt_def = ' PyObject *cvt_%s = NULL;' % arg_name
+ python_cvt_def = ' PyObject *cvt_%s = NULL;' % aname
else:
parse_tuple_format.append('O')
- parse_tuple_args.append('&cvt_%s' % arg_name)
+ parse_tuple_args.append('&cvt_%s' % aname)
arg_def = ' %s %s = NULL;' % (arg[0], arg[1])
- python_cvt_def = ' PyGObjectPtr *cvt_%s = NULL;' % arg_name
+ python_cvt_def = ' PyGObjectPtr *cvt_%s = NULL;' % aname
if is_out(arg):
arg_def = ' %s %s = NULL;' % (var_type(arg), arg[1])
parse_tuple_format.pop()
parse_tuple_format.append('O')
parse_tuple_args.pop()
- parse_tuple_args.append('&cvt_%s_out' % arg_name)
- python_cvt_def = ' PyObject *cvt_%s_out = NULL;' % arg_name
+ parse_tuple_args.append('&cvt_%s_out' % aname)
+ python_cvt_def = ' PyObject *cvt_%s_out = NULL;' % aname
print >> fd, ' PyObject *out_pyvalue = NULL;'
print >> fd, arg_def
if python_cvt_def:
diff --git a/bindings/utils.py b/bindings/utils.py
index 50a6314c..7cbfdc89 100644
--- a/bindings/utils.py
+++ b/bindings/utils.py
@@ -207,6 +207,9 @@ def unpointerize(arg):
def is_list(arg):
return unconstify(arg_type(arg)).startswith('GList')
+def is_rc(arg):
+ return arg_type(arg) in [ 'int', 'gint' ]
+
def is_int(arg, binding_data):
return arg_type(arg) in [ 'time_t', 'int', 'gint', 'long', 'glong'] + binding_data.enums