summaryrefslogtreecommitdiff
path: root/gdbus
diff options
context:
space:
mode:
authorJakub Pawlowski <jpawlowski@google.com>2015-09-18 01:35:56 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2015-09-19 14:28:12 +0300
commita3ff1a8e43688311037eb1c46981f3a7aecfa24e (patch)
tree482719fe90dd73d7f2518d6c5741d4c1933dd00a /gdbus
parente25fd4d869667fac09db80fe40daf1f46bb9d673 (diff)
downloadbluez-a3ff1a8e43688311037eb1c46981f3a7aecfa24e.tar.gz
gdbus: add method for immediate property update
g_dbus_emit_property_changed doesn't send dbus signal immediately. Instead it stores changed properties, and schedule signal to be send at g_iddle_add. Additionally, if this method is called few times for some property, only last value will be sent in property changed signal. If remote device sends lots of notifications, they're all scheduled to be notified using this method. This might result in some notifications being lost. This patch adds new method, that can immediately send property changed signal, instead of sheduling it for nearest iddle moment.
Diffstat (limited to 'gdbus')
-rw-r--r--gdbus/gdbus.h10
-rw-r--r--gdbus/object.c16
2 files changed, 23 insertions, 3 deletions
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index d99c2549d..74de661b8 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -35,6 +35,7 @@ typedef enum GDBusMethodFlags GDBusMethodFlags;
typedef enum GDBusSignalFlags GDBusSignalFlags;
typedef enum GDBusPropertyFlags GDBusPropertyFlags;
typedef enum GDBusSecurityFlags GDBusSecurityFlags;
+typedef enum GDbusPropertyChangedFlags GDbusPropertyChangedFlags;
typedef struct GDBusArgInfo GDBusArgInfo;
typedef struct GDBusMethodTable GDBusMethodTable;
@@ -115,6 +116,11 @@ enum GDBusSecurityFlags {
G_DBUS_SECURITY_FLAG_ALLOW_INTERACTION = (1 << 2),
};
+enum GDbusPropertyChangedFlags {
+ G_DBUS_PROPERTY_CHANGED_FLAG_FLUSH = (1 << 0),
+};
+
+
struct GDBusArgInfo {
const char *name;
const char *signature;
@@ -300,6 +306,10 @@ void g_dbus_pending_property_error(GDBusPendingReply id, const char *name,
void g_dbus_emit_property_changed(DBusConnection *connection,
const char *path, const char *interface,
const char *name);
+void g_dbus_emit_property_changed_full(DBusConnection *connection,
+ const char *path, const char *interface,
+ const char *name,
+ GDbusPropertyChangedFlags flags);
gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,
const char *interface, DBusMessageIter *iter);
diff --git a/gdbus/object.c b/gdbus/object.c
index 96db51665..4cf2e2f94 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -1720,9 +1720,10 @@ static void process_property_changes(struct generic_data *data)
}
}
-void g_dbus_emit_property_changed(DBusConnection *connection,
+void g_dbus_emit_property_changed_full(DBusConnection *connection,
const char *path, const char *interface,
- const char *name)
+ const char *name,
+ GDbusPropertyChangedFlags flags)
{
const GDBusPropertyTable *property;
struct generic_data *data;
@@ -1760,7 +1761,16 @@ void g_dbus_emit_property_changed(DBusConnection *connection,
iface->pending_prop = g_slist_prepend(iface->pending_prop,
(void *) property);
- add_pending(data);
+ if (flags & G_DBUS_PROPERTY_CHANGED_FLAG_FLUSH)
+ process_property_changes(data);
+ else
+ add_pending(data);
+}
+
+void g_dbus_emit_property_changed(DBusConnection *connection, const char *path,
+ const char *interface, const char *name)
+{
+ g_dbus_emit_property_changed_full(connection, path, interface, name, 0);
}
gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,