mirror of git://git.sysmocom.de/ofono
gdbus: Introduce G_DBUS_METHOD_FLAG_EXPERIMENTAL
This flag can be used to mark methods as experimental, marked methods are disable by default and can be enabled by setting G_DBUS_FLAG_ENABLE_EXPERIMENTAL using g_dbus_set_flags.
This commit is contained in:
parent
37a54d0433
commit
4b50c0bd05
|
@ -88,10 +88,15 @@ typedef void (* GDBusSecurityFunction) (DBusConnection *connection,
|
||||||
gboolean interaction,
|
gboolean interaction,
|
||||||
GDBusPendingReply pending);
|
GDBusPendingReply pending);
|
||||||
|
|
||||||
|
enum GDBusFlags {
|
||||||
|
G_DBUS_FLAG_ENABLE_EXPERIMENTAL = (1 << 0),
|
||||||
|
};
|
||||||
|
|
||||||
enum GDBusMethodFlags {
|
enum GDBusMethodFlags {
|
||||||
G_DBUS_METHOD_FLAG_DEPRECATED = (1 << 0),
|
G_DBUS_METHOD_FLAG_DEPRECATED = (1 << 0),
|
||||||
G_DBUS_METHOD_FLAG_NOREPLY = (1 << 1),
|
G_DBUS_METHOD_FLAG_NOREPLY = (1 << 1),
|
||||||
G_DBUS_METHOD_FLAG_ASYNC = (1 << 2),
|
G_DBUS_METHOD_FLAG_ASYNC = (1 << 2),
|
||||||
|
G_DBUS_METHOD_FLAG_EXPERIMENTAL = (1 << 3),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum GDBusSignalFlags {
|
enum GDBusSignalFlags {
|
||||||
|
@ -173,6 +178,20 @@ struct GDBusSecurityTable {
|
||||||
.function = _function, \
|
.function = _function, \
|
||||||
.flags = G_DBUS_METHOD_FLAG_ASYNC | G_DBUS_METHOD_FLAG_DEPRECATED
|
.flags = G_DBUS_METHOD_FLAG_ASYNC | G_DBUS_METHOD_FLAG_DEPRECATED
|
||||||
|
|
||||||
|
#define GDBUS_EXPERIMENTAL_METHOD(_name, _in_args, _out_args, _function) \
|
||||||
|
.name = _name, \
|
||||||
|
.in_args = _in_args, \
|
||||||
|
.out_args = _out_args, \
|
||||||
|
.function = _function, \
|
||||||
|
.flags = G_DBUS_METHOD_FLAG_EXPERIMENTAL
|
||||||
|
|
||||||
|
#define GDBUS_EXPERIMENTAL_ASYNC_METHOD(_name, _in_args, _out_args, _function) \
|
||||||
|
.name = _name, \
|
||||||
|
.in_args = _in_args, \
|
||||||
|
.out_args = _out_args, \
|
||||||
|
.function = _function, \
|
||||||
|
.flags = G_DBUS_METHOD_FLAG_ASYNC | G_DBUS_METHOD_FLAG_EXPERIMENTAL
|
||||||
|
|
||||||
#define GDBUS_NOREPLY_METHOD(_name, _in_args, _out_args, _function) \
|
#define GDBUS_NOREPLY_METHOD(_name, _in_args, _out_args, _function) \
|
||||||
.name = _name, \
|
.name = _name, \
|
||||||
.in_args = _in_args, \
|
.in_args = _in_args, \
|
||||||
|
@ -189,6 +208,8 @@ struct GDBusSecurityTable {
|
||||||
.args = _args, \
|
.args = _args, \
|
||||||
.flags = G_DBUS_SIGNAL_FLAG_DEPRECATED
|
.flags = G_DBUS_SIGNAL_FLAG_DEPRECATED
|
||||||
|
|
||||||
|
void g_dbus_set_flags(int flags);
|
||||||
|
|
||||||
gboolean g_dbus_register_interface(DBusConnection *connection,
|
gboolean g_dbus_register_interface(DBusConnection *connection,
|
||||||
const char *path, const char *name,
|
const char *path, const char *name,
|
||||||
const GDBusMethodTable *methods,
|
const GDBusMethodTable *methods,
|
||||||
|
|
|
@ -84,6 +84,7 @@ struct property_data {
|
||||||
DBusMessage *message;
|
DBusMessage *message;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int global_flags = 0;
|
||||||
static struct generic_data *root;
|
static struct generic_data *root;
|
||||||
|
|
||||||
static gboolean process_changes(gpointer user_data);
|
static gboolean process_changes(gpointer user_data);
|
||||||
|
@ -129,6 +130,12 @@ static void generate_interface_xml(GString *gstr, struct interface_data *iface)
|
||||||
G_DBUS_METHOD_FLAG_DEPRECATED;
|
G_DBUS_METHOD_FLAG_DEPRECATED;
|
||||||
gboolean noreply = method->flags &
|
gboolean noreply = method->flags &
|
||||||
G_DBUS_METHOD_FLAG_NOREPLY;
|
G_DBUS_METHOD_FLAG_NOREPLY;
|
||||||
|
gboolean experimental = method->flags &
|
||||||
|
G_DBUS_METHOD_FLAG_EXPERIMENTAL;
|
||||||
|
|
||||||
|
if (!(global_flags & G_DBUS_FLAG_ENABLE_EXPERIMENTAL) &&
|
||||||
|
experimental)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!deprecated && !noreply &&
|
if (!deprecated && !noreply &&
|
||||||
!(method->in_args && method->in_args->name) &&
|
!(method->in_args && method->in_args->name) &&
|
||||||
|
@ -1022,10 +1029,19 @@ static DBusHandlerResult generic_message(DBusConnection *connection,
|
||||||
|
|
||||||
for (method = iface->methods; method &&
|
for (method = iface->methods; method &&
|
||||||
method->name && method->function; method++) {
|
method->name && method->function; method++) {
|
||||||
|
gboolean experimental = method->flags &
|
||||||
|
G_DBUS_METHOD_FLAG_EXPERIMENTAL;
|
||||||
|
|
||||||
if (dbus_message_is_method_call(message, iface->name,
|
if (dbus_message_is_method_call(message, iface->name,
|
||||||
method->name) == FALSE)
|
method->name) == FALSE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (experimental) {
|
||||||
|
const char *env = g_getenv("GDBUS_EXPERIMENTAL");
|
||||||
|
if (g_strcmp0(env, "1") != 0)
|
||||||
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_dbus_args_have_signature(method->in_args,
|
if (g_dbus_args_have_signature(method->in_args,
|
||||||
message) == FALSE)
|
message) == FALSE)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1692,3 +1708,8 @@ gboolean g_dbus_detach_object_manager(DBusConnection *connection)
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void g_dbus_set_flags(int flags)
|
||||||
|
{
|
||||||
|
global_flags = flags;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue