libpurple/dbus-analyze-signals.py

Sun, 21 Aug 2016 05:32:19 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Sun, 21 Aug 2016 05:32:19 -0400
changeset 37936
65e477a02dd6
parent 33932
c49bfe98716d
child 37983
7d134a4a87b2
permissions
-rw-r--r--

Refactor DBus Python scripts to avoid redirection.

# 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 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