summaryrefslogtreecommitdiff
path: root/telepathy-inspect
blob: 640ed464dfa6d7cb0c2e1207f22add7248d17a57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/python

import sys

import dbus
import dbus.glib

import telepathy

bus = dbus.Bus()

def get_names():
    bus_obj = bus.get_object('org.freedesktop.DBus', '/')
    iface = dbus.Interface(bus_obj, 'org.freedesktop.DBus')
    return iface.ListNames()

def get_managers():
    return [
        name[len(telepathy.CONN_MGR_INTERFACE) + 1:]
        for name in get_names()
        if name.startswith(telepathy.CONN_MGR_INTERFACE)]

def get_parameters(name):
    full_name = '%s.%s' % (telepathy.CONN_MGR_INTERFACE, name)
    path = '/org/freedesktop/Telepathy/ConnectionManager/%s' % name
    bus_obj = bus.get_object(full_name, path)
    iface = dbus.Interface(bus_obj, telepathy.CONN_MGR_INTERFACE)

    stanzas = []
    stanza = []
    stanza.append('[ConnectionManager]')
    stanza.append('Name = %s' % name)
    stanza.append('BusName = %s' % full_name)
    stanza.append('ObjectPath = %s' % path)
    stanzas.append(stanza)

    for protocol in iface.ListProtocols():
        stanza = []
        stanza.append('[Protocol %s]' % protocol)

        for name, flags, sig, default in iface.GetParameters(protocol):
            decl = [sig]

            if flags & telepathy.CONN_MGR_PARAM_FLAG_REQUIRED:
                decl.append('required')

            if flags & telepathy.CONN_MGR_PARAM_FLAG_REGISTER:
                decl.append('register')

            stanza.append('param-%s = %s' % (name, ' '.join(decl)))

        stanzas.append(stanza)

    return ''.join(
        ''.join(line + '\n' for line in stanza)
        for stanza in stanzas)

def get_connections(name):
    full_name = '%s.%s' % (telepathy.CONN_INTERFACE, name)
    return [
        x[len(full_name) + 1:].split('.')
        for x in get_names()
        if x.startswith(full_name)]

def inspect_connection(manager, protocol, name):
    full_name = '.'.join((telepathy.CONN_INTERFACE, manager, protocol, name))
    conn_path = '/'.join((
        '/org/freedesktop/Telepathy/Connection', manager, protocol, name))
    bus_obj = bus.get_object(full_name, conn_path)
    iface = dbus.Interface(bus_obj, telepathy.CONN_INTERFACE)

    stanza = []
    stanza.append("Connection '%s'" % name)
    stanza.append("  Protocol: %s" % protocol)

    for path, type, handle_type, handle in iface.ListChannels():
        name = path[len(conn_path) + 1:]
        stanza.append("  Channel '%s'" % name)
        stanza.append("     Type: %s" % type)

    return ''.join(line + '\n' for line in stanza)

def inspect_manager(manager):
    stanzas = []

    for protocol, name in get_connections(manager):
        stanzas.append([inspect_connection(manager, protocol, name)])

    return ''.join(
        ''.join(line + '\n' for line in stanza)
        for stanza in stanzas)

def indent(n, s):
    return ''.join(' ' * n + line + '\n' for line in s.splitlines())

if __name__ == '__main__':
    if len(sys.argv) > 1:
        name = sys.argv[1]
        full_name = '%s.%s' % (telepathy.CONN_MGR_INTERFACE, name)

        if full_name not in get_names():
            raise RuntimeError("connection manager '%s' not found on the bus"
                % name)

        print get_parameters(name),
    else:
        managers = get_managers()

        if managers:
            print 'Found connection managers:'

            for manager in managers:
                print '  %s' % manager
                print indent(4, inspect_manager(manager))
        else:
            print 'No connection managers found'