Allow registering callbacks for DBus signals from different modules 07/197507/4
authorŁukasz Stelmach <l.stelmach@samsung.com>
Thu, 10 Jan 2019 14:23:32 +0000 (15:23 +0100)
committerŁukasz Stelmach <l.stelmach@samsung.com>
Fri, 22 Feb 2019 14:30:52 +0000 (15:30 +0100)
Change-Id: I242c6bf246446c4f7c1b0266dfad144f055c31d3

src/common/dbus.c

index f708d6ee238f0b4bb12438d186f6c5876b52738a..9acd81441655e5f32472817d1ad5501ffc7cdf65 100644 (file)
@@ -230,8 +230,8 @@ API int dbus_register_signals(const char *path, const char *interface,
                                                struct dbus_signal *signals, size_t num_signals)
 {
        struct dbus_signal_handle *handle;
-       int path_len, interface_len;
-       int i = 0;
+       int path_len, interface_len, name_len;
+       int i = 0, j = 0;
        int ret;
 
        if (!path || !interface || !signals) {
@@ -239,7 +239,7 @@ API int dbus_register_signals(const char *path, const char *interface,
                return -EINVAL;
        }
 
-       /* Check whether (path, interface) pair is already registered */
+       /* Check whether (path, interface, name) pair is already registered */
        path_len = strlen(path) + 1;
        interface_len = strlen(interface) + 1;
        G_SLIST_FOREACH(dbus_signal_handle_list, handle) {
@@ -248,9 +248,20 @@ API int dbus_register_signals(const char *path, const char *interface,
                if (strncmp(handle->interface, interface, interface_len))
                        continue;
 
-               _E("D-Bus signals having same path(%s) and interface(%s) are already registered!",
-                               path, interface);
-               return -EINVAL;
+               for (i = 0; i < num_signals;  i++) {
+                       name_len = strlen(signals[i].name) + 1;
+                       for (j = 0; j < handle->num_signals; j++) {
+                               if (strncmp(signals[i].name,
+                                           handle->signals[j].name,
+                                           name_len))
+                                       continue;
+                               _E("D-Bus signal having same path(%s), "
+                                  "interface(%s) and name(%s) is "
+                                  "already registered!",
+                                  path, interface, signals[i].name);
+                               return -EINVAL;
+                       }
+               }
        }
 
        handle = calloc(1, sizeof(struct dbus_signal_handle));