#!/usr/bin/python # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals from optparse import OptionParser, make_option import os import sys import uuid import dbus import dbus.service import dbus.mainloop.glib try: from gi.repository import GObject except ImportError: import gobject as GObject class Profile(dbus.service.Object): fd = -1 @dbus.service.method("org.bluez.Profile1", in_signature="", out_signature="") def Release(self): print("Release") mainloop.quit() @dbus.service.method("org.bluez.Profile1", in_signature="", out_signature="") def Cancel(self): print("Cancel") @dbus.service.method("org.bluez.Profile1", in_signature="oha{sv}", out_signature="") def NewConnection(self, path, fd, properties): self.fd = fd.take() print("NewConnection(%s, %d)" % (path, self.fd)) for key in properties.keys(): if key == "Version" or key == "Features": print(" %s = 0x%04x" % (key, properties[key])) else: print(" %s = %s" % (key, properties[key])) @dbus.service.method("org.bluez.Profile1", in_signature="o", out_signature="") def RequestDisconnection(self, path): print("RequestDisconnection(%s)" % (path)) if (self.fd > 0): os.close(self.fd) self.fd = -1 if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() manager = dbus.Interface(bus.get_object("org.bluez", "/org/bluez"), "org.bluez.ProfileManager1") option_list = [ make_option("-u", "--uuid", action="store", type="string", dest="uuid", default=None), make_option("-p", "--path", action="store", type="string", dest="path", default="/foo/bar/profile"), make_option("-n", "--name", action="store", type="string", dest="name", default=None), make_option("-s", "--server", action="store_const", const="server", dest="role"), make_option("-c", "--client", action="store_const", const="client", dest="role"), make_option("-a", "--auto-connect", action="store_true", dest="auto_connect", default=False), make_option("-P", "--PSM", action="store", type="int", dest="psm", default=None), make_option("-C", "--channel", action="store", type="int", dest="channel", default=None), make_option("-r", "--record", action="store", type="string", dest="record", default=None), make_option("-S", "--service", action="store", type="string", dest="service", default=None), ] parser = OptionParser(option_list=option_list) (options, args) = parser.parse_args() profile = Profile(bus, options.path) mainloop = GObject.MainLoop() opts = { "AutoConnect" : options.auto_connect, } if (options.name): opts["Name"] = options.name if (options.role): opts["Role"] = options.role if (options.psm is not None): opts["PSM"] = dbus.UInt16(options.psm) if (options.channel is not None): opts["Channel"] = dbus.UInt16(options.channel) if (options.record): opts["ServiceRecord"] = options.record if (options.service): opts["Service"] = options.service if not options.uuid: options.uuid = str(uuid.uuid4()) manager.RegisterProfile(options.path, options.uuid, opts) mainloop.run()