diff --git a/deluge/src/core.py b/deluge/src/core.py index 6019f67c1..78d706f8d 100644 --- a/deluge/src/core.py +++ b/deluge/src/core.py @@ -33,6 +33,21 @@ import logging +try: + import dbus, dbus.service + dbus_version = getattr(dbus, "version", (0,0,0)) + if dbus_version >= (0,41,0) and dbus_version < (0,80,0): + import dbus.glib + elif dbus_version >= (0,80,0): + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + else: + pass +except: dbus_imported = False +else: dbus_imported = True + +import gobject + from deluge.config import Config import deluge.common @@ -42,11 +57,18 @@ log = logging.getLogger("deluge") DEFAULT_PREFS = { } -class Core: - def __init__(self): +class Core(dbus.service.Object): + def __init__(self, path="/org/deluge_torrent/Core"): log.debug("Core init..") - + bus_name = dbus.service.BusName("org.deluge_torrent.Deluge", + bus=dbus.SessionBus()) + dbus.service.Object.__init__(self, bus_name, path) self.config = Config("core.conf", DEFAULT_PREFS) - + log.debug("Starting main loop..") + loop = gobject.MainLoop() + loop.run() + + @dbus.service.method("org.deluge_torrent.Deluge") def test(self): print "test" + diff --git a/deluge/src/daemon.py b/deluge/src/daemon.py index 0a756a485..d21082ee2 100644 --- a/deluge/src/daemon.py +++ b/deluge/src/daemon.py @@ -30,11 +30,21 @@ # but you are not obligated to do so. If you do not wish to do so, delete # this exception statement from your version. If you delete this exception # statement from all source files in the program, then also delete it here. +try: + import dbus, dbus.service + dbus_version = getattr(dbus, "version", (0,0,0)) + if dbus_version >= (0,41,0) and dbus_version < (0,80,0): + import dbus.glib + elif dbus_version >= (0,80,0): + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + else: + pass +except: dbus_imported = False +else: dbus_imported = True import logging -import Pyro.core - from deluge.core import Core # Get the logger @@ -42,22 +52,15 @@ log = logging.getLogger("deluge") class Daemon: def __init__(self): - # Instantiate the Manager class - self.core = Core() - # Initialize the Pyro core and daemon - Pyro.core.initServer(banner=0) - log.debug("Pyro server initiliazed..") - self.daemon = Pyro.core.Daemon() - # Connect the Manager to the Pyro server - obj = Pyro.core.ObjBase() - obj.delegateTo(self.core) - self.uri = self.daemon.connect(obj, "core") - log.debug("uri: %s", self.uri) - - def start(self): - # Start the main loop for the pyro daemon - self.daemon.requestLoop() - - def get_uri(self): - # Return the URI for the Pyro server - return self.uri + # Check to see if the daemon is already running and if not, start it + bus = dbus.SessionBus() + obj = bus.get_object("org.freedesktop.DBus", "/org/freedesktop/DBus") + iface = dbus.Interface(obj, "org.freedesktop.DBus") + if iface.NameHasOwner("org.deluge_torrent.Deluge"): + # Daemon is running so lets tell the user + log.info("Daemon is already running..") + else: + # Daemon is not running so lets start up the core + log.debug("Daemon is not running..") + self.core = Core() + diff --git a/deluge/src/main.py b/deluge/src/main.py index 9f5110d6b..e0663ea4d 100644 --- a/deluge/src/main.py +++ b/deluge/src/main.py @@ -76,18 +76,19 @@ def main(): # Start the daemon if options.daemon: log.info("Starting daemon..") - daemon = Daemon() - uri = daemon.get_uri() # We need to fork() the process to run it in the background... # FIXME: We cannot use fork() on Windows pid = os.fork() if not pid: - daemon.start() + # Since we are starting daemon this process will not start a UI + options.ui = False + # Create the daemon object + daemon = Daemon() # Start the UI if options.ui: log.info("Starting ui..") - ui = Ui(uri) + ui = Ui() # Stop Deluge log.info ("Stopping Deluge..") diff --git a/deluge/src/ui.py b/deluge/src/ui.py index 1d16110a7..47d64a2a1 100644 --- a/deluge/src/ui.py +++ b/deluge/src/ui.py @@ -33,18 +33,31 @@ import logging -import Pyro.core +try: + import dbus, dbus.service + dbus_version = getattr(dbus, "version", (0,0,0)) + if dbus_version >= (0,41,0) and dbus_version < (0,80,0): + import dbus.glib + elif dbus_version >= (0,80,0): + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) + else: + pass +except: dbus_imported = False +else: dbus_imported = True # Get the logger log = logging.getLogger("deluge") class Ui: - def __init__(self, core_uri): + def __init__(self): log.debug("Ui init..") - log.debug("core_uri: %s", core_uri) - # Get the core manager from the Pyro server - if core_uri != None: - self.core = Pyro.core.getProxyForURI(core_uri) - # Test - self.core.test() - + log.debug("Getting core proxy object from DBUS..") + # Get the proxy object from DBUS + bus = dbus.SessionBus() + proxy = bus.get_object("org.deluge_torrent.Deluge", + "/org/deluge_torrent/Core") + self.core = dbus.Interface(proxy, "org.deluge_torrent.Deluge") + log.debug("Got core proxy object..") + # Test the interface.. this calls test() in Core + self.core.test() diff --git a/setup.py b/setup.py index 7a27d2ee0..1391ae213 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ import glob python_version = platform.python_version()[0:3] # The libtorrent extension -__extra_compile_args = [ +_extra_compile_args = [ "-Wno-missing-braces", "-DHAVE_INCLUDE_LIBTORRENT_ASIO____ASIO_HPP=1", "-DHAVE_INCLUDE_LIBTORRENT_ASIO_SSL_STREAM_HPP=1", @@ -48,14 +48,14 @@ __extra_compile_args = [ "-DHAVE_SSL=1" ] -__include_dirs = [ +_include_dirs = [ './libtorrent', './libtorrent/include', './libtorrent/include/libtorrent', '/usr/include/python' + python_version ] -__libraries = [ +_libraries = [ 'boost_filesystem', 'boost_date_time', 'boost_thread', @@ -64,26 +64,25 @@ __libraries = [ 'ssl' ] -__sources = glob.glob("./libtorrent/src/*.cpp") + glob.glob("./libtorrent/src/kademelia/*.cpp") + glob.glob("./libtorrent/bindings/python/src/*.cpp") +_sources = glob.glob("./libtorrent/src/*.cpp") + glob.glob("./libtorrent/src/kademelia/*.cpp") + glob.glob("./libtorrent/bindings/python/src/*.cpp") # Remove file_win.cpp as it is only for Windows builds -for source in __sources: +for source in _sources: if "file_win.cpp" in source: - __sources.remove(source) + _sources.remove(source) break libtorrent = Extension( 'libtorrent', - include_dirs = __include_dirs, - libraries = __libraries, - extra_compile_args = __extra_compile_args, - sources = __sources + include_dirs = _include_dirs, + libraries = _libraries, + extra_compile_args = _extra_compile_args, + sources = _sources ) -print find_packages("deluge") # Main setup -__data_files = [ +_data_files = [ # ('share/deluge/glade', glob.glob("share/deluge/glade/*.glade")), # ('share/deluge/pixmaps', glob.glob('share/deluge/pixmaps/*.png')), ('share/applications' , ["deluge/share/applications/deluge.desktop"]), @@ -100,10 +99,8 @@ setup( url = "http://deluge-torrent.org", license = "GPLv2", -# packages = find_packages("deluge"), include_package_data = True, - #scripts = ["scripts/deluge"], - data_files = __data_files, + data_files = _data_files, ext_package = "deluge", ext_modules = [libtorrent], packages=['deluge'],