gdbus: Introduce G_DBUS_SIGNAL_FLAG_EXPERIMENTAL
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 28 Dec 2012 12:51:00 +0000 (14:51 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 30 Dec 2012 18:49:44 +0000 (10:49 -0800)
This flag can be used to mark signals as experimental, marked
signals are disabled by default and can be enabled by setting
G_DBUS_FLAG_ENABLE_EXPERIMENTAL using g_dbus_set_flags.

gdbus/gdbus.h
gdbus/object.c

index 86b5aff..7ec2561 100644 (file)
@@ -100,7 +100,8 @@ enum GDBusMethodFlags {
 };
 
 enum GDBusSignalFlags {
-       G_DBUS_SIGNAL_FLAG_DEPRECATED = (1 << 0),
+       G_DBUS_SIGNAL_FLAG_DEPRECATED   = (1 << 0),
+       G_DBUS_SIGNAL_FLAG_EXPERIMENTAL = (1 << 1),
 };
 
 enum GDBusPropertyFlags {
@@ -208,6 +209,11 @@ struct GDBusSecurityTable {
        .args = _args, \
        .flags = G_DBUS_SIGNAL_FLAG_DEPRECATED
 
+#define GDBUS_EXPERIMENTAL_SIGNAL(_name, _args) \
+       .name = _name, \
+       .args = _args, \
+       .flags = G_DBUS_SIGNAL_FLAG_EXPERIMENTAL
+
 void g_dbus_set_flags(int flags);
 
 gboolean g_dbus_register_interface(DBusConnection *connection,
index 5fe4c7c..a25615f 100644 (file)
@@ -164,6 +164,12 @@ static void generate_interface_xml(GString *gstr, struct interface_data *iface)
        for (signal = iface->signals; signal && signal->name; signal++) {
                gboolean deprecated = signal->flags &
                                                G_DBUS_SIGNAL_FLAG_DEPRECATED;
+               gboolean experimental = signal->flags &
+                                       G_DBUS_SIGNAL_FLAG_EXPERIMENTAL;
+
+               if (!(global_flags & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) &&
+                                                       experimental)
+                       continue;
 
                if (!deprecated && !(signal->args && signal->args->name))
                        g_string_append_printf(gstr,
@@ -1266,10 +1272,17 @@ static gboolean check_signal(DBusConnection *conn, const char *path,
        }
 
        for (signal = iface->signals; signal && signal->name; signal++) {
-               if (!strcmp(signal->name, name)) {
-                       *args = signal->args;
-                       return TRUE;
+               if (strcmp(signal->name, name) != 0)
+                       continue;
+
+               if (signal->flags & G_DBUS_SIGNAL_FLAG_EXPERIMENTAL) {
+                       const char *env = g_getenv("GDBUS_EXPERIMENTAL");
+                       if (g_strcmp0(env, "1") != 0)
+                               break;
                }
+
+               *args = signal->args;
+               return TRUE;
        }
 
        error("No signal named %s on interface %s", name, interface);