libpurple/dbus-analyze-signals.py

Wed, 20 Jun 2018 02:13:44 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Wed, 20 Jun 2018 02:13:44 -0400
changeset 39181
f0cd633d86d4
parent 38358
30ba44276e74
permissions
-rw-r--r--

prefs: Add binding versions of pref widget functions.

These just bind settings to existing widgets and copy the saved value to
the widget, except for combos which are produced from runtime lists.
Those are populated in a similar way as before.

There are some extra _bind_ words that will probably be dropped once the
other functions are unused.

# This program takes a C source as the input and produces the list of
# all signals registered.
#
# Output is:
#   <signal name="Changed">
#       <arg name="new_value" type="b"/>
#   </signal>
from __future__ import absolute_import, division, print_function

import argparse
import fileinput
import re
import sys


# List "excluded" contains signals that shouldn't be exported via
# DBus.  If you remove a signal from this list, please make sure
# that it does not break "make" with the configure option
# "--enable-dbus" turned on.

excluded = [
    # purple_dbus_signal_emit_purple prevents our "dbus-method-called"
    # signal from being propagated to dbus.
    "dbus-method-called",
]

registerregex = re.compile(
    "purple_signal_register[^;]+\"([\w\-]+)\"[^;]+(purple_marshal_\w+)[^;]+;")
nameregex = re.compile('[-_][a-z]')

parser = argparse.ArgumentParser()
parser.add_argument('input', nargs='*',
                    help='Input files (or stdin if not specified)')
parser.add_argument('-o', '--output', type=argparse.FileType('w'),
                    help='Output to file instead of stdout')
cmd_args = parser.parse_args()

print("/* Generated by %s.  Do not edit! */" % (sys.argv[0], ),
      file=cmd_args.output)
print("const char *dbus_signals = ", file=cmd_args.output)
input = ''.join(list(fileinput.input(cmd_args.input)))
for match in registerregex.finditer(input):
    signal = match.group(1)
    marshal = match.group(2)
    if signal in excluded:
        continue

    signal = nameregex.sub(lambda x: x.group()[1].upper(), '-' + signal)
    print("\"    <signal name='%s'>\\n\"" % (signal, ), file=cmd_args.output)

    args = marshal.split('_')
    # ['purple', 'marshal', <return type>, '', args...]
    if len(args) > 4:
        for arg in args[4:]:
            if arg == "POINTER":
                type = 'p'
            elif arg == "ENUM":
                type = 'i'
            elif arg == "INT":
                type = 'i'
            elif arg == "UINT":
                type = 'u'
            elif arg == "INT64":
                type = 'x'
            elif arg == "UINT64":
                type = 't'
            elif arg == "BOOLEAN":
                type = 'b'
            print("\"      <arg type='%s'/>\\n\"" % (type, ),
                  file=cmd_args.output)

    print("\"    </signal>\\n\"", file=cmd_args.output)

print(";", file=cmd_args.output)

mercurial