From 0f5caf818fc5eb06d349baa3c63cbddfa18e9dc6 Mon Sep 17 00:00:00 2001
From: Pauli Nieminen <suokkos@gmail.com>
Date: Sat, 15 Dec 2012 08:51:31 +0200
Subject: [PATCH] fix dbus service startup not to start multiple instances

gwibber-service process can be started multiple times by dbus for each
service file. If previous startup hadn't yet had time to register the
com.Gwibber.Connection second instance will be able start duplicate
instance.

To avoid dealing with the startup race condition we can use single
service file to provide all services making dbus handle correctly single
gwibber-service instance per user login.

Signed-off-by: Pauli Nieminen <suokkos@gmail.com>
---
 bin/gwibber-service                    |    2 +-
 data/Makefile.am                       |    8 +-------
 data/com.Gwibber.Accounts.service.in   |    3 ---
 data/com.Gwibber.Connection.service.in |    3 ---
 data/com.Gwibber.Messages.service.in   |    3 ---
 data/com.Gwibber.Searches.service.in   |    3 ---
 data/com.Gwibber.Streams.service.in    |    3 ---
 data/com.Gwibber.URLShorten.service.in |    3 ---
 gwibber/lib/__init__.py                |    2 +-
 gwibber/microblog/dispatcher.py        |   12 ++++++------
 gwibber/microblog/storage.py           |    8 ++++----
 gwibber/microblog/util/__init__.py     |    8 ++++----
 libgwibber/accounts.vala               |    3 ++-
 libgwibber/connection.vala             |    3 ++-
 libgwibber/messages.vala               |    3 ++-
 libgwibber/streams.vala                |    3 ++-
 libgwibber/urlshorten.vala             |    3 ++-
 scripts/add_account.py                 |    2 +-
 tests/create-account.in                |    2 +-
 tests/service-start.in                 |    2 +-
 20 files changed, 30 insertions(+), 49 deletions(-)
 delete mode 100644 data/com.Gwibber.Accounts.service.in
 delete mode 100644 data/com.Gwibber.Connection.service.in
 delete mode 100644 data/com.Gwibber.Messages.service.in
 delete mode 100644 data/com.Gwibber.Searches.service.in
 delete mode 100644 data/com.Gwibber.Streams.service.in
 delete mode 100644 data/com.Gwibber.URLShorten.service.in

diff --git a/bin/gwibber-service b/bin/gwibber-service
index bad6d99..1ff0170 100755
--- a/bin/gwibber-service
+++ b/bin/gwibber-service
@@ -61,7 +61,7 @@ else:
   from gwibber.microblog import dispatcher
 
 # if gwibber-serivce is already running, don't start
-if "com.Gwibber.Connection" in dbus.SessionBus().list_names():
+if "com.Gwibber.Service" in dbus.SessionBus().list_names():
   logger.info("Found gwibber-service already running, exiting")
   quit()
 
diff --git a/data/Makefile.am b/data/Makefile.am
index 1024e61..92a1036 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -11,13 +11,7 @@ desktop_DATA = $(DESKTOP_FILES)
 
 dbus_servicesdir = $(datadir)/dbus-1/services
 service_in_files = \
-		com.Gwibber.Accounts.service.in \
-		com.Gwibber.Connection.service.in \
-		com.Gwibber.Messages.service.in	\
-		com.Gwibber.Searches.service.in	\
-		com.Gwibber.Service.service.in	\
-		com.Gwibber.Streams.service.in	\
-		com.Gwibber.URLShorten.service.in
+		com.Gwibber.Service.service.in
 
 dbus_services_DATA = $(service_in_files:.service.in=.service)
 
diff --git a/data/com.Gwibber.Accounts.service.in b/data/com.Gwibber.Accounts.service.in
deleted file mode 100644
index dbf8c33..0000000
--- a/data/com.Gwibber.Accounts.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=com.Gwibber.Accounts
-Exec=@bindir@/gwibber-service
diff --git a/data/com.Gwibber.Connection.service.in b/data/com.Gwibber.Connection.service.in
deleted file mode 100644
index 94903ba..0000000
--- a/data/com.Gwibber.Connection.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=com.Gwibber.Connection
-Exec=@bindir@/gwibber-service
diff --git a/data/com.Gwibber.Messages.service.in b/data/com.Gwibber.Messages.service.in
deleted file mode 100644
index 1fa20bb..0000000
--- a/data/com.Gwibber.Messages.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=com.Gwibber.Messages
-Exec=@bindir@/gwibber-service
diff --git a/data/com.Gwibber.Searches.service.in b/data/com.Gwibber.Searches.service.in
deleted file mode 100644
index 115b8d3..0000000
--- a/data/com.Gwibber.Searches.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=com.Gwibber.Searches
-Exec=@bindir@/gwibber-service
diff --git a/data/com.Gwibber.Streams.service.in b/data/com.Gwibber.Streams.service.in
deleted file mode 100644
index be87341..0000000
--- a/data/com.Gwibber.Streams.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=com.Gwibber.Streams
-Exec=@bindir@/gwibber-service
diff --git a/data/com.Gwibber.URLShorten.service.in b/data/com.Gwibber.URLShorten.service.in
deleted file mode 100644
index 1971d8f..0000000
--- a/data/com.Gwibber.URLShorten.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=com.Gwibber.URLShorten
-Exec=@bindir@/gwibber-service
diff --git a/gwibber/lib/__init__.py b/gwibber/lib/__init__.py
index ba2afc3..342df85 100644
--- a/gwibber/lib/__init__.py
+++ b/gwibber/lib/__init__.py
@@ -15,7 +15,7 @@ class GwibberPublic:
 
     def getbus(self, name):
         obj = self.bus.get_object(
-            "com.Gwibber.%s" % name,
+            "com.Gwibber.Service",
             "/com/gwibber/%s" % name,
             follow_name_owner_changes=True)
         
diff --git a/gwibber/microblog/dispatcher.py b/gwibber/microblog/dispatcher.py
index b91e89c..e9fdc25 100644
--- a/gwibber/microblog/dispatcher.py
+++ b/gwibber/microblog/dispatcher.py
@@ -962,7 +962,7 @@ class ConnectionMonitor(dbus.service.Object):
 
   def __init__(self):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Connection", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
 
     self.sysbus = dbus.SystemBus()
@@ -1035,7 +1035,7 @@ class URLShorten(dbus.service.Object):
 
   def __init__(self):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.URLShorten", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
 
   @dbus.service.method("com.Gwibber.URLShorten", in_signature="s", out_signature="s")
@@ -1045,7 +1045,7 @@ class URLShorten(dbus.service.Object):
     example:
             import dbus
             url = "http://www.example.com/this/is/a/long/url"
-            obj = dbus.SessionBus().get_object("com.Gwibber.URLShorten", "/com/gwibber/URLShorten")
+            obj = dbus.SessionBus().get_object("com.Gwibber.Service", "/com/gwibber/URLShorten")
             shortener = dbus.Interface(obj, "com.Gwibber.URLShorten")
             short_url = shortener.Shorten(url)
     """
@@ -1069,7 +1069,7 @@ class Uploader(dbus.service.Object):
 
   def __init__(self):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Uploader", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
 
   @dbus.service.method("com.Gwibber.Uploader", in_signature="s", out_signature="")
@@ -1079,7 +1079,7 @@ class Uploader(dbus.service.Object):
     example:
             import dbus
             filepath = "/home/ken/Documents/awesomeimage.jpg"
-            obj = dbus.SessionBus().get_object("com.Gwibber.Uploader", "/com/gwibber/Uploader")
+            obj = dbus.SessionBus().get_object("com.Gwibber.Service", "/com/gwibber/Uploader")
             uploader = dbus.Interface(obj, "com.Gwibber.Uploader")
             
             def done(path, url):
@@ -1114,7 +1114,7 @@ class Translate(dbus.service.Object):
 
   def __init__(self):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Translate", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
 
   @dbus.service.method("com.Gwibber.Translate", in_signature="sss", out_signature="s")
diff --git a/gwibber/microblog/storage.py b/gwibber/microblog/storage.py
index f28ac3d..fb120db 100644
--- a/gwibber/microblog/storage.py
+++ b/gwibber/microblog/storage.py
@@ -15,7 +15,7 @@ class MessageManager(dbus.service.Object):
 
   def __init__(self, db):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Messages", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
     
     self.db = db
@@ -86,7 +86,7 @@ class SearchManager(dbus.service.Object):
 
   def __init__(self, db):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Searches", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
     self.db = db
 
@@ -151,7 +151,7 @@ class StreamManager(dbus.service.Object):
 
   def __init__(self, db):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Streams", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
     self.db = db
 
@@ -253,7 +253,7 @@ class AccountManager(dbus.service.Object):
 
   def __init__(self, db):
     self.bus = dbus.SessionBus()
-    bus_name = dbus.service.BusName("com.Gwibber.Accounts", bus=self.bus)
+    bus_name = dbus.service.BusName("com.Gwibber.Service", bus=self.bus)
     dbus.service.Object.__init__(self, bus_name, self.__dbus_object_path__)
     self.db = db
 
diff --git a/gwibber/microblog/util/__init__.py b/gwibber/microblog/util/__init__.py
index 86ac4e2..b0412d8 100644
--- a/gwibber/microblog/util/__init__.py
+++ b/gwibber/microblog/util/__init__.py
@@ -265,15 +265,15 @@ except:
   can_notify = False
 
 
-def getbus(path, address="com.Gwibber"):
+def getbus(path, interface="com.Gwibber"):
   if not path.startswith("/"):
     path = "/com/gwibber/%s" % path
     if len(path.split('gwibber/')[1]) > 1:
-      address = "com.Gwibber.%s" % path.split('wibber/')[1]
+      interface = "com.Gwibber.%s" % path.split('wibber/')[1]
   bus = dbus.SessionBus()
-  obj = bus.get_object(address, path,
+  obj = bus.get_object("com.Gwibber.Service", path,
       follow_name_owner_changes = True)
-  return dbus.Interface(obj, address)
+  return dbus.Interface(obj, interface)
 
 def service_is_running(name):
   return name in dbus.Interface(dbus.SessionBus().get_object(
diff --git a/libgwibber/accounts.vala b/libgwibber/accounts.vala
index e5b0c5a..7404281 100644
--- a/libgwibber/accounts.vala
+++ b/libgwibber/accounts.vala
@@ -35,6 +35,7 @@ namespace Gwibber
 
     public class Accounts : Object
     {
+        private const string service_name  = "com.Gwibber.Service";
         private const string accounts_name  = "com.Gwibber.Accounts";
         private const string accounts_path  = "/com/gwibber/Accounts";
 
@@ -78,7 +79,7 @@ namespace Gwibber
             try
             {
                 accounts_service = Bus.get_proxy_sync(BusType.SESSION,
-                                                      accounts_name,
+                                                      service_name,
                                                       accounts_path);
 
                 utils = new Gwibber.Utils();
diff --git a/libgwibber/connection.vala b/libgwibber/connection.vala
index 564592c..0f140d4 100644
--- a/libgwibber/connection.vala
+++ b/libgwibber/connection.vala
@@ -30,6 +30,7 @@ namespace Gwibber
 {
     public class Connection : Object
     {
+        private const string service_name  = "com.Gwibber.Service";
         private const string conn_name  = "com.Gwibber.Connection";
         private const string conn_path  = "/com/gwibber/Connection";
 
@@ -62,7 +63,7 @@ namespace Gwibber
             try
             {
                 conn_service = Bus.get_proxy_sync(BusType.SESSION,
-                                                       conn_name,
+                                                       service_name,
                                                        conn_path);
                 utils = new Gwibber.Utils();
                 utils.setup(conn_name);
diff --git a/libgwibber/messages.vala b/libgwibber/messages.vala
index 9d78d63..03a5b03 100644
--- a/libgwibber/messages.vala
+++ b/libgwibber/messages.vala
@@ -30,6 +30,7 @@ namespace Gwibber
 {
     public class Messages : Object
     {
+        private const string service_name  = "com.Gwibber.Service";
         private const string messages_name  = "com.Gwibber.Messages";
         private const string messages_path  = "/com/gwibber/Messages";
 
@@ -58,7 +59,7 @@ namespace Gwibber
             try
             {
                 messages_service = Bus.get_proxy_sync(BusType.SESSION,
-                                                           messages_name,
+                                                           service_name,
                                                            messages_path);
                 utils = new Gwibber.Utils();
                 utils.setup(messages_name);
diff --git a/libgwibber/streams.vala b/libgwibber/streams.vala
index ea5cce0..948d452 100644
--- a/libgwibber/streams.vala
+++ b/libgwibber/streams.vala
@@ -35,6 +35,7 @@ namespace Gwibber
 {
     public class Streams : Object
     {
+        private const string service_name  = "com.Gwibber.Service";
         private const string streams_name  = "com.Gwibber.Streams";
         private const string streams_path  = "/com/gwibber/Streams";
 
@@ -100,7 +101,7 @@ namespace Gwibber
             try
             {
                 streams_service = Bus.get_proxy_sync(BusType.SESSION,
-                                                          streams_name,
+                                                          service_name,
                                                           streams_path);
                 utils = new Gwibber.Utils();
                 utils.setup(streams_name);
diff --git a/libgwibber/urlshorten.vala b/libgwibber/urlshorten.vala
index 177e4a4..5591c4f 100644
--- a/libgwibber/urlshorten.vala
+++ b/libgwibber/urlshorten.vala
@@ -28,6 +28,7 @@ namespace Gwibber
 {
     public class URLShorten : Object
     {
+        private const string service_name  = "com.Gwibber.Service";
         private const string url_name  = "com.Gwibber.URLShorten";
         private const string url_path  = "/com/gwibber/URLShorten";
 
@@ -47,7 +48,7 @@ namespace Gwibber
             try
             {
                 url_service = Bus.get_proxy_sync(BusType.SESSION,
-                                                      url_name,
+                                                      service_name,
                                                       url_path);
                 utils = new Gwibber.Utils();
                 utils.setup(url_name);
diff --git a/scripts/add_account.py b/scripts/add_account.py
index 468d0b6..4bca648 100644
--- a/scripts/add_account.py
+++ b/scripts/add_account.py
@@ -3,7 +3,7 @@
 import dbus, json
 
 bus = dbus.SessionBus()
-obj = bus.get_object("com.Gwibber.Accounts", "/com/gwibber/Accounts")
+obj = bus.get_object("com.Gwibber.Service", "/com/gwibber/Accounts")
 accounts = dbus.Interface(obj, "com.Gwibber.Accounts")
 
 data = {
diff --git a/tests/create-account.in b/tests/create-account.in
index 0ee821a..a82c0e5 100755
--- a/tests/create-account.in
+++ b/tests/create-account.in
@@ -3,7 +3,7 @@
 import dbus, json
 
 bus = dbus.SessionBus()
-obj = bus.get_object("com.Gwibber.Accounts", "/com/gwibber/Accounts")
+obj = bus.get_object("com.Gwibber.Service", "/com/gwibber/Accounts")
 accounts = dbus.Interface(obj, "com.Gwibber.Accounts")
 
 data = {
diff --git a/tests/service-start.in b/tests/service-start.in
index 1bab79e..d8f2221 100755
--- a/tests/service-start.in
+++ b/tests/service-start.in
@@ -43,7 +43,7 @@ logger.info("Running from tests")
 
 from gwibber.microblog import dispatcher
 
-if "com.Gwibber.Connection" in dbus.SessionBus().list_names():
+if "com.Gwibber.Service" in dbus.SessionBus().list_names():
   logger.info("Found service already running, exiting")
   quit()
 
-- 
1.7.10.4

