Merge tag 'upstream/1.40' into tizen.
[platform/upstream/connman.git] / gdbus / watch.c
index 1ca3c4b..8fa76cd 100755 (executable)
@@ -136,84 +136,55 @@ static struct filter_data *filter_data_find(DBusConnection *connection)
        return NULL;
 }
 
-#if defined TIZEN_EXT
-#define SENDER_PREFIX ",sender='%s'"
-#define PATH_PREFIX ",path='%s'"
-#define IFACE_PREFIX ",interface='%s'"
-#define MEMBER_PREFIX ",member='%s'"
-#define ARG0_PREFIX ",arg0='%s'"
-
-static gboolean check_rule_length(int remains, const char *prefix, const char *data)
-{
-       if (!prefix || !data)
-               return FALSE;
-
-       return strlen(prefix) - 2 + strlen(data) < remains;
-}
-
-static void format_rule(struct filter_data *data, char *rule, size_t size)
+static char *format_rule(struct filter_data *data)
 {
+       char *rule, *tmp;
        const char *sender;
-       int offset;
 
-       offset = snprintf(rule, size, "type='signal'");
+       rule = g_strdup("type='signal'");
        sender = data->name ? : data->owner;
 
-       if (sender &&
-                       check_rule_length(size - offset, SENDER_PREFIX, sender))
-               offset += snprintf(rule + offset, size - offset,
-                               SENDER_PREFIX, sender);
-       if (data->path &&
-                       check_rule_length(size - offset, PATH_PREFIX, data->path))
-               offset += snprintf(rule + offset, size - offset,
-                               PATH_PREFIX, data->path);
-       if (data->interface &&
-                       check_rule_length(size - offset, IFACE_PREFIX, data->interface))
-               offset += snprintf(rule + offset, size - offset,
-                               IFACE_PREFIX, data->interface);
-       if (data->member &&
-                       check_rule_length(size - offset, MEMBER_PREFIX, data->member))
-               offset += snprintf(rule + offset, size - offset,
-                               MEMBER_PREFIX, data->member);
-       if (data->argument &&
-                       check_rule_length(size - offset, ARG0_PREFIX, data->argument))
-               snprintf(rule + offset, size - offset,
-                               ARG0_PREFIX, data->argument);
-}
-#else
-static void format_rule(struct filter_data *data, char *rule, size_t size)
-{
-       const char *sender;
-       int offset;
+       if (sender) {
+               tmp = rule;
+               rule = g_strdup_printf("%s,sender='%s'", rule, sender);
+               g_free(tmp);
+       }
 
-       offset = snprintf(rule, size, "type='signal'");
-       sender = data->name ? : data->owner;
+       if (data->path) {
+               tmp = rule;
+               rule = g_strdup_printf("%s,path='%s'", rule, data->path);
+               g_free(tmp);
+       }
 
-       if (sender)
-               offset += snprintf(rule + offset, size - offset,
-                               ",sender='%s'", sender);
-       if (data->path)
-               offset += snprintf(rule + offset, size - offset,
-                               ",path='%s'", data->path);
-       if (data->interface)
-               offset += snprintf(rule + offset, size - offset,
-                               ",interface='%s'", data->interface);
-       if (data->member)
-               offset += snprintf(rule + offset, size - offset,
-                               ",member='%s'", data->member);
-       if (data->argument)
-               snprintf(rule + offset, size - offset,
-                               ",arg0='%s'", data->argument);
+       if (data->interface){
+               tmp = rule;
+               rule = g_strdup_printf("%s,interface='%s'", rule,
+                               data->interface);
+               g_free(tmp);
+       }
+
+       if (data->member) {
+               tmp = rule;
+               rule = g_strdup_printf("%s,member='%s'", rule, data->member);
+               g_free(tmp);
+       }
+
+       if (data->argument) {
+               tmp = rule;
+               rule = g_strdup_printf("%s,arg0='%s'", rule, data->argument);
+               g_free(tmp);
+       }
+
+       return rule;
 }
-#endif
 
 static gboolean add_match(struct filter_data *data,
                                DBusHandleMessageFunction filter)
 {
        DBusError err;
-       char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH];
+       char *rule;
 
-       format_rule(data, rule, sizeof(rule));
+       rule = format_rule(data);
        dbus_error_init(&err);
 
        dbus_bus_add_match(data->connection, rule, &err);
@@ -221,21 +192,23 @@ static gboolean add_match(struct filter_data *data,
                error("Adding match rule \"%s\" failed: %s", rule,
                                err.message);
                dbus_error_free(&err);
+               g_free(rule);
                return FALSE;
        }
 
        data->handle_func = filter;
        data->registered = TRUE;
 
+       g_free(rule);
        return TRUE;
 }
 
 static gboolean remove_match(struct filter_data *data)
 {
        DBusError err;
-       char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH];
+       char *rule;
 
-       format_rule(data, rule, sizeof(rule));
+       rule = format_rule(data);
 
        dbus_error_init(&err);
 
@@ -244,9 +217,11 @@ static gboolean remove_match(struct filter_data *data)
                error("Removing owner match rule for %s failed: %s",
                                rule, err.message);
                dbus_error_free(&err);
+               g_free(rule);
                return FALSE;
        }
 
+       g_free(rule);
        return TRUE;
 }