X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdbus%2Fwatch.c;h=1ca3c4bda3cb0f7a614ed0e4367ec64fa0cd4807;hb=a57098c65678aa6f708215133099520fcb2ef815;hp=0d0054c11ea9c948c7612b9b2890ae99454aeb6f;hpb=bcae74da8fa2958b3fec9153fc33e41f0e0317bf;p=platform%2Fupstream%2Fconnman.git diff --git a/gdbus/watch.c b/gdbus/watch.c old mode 100644 new mode 100755 index 0d0054c..1ca3c4b --- a/gdbus/watch.c +++ b/gdbus/watch.c @@ -136,6 +136,51 @@ 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) +{ + const char *sender; + int offset; + + offset = snprintf(rule, size, "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; @@ -160,6 +205,7 @@ static void format_rule(struct filter_data *data, char *rule, size_t size) snprintf(rule + offset, size - offset, ",arg0='%s'", data->argument); } +#endif static gboolean add_match(struct filter_data *data, DBusHandleMessageFunction filter) @@ -204,6 +250,30 @@ static gboolean remove_match(struct filter_data *data) return TRUE; } +static void filter_data_free(struct filter_data *data) +{ + GSList *l; + + /* Remove filter if there are no listeners left for the connection */ + if (filter_data_find(data->connection) == NULL) + dbus_connection_remove_filter(data->connection, message_filter, + NULL); + + for (l = data->callbacks; l != NULL; l = l->next) + g_free(l->data); + + g_slist_free(data->callbacks); + g_dbus_remove_watch(data->connection, data->name_watch); + g_free(data->name); + g_free(data->owner); + g_free(data->path); + g_free(data->interface); + g_free(data->member); + g_free(data->argument); + dbus_connection_unref(data->connection); + g_free(data); +} + static struct filter_data *filter_data_get(DBusConnection *connection, DBusHandleMessageFunction filter, const char *sender, @@ -248,7 +318,7 @@ proceed: data->argument = g_strdup(argument); if (!add_match(data, filter)) { - g_free(data); + filter_data_free(data); return NULL; } @@ -277,30 +347,6 @@ static struct filter_callback *filter_data_find_callback( return NULL; } -static void filter_data_free(struct filter_data *data) -{ - GSList *l; - - /* Remove filter if there are no listeners left for the connection */ - if (filter_data_find(data->connection) == NULL) - dbus_connection_remove_filter(data->connection, message_filter, - NULL); - - for (l = data->callbacks; l != NULL; l = l->next) - g_free(l->data); - - g_slist_free(data->callbacks); - g_dbus_remove_watch(data->connection, data->name_watch); - g_free(data->name); - g_free(data->owner); - g_free(data->path); - g_free(data->interface); - g_free(data->member); - g_free(data->argument); - dbus_connection_unref(data->connection); - g_free(data); -} - static void filter_data_call_and_free(struct filter_data *data) { GSList *l; @@ -523,9 +569,7 @@ static DBusHandlerResult message_filter(DBusConnection *connection, member = dbus_message_get_member(message); dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg, DBUS_TYPE_INVALID); - /* Sender is always the owner */ - if (sender == NULL) - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + /* If sender != NULL it is always the owner */ for (current = listeners; current != NULL; current = current->next) { data = current->data; @@ -533,6 +577,9 @@ static DBusHandlerResult message_filter(DBusConnection *connection, if (connection != data->connection) continue; + if (!sender && data->owner) + continue; + if (data->owner && g_str_equal(sender, data->owner) == FALSE) continue;