gdbus: Introduce G_DBUS_PROPERTY_FLAG_EXPERIMENTAL
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 28 Dec 2012 12:51:01 +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 properties as experimental, marked
properties 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 7ec256196f7994f5c038c0bebd899472c39ade5f..6f5a0121406aa36440d53addd02737da24c23644 100644 (file)
@@ -105,7 +105,8 @@ enum GDBusSignalFlags {
 };
 
 enum GDBusPropertyFlags {
-       G_DBUS_PROPERTY_FLAG_DEPRECATED = (1 << 0),
+       G_DBUS_PROPERTY_FLAG_DEPRECATED   = (1 << 0),
+       G_DBUS_PROPERTY_FLAG_EXPERIMENTAL = (1 << 1),
 };
 
 enum GDBusSecurityFlags {
index a25615f88ab5416ac9b4fb9c034b08492c53eb83..24260584953873a0cfeb6d900c9003f974300f87 100644 (file)
@@ -119,6 +119,14 @@ static void print_arguments(GString *gstr, const GDBusArgInfo *args,
 #define G_DBUS_ANNOTATE_NOREPLY(prefix_) \
        G_DBUS_ANNOTATE(prefix_, "Method.NoReply", "true")
 
+static gboolean check_experimental(int flags, int flag)
+{
+       if (!(flags & flag))
+               return FALSE;
+
+       return !(global_flags & G_DBUS_FLAG_ENABLE_EXPERIMENTAL);
+}
+
 static void generate_interface_xml(GString *gstr, struct interface_data *iface)
 {
        const GDBusMethodTable *method;
@@ -130,11 +138,9 @@ static void generate_interface_xml(GString *gstr, struct interface_data *iface)
                                                G_DBUS_METHOD_FLAG_DEPRECATED;
                gboolean noreply = method->flags &
                                                G_DBUS_METHOD_FLAG_NOREPLY;
-               gboolean experimental = method->flags &
-                                       G_DBUS_METHOD_FLAG_EXPERIMENTAL;
 
-               if (!(global_flags & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) &&
-                                                       experimental)
+               if (check_experimental(method->flags,
+                                       G_DBUS_METHOD_FLAG_EXPERIMENTAL))
                        continue;
 
                if (!deprecated && !noreply &&
@@ -164,11 +170,9 @@ 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)
+               if (check_experimental(signal->flags,
+                                       G_DBUS_SIGNAL_FLAG_EXPERIMENTAL))
                        continue;
 
                if (!deprecated && !(signal->args && signal->args->name))
@@ -194,6 +198,10 @@ static void generate_interface_xml(GString *gstr, struct interface_data *iface)
                gboolean deprecated = property->flags &
                                        G_DBUS_PROPERTY_FLAG_DEPRECATED;
 
+               if (check_experimental(property->flags,
+                                       G_DBUS_PROPERTY_FLAG_EXPERIMENTAL))
+                       continue;
+
                g_string_append_printf(gstr, "\t\t<property name=\"%s\""
                                        " type=\"%s\" access=\"%s%s\"",
                                        property->name, property->type,
@@ -555,6 +563,10 @@ static void append_properties(struct interface_data *data,
                                DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
 
        for (p = data->properties; p && p->name; p++) {
+               if (check_experimental(p->flags,
+                                       G_DBUS_PROPERTY_FLAG_EXPERIMENTAL))
+                       continue;
+
                if (p->get == NULL)
                        continue;
 
@@ -756,8 +768,14 @@ static inline const GDBusPropertyTable *find_property(const GDBusPropertyTable *
        const GDBusPropertyTable *p;
 
        for (p = properties; p && p->name; p++) {
-               if (strcmp(name, p->name) == 0)
-                       return p;
+               if (strcmp(name, p->name) != 0)
+                       continue;
+
+               if (check_experimental(p->flags,
+                                       G_DBUS_PROPERTY_FLAG_EXPERIMENTAL))
+                       break;
+
+               return p;
        }
 
        return NULL;
@@ -1035,18 +1053,14 @@ static DBusHandlerResult generic_message(DBusConnection *connection,
 
        for (method = iface->methods; method &&
                        method->name && method->function; method++) {
-               gboolean experimental = method->flags &
-                                       G_DBUS_METHOD_FLAG_EXPERIMENTAL;
 
                if (dbus_message_is_method_call(message, iface->name,
                                                        method->name) == FALSE)
                        continue;
 
-               if (experimental) {
-                       const char *env = g_getenv("GDBUS_EXPERIMENTAL");
-                       if (g_strcmp0(env, "1") != 0)
-                               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-               }
+               if (check_experimental(method->flags,
+                                       G_DBUS_METHOD_FLAG_EXPERIMENTAL))
+                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
                if (g_dbus_args_have_signature(method->in_args,
                                                        message) == FALSE)