#!/usr/bin/env python3
import time

import dbus
import dbus.service
import dbus.mainloop.glib

from gi.repository import GObject as gobject
from gi.repository import GLib

class Service(dbus.service.Object):
    def __init__(self, message):
        self._message = message
        self.poke_ctr = 0

    def run(self):
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        bus_name = dbus.service.BusName("com.example.service", dbus.SystemBus())
        dbus.service.Object.__init__(self, bus_name, "/com/example/service")

        self._loop = gobject.MainLoop()
        print("Service running...")
        self._loop.run()
        print("Service stopped")

    @dbus.service.method("com.example.service.Message", in_signature='', out_signature='s')
    def get_message(self):
        print("  sending message")
        return self._message
        
    @dbus.service.method("com.example.service.Poke", in_signature='', out_signature='')
    def poke(self):
        print('Got a poke!')
        GLib.timeout_add(10, self.poke_runner)
        print('Post idle add')
    
    def poke_runner(self):
        self.poke_ctr += 1
        print('    Poke: {:d}'.format(self.poke_ctr))
        time.sleep(3)
        print('    Poke done')
        return False

    @dbus.service.method("com.example.service.Quit", in_signature='', out_signature='')
    def quit(self):
        print("  shutting down")
        self._loop.quit()

if __name__ == "__main__":
    Service("This is the service").run()
