|
Packit Service |
c6b9b0 |
#!/usr/bin/python
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
# manager-file.py: generate .manager files and TpCMParamSpec arrays from the
|
|
Packit Service |
c6b9b0 |
# same data (should be suitable for all connection managers that don't have
|
|
Packit Service |
c6b9b0 |
# plugins)
|
|
Packit Service |
c6b9b0 |
#
|
|
Packit Service |
c6b9b0 |
# The master copy of this program is in the telepathy-glib repository -
|
|
Packit Service |
c6b9b0 |
# please make any changes there.
|
|
Packit Service |
c6b9b0 |
#
|
|
Packit Service |
c6b9b0 |
# Copyright (c) Collabora Ltd. <http://www.collabora.co.uk/>
|
|
Packit Service |
c6b9b0 |
#
|
|
Packit Service |
c6b9b0 |
# This library is free software; you can redistribute it and/or
|
|
Packit Service |
c6b9b0 |
# modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
c6b9b0 |
# License as published by the Free Software Foundation; either
|
|
Packit Service |
c6b9b0 |
# version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
c6b9b0 |
#
|
|
Packit Service |
c6b9b0 |
# This library is distributed in the hope that it will be useful,
|
|
Packit Service |
c6b9b0 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c6b9b0 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
c6b9b0 |
# Lesser General Public License for more details.
|
|
Packit Service |
c6b9b0 |
#
|
|
Packit Service |
c6b9b0 |
# You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
c6b9b0 |
# License along with this library; if not, write to the Free Software
|
|
Packit Service |
c6b9b0 |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
import re
|
|
Packit Service |
c6b9b0 |
import sys
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
_NOT_C_STR = re.compile(r'[^A-Za-z0-9_-]')
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
def c_string(x):
|
|
Packit Service |
c6b9b0 |
# whitelist-based brute force and ignorance - escape nearly all punctuation
|
|
Packit Service |
c6b9b0 |
return '"' + _NOT_C_STR.sub(lambda c: r'\x%02x' % ord(c), x) + '"'
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
def desktop_string(x):
|
|
Packit Service |
c6b9b0 |
return x.replace(' ', r'\s').replace('\n', r'\n').replace('\r', r'\r').replace('\t', r'\t')
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
supported = list('sbuiqn')
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
fdefaultencoders = {
|
|
Packit Service |
c6b9b0 |
's': desktop_string,
|
|
Packit Service |
c6b9b0 |
'b': (lambda b: b and '1' or '0'),
|
|
Packit Service |
c6b9b0 |
'u': (lambda n: '%u' % n),
|
|
Packit Service |
c6b9b0 |
'i': (lambda n: '%d' % n),
|
|
Packit Service |
c6b9b0 |
'q': (lambda n: '%u' % n),
|
|
Packit Service |
c6b9b0 |
'n': (lambda n: '%d' % n),
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
for x in supported: assert x in fdefaultencoders
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gtypes = {
|
|
Packit Service |
c6b9b0 |
's': 'G_TYPE_STRING',
|
|
Packit Service |
c6b9b0 |
'b': 'G_TYPE_BOOLEAN',
|
|
Packit Service |
c6b9b0 |
'u': 'G_TYPE_UINT',
|
|
Packit Service |
c6b9b0 |
'i': 'G_TYPE_INT',
|
|
Packit Service |
c6b9b0 |
'q': 'G_TYPE_UINT',
|
|
Packit Service |
c6b9b0 |
'n': 'G_TYPE_INT',
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
for x in supported: assert x in gtypes
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gdefaultencoders = {
|
|
Packit Service |
c6b9b0 |
's': c_string,
|
|
Packit Service |
c6b9b0 |
'b': (lambda b: b and 'GINT_TO_POINTER (TRUE)' or 'GINT_TO_POINTER (FALSE)'),
|
|
Packit Service |
c6b9b0 |
'u': (lambda n: 'GUINT_TO_POINTER (%u)' % n),
|
|
Packit Service |
c6b9b0 |
'i': (lambda n: 'GINT_TO_POINTER (%d)' % n),
|
|
Packit Service |
c6b9b0 |
'q': (lambda n: 'GUINT_TO_POINTER (%u)' % n),
|
|
Packit Service |
c6b9b0 |
'n': (lambda n: 'GINT_TO_POINTER (%d)' % n),
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
for x in supported: assert x in gdefaultencoders
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gdefaultdefaults = {
|
|
Packit Service |
c6b9b0 |
's': 'NULL',
|
|
Packit Service |
c6b9b0 |
'b': 'GINT_TO_POINTER (FALSE)',
|
|
Packit Service |
c6b9b0 |
'u': 'GUINT_TO_POINTER (0)',
|
|
Packit Service |
c6b9b0 |
'i': 'GINT_TO_POINTER (0)',
|
|
Packit Service |
c6b9b0 |
'q': 'GUINT_TO_POINTER (0)',
|
|
Packit Service |
c6b9b0 |
'n': 'GINT_TO_POINTER (0)',
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
for x in supported: assert x in gdefaultdefaults
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
gflags = {
|
|
Packit Service |
c6b9b0 |
'has-default': 'TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT',
|
|
Packit Service |
c6b9b0 |
'register': 'TP_CONN_MGR_PARAM_FLAG_REGISTER',
|
|
Packit Service |
c6b9b0 |
'required': 'TP_CONN_MGR_PARAM_FLAG_REQUIRED',
|
|
Packit Service |
c6b9b0 |
'secret': 'TP_CONN_MGR_PARAM_FLAG_SECRET',
|
|
Packit Service |
c6b9b0 |
'dbus-property': 'TP_CONN_MGR_PARAM_FLAG_DBUS_PROPERTY',
|
|
Packit Service |
c6b9b0 |
}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
def write_manager(f, manager, protos):
|
|
Packit Service |
c6b9b0 |
# pointless backwards compat section
|
|
Packit Service |
c6b9b0 |
print >> f, '[ConnectionManager]'
|
|
Packit Service |
c6b9b0 |
print >> f, 'BusName=org.freedesktop.Telepathy.ConnectionManager.' + manager
|
|
Packit Service |
c6b9b0 |
print >> f, 'ObjectPath=/org/freedesktop/Telepathy/ConnectionManager/' + manager
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
# protocols
|
|
Packit Service |
c6b9b0 |
for proto, params in protos.iteritems():
|
|
Packit Service |
c6b9b0 |
print >> f
|
|
Packit Service |
c6b9b0 |
print >> f, '[Protocol %s]' % proto
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
defaults = {}
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
for param, info in params.iteritems():
|
|
Packit Service |
c6b9b0 |
dtype = info['dtype']
|
|
Packit Service |
c6b9b0 |
flags = info.get('flags', '').split()
|
|
Packit Service |
c6b9b0 |
struct_field = info.get('struct_field', param.replace('-', '_'))
|
|
Packit Service |
c6b9b0 |
filter = info.get('filter', 'NULL')
|
|
Packit Service |
c6b9b0 |
filter_data = info.get('filter_data', 'NULL')
|
|
Packit Service |
c6b9b0 |
setter_data = 'NULL'
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if 'default' in info:
|
|
Packit Service |
c6b9b0 |
default = fdefaultencoders[dtype](info['default'])
|
|
Packit Service |
c6b9b0 |
defaults[param] = default
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if flags:
|
|
Packit Service |
c6b9b0 |
flags = ' ' + ' '.join(flags)
|
|
Packit Service |
c6b9b0 |
else:
|
|
Packit Service |
c6b9b0 |
flags = ''
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
print >> f, 'param-%s=%s%s' % (param, desktop_string(dtype), flags)
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
for param, default in defaults.iteritems():
|
|
Packit Service |
c6b9b0 |
print >> f, 'default-%s=%s' % (param, default)
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
def write_c_params(f, manager, proto, struct, params):
|
|
Packit Service |
c6b9b0 |
print >> f, "static const TpCMParamSpec %s_%s_params[] = {" % (manager, proto)
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
for param, info in params.iteritems():
|
|
Packit Service |
c6b9b0 |
dtype = info['dtype']
|
|
Packit Service |
c6b9b0 |
flags = info.get('flags', '').split()
|
|
Packit Service |
c6b9b0 |
struct_field = info.get('struct_field', param.replace('-', '_'))
|
|
Packit Service |
c6b9b0 |
filter = info.get('filter', 'NULL')
|
|
Packit Service |
c6b9b0 |
filter_data = info.get('filter_data', 'NULL')
|
|
Packit Service |
c6b9b0 |
setter_data = 'NULL'
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if 'default' in info:
|
|
Packit Service |
c6b9b0 |
default = gdefaultencoders[dtype](info['default'])
|
|
Packit Service |
c6b9b0 |
else:
|
|
Packit Service |
c6b9b0 |
default = gdefaultdefaults[dtype]
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if flags:
|
|
Packit Service |
c6b9b0 |
flags = ' | '.join([gflags[flag] for flag in flags])
|
|
Packit Service |
c6b9b0 |
else:
|
|
Packit Service |
c6b9b0 |
flags = '0'
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if struct is None or struct_field is None:
|
|
Packit Service |
c6b9b0 |
struct_offset = '0'
|
|
Packit Service |
c6b9b0 |
else:
|
|
Packit Service |
c6b9b0 |
struct_offset = 'G_STRUCT_OFFSET (%s, %s)' % (struct, struct_field)
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
print >> f, (''' { %s, %s, %s,
|
|
Packit Service |
c6b9b0 |
%s,
|
|
Packit Service |
c6b9b0 |
%s, /* default */
|
|
Packit Service |
c6b9b0 |
%s, /* struct offset */
|
|
Packit Service |
c6b9b0 |
%s, /* filter */
|
|
Packit Service |
c6b9b0 |
%s, /* filter data */
|
|
Packit Service |
c6b9b0 |
%s /* setter data */ },''' %
|
|
Packit Service |
c6b9b0 |
(c_string(param), c_string(dtype), gtypes[dtype], flags,
|
|
Packit Service |
c6b9b0 |
default, struct_offset, filter, filter_data, setter_data))
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
print >> f, " { NULL }"
|
|
Packit Service |
c6b9b0 |
print >> f, "};"
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
if __name__ == '__main__':
|
|
Packit Service |
c6b9b0 |
environment = {}
|
|
Packit Service |
c6b9b0 |
execfile(sys.argv[1], environment)
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
filename = '%s/%s.manager' % (sys.argv[2], environment['MANAGER'])
|
|
Packit Service |
c6b9b0 |
try:
|
|
Packit Service |
c6b9b0 |
os.remove(filename)
|
|
Packit Service |
c6b9b0 |
except OSError:
|
|
Packit Service |
c6b9b0 |
pass
|
|
Packit Service |
c6b9b0 |
f = open(filename + '.tmp', 'w')
|
|
Packit Service |
c6b9b0 |
write_manager(f, environment['MANAGER'], environment['PARAMS'])
|
|
Packit Service |
c6b9b0 |
f.close()
|
|
Packit Service |
c6b9b0 |
os.rename(filename + '.tmp', filename)
|
|
Packit Service |
c6b9b0 |
|
|
Packit Service |
c6b9b0 |
filename = '%s/param-spec-struct.h' % sys.argv[2]
|
|
Packit Service |
c6b9b0 |
try:
|
|
Packit Service |
c6b9b0 |
os.remove(filename)
|
|
Packit Service |
c6b9b0 |
except OSError:
|
|
Packit Service |
c6b9b0 |
pass
|
|
Packit Service |
c6b9b0 |
f = open(filename + '.tmp', 'w')
|
|
Packit Service |
c6b9b0 |
for protocol in environment['PARAMS']:
|
|
Packit Service |
c6b9b0 |
write_c_params(f, environment['MANAGER'], protocol,
|
|
Packit Service |
c6b9b0 |
environment['STRUCTS'][protocol],
|
|
Packit Service |
c6b9b0 |
environment['PARAMS'][protocol])
|
|
Packit Service |
c6b9b0 |
f.close()
|
|
Packit Service |
c6b9b0 |
os.rename(filename + '.tmp', filename)
|