diff --git a/tools/kete.py b/tools/kete.py index 2ba0011..ae4d31c 100755 --- a/tools/kete.py +++ b/tools/kete.py @@ -246,8 +246,17 @@ class TuhiKeteDevice(_DBusObject): raise e def start_live(self, fd): - self.proxy.StartLive('(h)', fd) - self.live = True + fd_list = Gio.UnixFDList.new() + fd_list.append(fd) + + res, fds = self.proxy.call_with_unix_fd_list_sync('org.freedesktop.tuhi1.Device.StartLive', + GLib.Variant('(h)', (fd,)), + Gio.DBusCallFlags.NO_AUTO_START, + -1, + fd_list, + None) + if res[0] == 0: + self.live = True def stop_live(self): self.proxy.StopLive() @@ -605,7 +614,7 @@ class LiveChanger(Worker): return logger.debug(f'{self.device}: starting live mode') - self.device.start_live(0) + self.device.start_live(-1) def stop(self): logger.debug(f'{self.device}: stopping live mode') diff --git a/tuhi/dbusserver.py b/tuhi/dbusserver.py index 38a5273..4582dec 100755 --- a/tuhi/dbusserver.py +++ b/tuhi/dbusserver.py @@ -78,8 +78,8 @@ INTROSPECTION_XML = ''' - - + + @@ -267,8 +267,7 @@ class TuhiDBusDevice(_TuhiDBus): self._stop_listening(connection, sender) invocation.return_value() elif methodname == 'StartLive': - self._start_live(connection, sender, args) - invocation.return_value() + self._start_live(connection, sender, args, invocation) elif methodname == 'StopLive': self._stop_live(connection, sender) invocation.return_value() @@ -375,7 +374,7 @@ class TuhiDBusDevice(_TuhiDBus): self.listening = False self.notify('listening') - def _start_live(self, connection, sender, args): + def _start_live(self, connection, sender, args, invocation): if self.live: logger.debug(f'{self} - already in live mode') @@ -397,8 +396,23 @@ class TuhiDBusDevice(_TuhiDBus): self._live_client = (sender, s) logger.debug(f'Live mode started on {self.name} for {sender}') + message = invocation.get_message() + fds_list = message.get_unix_fd_list() + + if fds_list is None or fds_list.get_length() != 1: + logger.error(f'uhid fds not provided') + result = GLib.Variant.new_int32(-errno.EINVAL) + invocation.return_value(GLib.Variant.new_tuple(result)) + return + + fds_list = fds_list.steal_fds() + + self._uhid_fd = fds_list[0] + self.live = True - self._uhid_fd = args[0] + + result = GLib.Variant.new_int32(0) + invocation.return_value(GLib.Variant.new_tuple(result)) def _stop_live(self, connection, sender, errno=0): if not self.live or sender != self._live_client[0]: