5
from string import ascii_letters, digits
8
from libglibcodegen import Signature, type_to_gtype, cmp_by_name
11
NS_TP = "http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"
13
class Generator(object):
15
def __init__(self, dom):
19
def do_signal(self, node_name, iface, signal):
23
for i in signal.getElementsByTagName('arg'):
24
name = i.getAttribute('name')
25
type = i.getAttribute('type')
26
info = type_to_gtype(type)
27
# type, GType, STRING, is a pointer
30
if info[1] == 'DBUS_TYPE_G_OBJECT_PATH':
31
# should really be BOXED, but libtelepathy has historically
32
# used OBJECT, and if we're being pedantic, the marshaller
33
# stuff is part of the ABI. The choice doesn't really matter
34
# since in the calling convention they're both pointers.
35
# FIXME: remove this when libtelepathy merges into tp-glib
37
marshaller_items.append(marshaller)
40
if marshaller == 'BOXED':
41
# dbus-glib uses the fundamental type anyway, so all BOXED
42
# subtypes are equivalent
43
gtype = 'G_TYPE_BOXED'
46
prefix = 'tp_ifaces_signals_marshal'
48
if (len(marshaller_items) in (0, 1)
49
or marshaller_items == ['UINT', 'POINTER']):
50
# GLib has built-in marshallers for these
51
prefix = 'g_cclosure_marshal'
52
elif node_name == '/Connection':
53
prefix = 'tp_conn_signals_marshal'
54
elif node_name == '/Channel':
55
prefix = 'tp_chan_signals_marshal'
56
elif node_name == '/Connection_Manager':
57
prefix = 'tp_connmgr_signals_marshal'
59
print "/* %s: %s */ \\" % (node_name, signal.getAttribute('name'))
60
print "dbus_g_object_register_marshaller ( \\"
61
print (" %s_VOID__" % prefix
62
+ '_'.join((marshaller_items or ['VOID'])) + ', \\')
63
print ' G_TYPE_NONE, \\'
65
print ' ' + gtype + ', \\'
66
print ' G_TYPE_INVALID); \\'
69
ifaces = self.dom.getElementsByTagName('node')
70
ifaces.sort(cmp_by_name)
73
self.do_interface(iface)
75
print '#define REGISTER_ALL_MARSHALLERS G_STMT_START {\\'
76
for macro in self.macros:
77
print '%s; \\' % macro
80
def do_interface(self, node):
81
ifaces = node.getElementsByTagName('interface')
82
assert len(ifaces) == 1
84
name = node.getAttribute('name')
85
self.macros.append('REGISTER_MARSHALLERS_FOR_%s'
86
% name.replace('/', '').upper())
87
print ('#define REGISTER_MARSHALLERS_FOR_%s \\'
88
% name.replace('/', '').upper())
89
print 'G_STMT_START { \\'
90
signals = iface.getElementsByTagName('signal')
91
signals.sort(cmp_by_name)
93
for signal in signals:
94
self.do_signal(name, iface, signal)
100
def types_to_gtypes(types):
101
return [type_to_gtype(t)[1] for t in types]
103
if __name__ == '__main__':
105
dom = xml.dom.minidom.parse(argv[0])