summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2018-03-02 01:36:23 +0100
committerMathieu Duponchelle <mathieu@centricular.com>2018-03-02 16:21:37 +0100
commite356cf33f25e4c495355e54ff885b8d2ca3971d3 (patch)
tree3b84408a54cbcf82b95c6f0cb766eda8be1cc73e
parent030992d03a0a3933397407c1ff7bfa4176373674 (diff)
permissions: more bindings-friendly API
https://bugzilla.gnome.org/show_bug.cgi?id=793975
-rw-r--r--docs/libs/gst-rtsp-server-sections.txt2
-rw-r--r--gst/rtsp-server/rtsp-media-factory.c25
-rw-r--r--gst/rtsp-server/rtsp-media-factory.h3
-rw-r--r--gst/rtsp-server/rtsp-permissions.c53
-rw-r--r--gst/rtsp-server/rtsp-permissions.h3
-rw-r--r--tests/check/gst/permissions.c9
6 files changed, 83 insertions, 12 deletions
diff --git a/docs/libs/gst-rtsp-server-sections.txt b/docs/libs/gst-rtsp-server-sections.txt
index 86e3f25..103cd4a 100644
--- a/docs/libs/gst-rtsp-server-sections.txt
+++ b/docs/libs/gst-rtsp-server-sections.txt
@@ -248,6 +248,7 @@ gst_rtsp_media_factory_set_launch
gst_rtsp_media_factory_get_permissions
gst_rtsp_media_factory_set_permissions
gst_rtsp_media_factory_add_role
+gst_rtsp_media_factory_add_role_from_structure
gst_rtsp_media_factory_set_shared
gst_rtsp_media_factory_is_shared
@@ -361,6 +362,7 @@ gst_rtsp_permissions_unref
gst_rtsp_permissions_add_role
gst_rtsp_permissions_add_role_valist
gst_rtsp_permissions_add_role_empty
+gst_rtsp_permissions_add_role_from_structure
gst_rtsp_permissions_add_permission_for_role
gst_rtsp_permissions_remove_role
gst_rtsp_permissions_get_role
diff --git a/gst/rtsp-server/rtsp-media-factory.c b/gst/rtsp-server/rtsp-media-factory.c
index 9093847..b7ba295 100644
--- a/gst/rtsp-server/rtsp-media-factory.c
+++ b/gst/rtsp-server/rtsp-media-factory.c
@@ -495,6 +495,31 @@ gst_rtsp_media_factory_add_role (GstRTSPMediaFactory * factory,
}
/**
+ * gst_rtsp_media_factory_add_role_from_structure:
+ *
+ * A convenience wrapper around gst_rtsp_permissions_add_role_from_structure().
+ * If @factory had no permissions, new permissions will be created and the
+ * role will be added to it.
+ */
+void
+gst_rtsp_media_factory_add_role_from_structure (GstRTSPMediaFactory * factory,
+ GstStructure * structure)
+{
+ GstRTSPMediaFactoryPrivate *priv;
+ g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
+ g_return_if_fail (GST_IS_STRUCTURE (structure));
+
+ priv = factory->priv;
+
+ GST_RTSP_MEDIA_FACTORY_LOCK (factory);
+ if (priv->permissions == NULL)
+ priv->permissions = gst_rtsp_permissions_new ();
+
+ gst_rtsp_permissions_add_role_from_structure (priv->permissions, structure);
+ GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
+}
+
+/**
* gst_rtsp_media_factory_set_launch:
* @factory: a #GstRTSPMediaFactory
* @launch: the launch description
diff --git a/gst/rtsp-server/rtsp-media-factory.h b/gst/rtsp-server/rtsp-media-factory.h
index 57c8031..c76a240 100644
--- a/gst/rtsp-server/rtsp-media-factory.h
+++ b/gst/rtsp-server/rtsp-media-factory.h
@@ -127,6 +127,9 @@ void gst_rtsp_media_factory_add_role (GstRTSPMediaFacto
const gchar *fieldname, ...);
GST_EXPORT
+void gst_rtsp_media_factory_add_role_from_structure (GstRTSPMediaFactory * factory,
+ GstStructure *structure);
+GST_EXPORT
void gst_rtsp_media_factory_set_shared (GstRTSPMediaFactory *factory,
gboolean shared);
diff --git a/gst/rtsp-server/rtsp-permissions.c b/gst/rtsp-server/rtsp-permissions.c
index 34cf42a..9575048 100644
--- a/gst/rtsp-server/rtsp-permissions.c
+++ b/gst/rtsp-server/rtsp-permissions.c
@@ -105,6 +105,28 @@ gst_rtsp_permissions_init (GstRTSPPermissionsImpl * permissions)
g_ptr_array_new_with_free_func ((GDestroyNotify) free_structure);
}
+static void
+add_role_from_structure (GstRTSPPermissionsImpl * impl,
+ GstStructure * structure)
+{
+ guint i, len;
+ const gchar *role = gst_structure_get_name (structure);
+
+ len = impl->roles->len;
+ for (i = 0; i < len; i++) {
+ GstStructure *entry = g_ptr_array_index (impl->roles, i);
+
+ if (gst_structure_has_name (entry, role)) {
+ g_ptr_array_remove_index_fast (impl->roles, i);
+ break;
+ }
+ }
+
+ gst_structure_set_parent_refcount (structure,
+ &impl->permissions.mini_object.refcount);
+ g_ptr_array_add (impl->roles, structure);
+}
+
/**
* gst_rtsp_permissions_new:
*
@@ -214,7 +236,6 @@ gst_rtsp_permissions_add_role_valist (GstRTSPPermissions * permissions,
{
GstRTSPPermissionsImpl *impl = (GstRTSPPermissionsImpl *) permissions;
GstStructure *structure;
- guint i, len;
g_return_if_fail (GST_IS_RTSP_PERMISSIONS (permissions));
g_return_if_fail (gst_mini_object_is_writable (&permissions->mini_object));
@@ -223,19 +244,27 @@ gst_rtsp_permissions_add_role_valist (GstRTSPPermissions * permissions,
structure = gst_structure_new_valist (role, fieldname, var_args);
g_return_if_fail (structure != NULL);
- len = impl->roles->len;
- for (i = 0; i < len; i++) {
- GstStructure *entry = g_ptr_array_index (impl->roles, i);
+ add_role_from_structure (impl, structure);
+}
- if (gst_structure_has_name (entry, role)) {
- g_ptr_array_remove_index_fast (impl->roles, i);
- break;
- }
- }
+/**
+ * gst_rtsp_permissions_add_role_from_structure:
+ *
+ * Add a new role to @permissions based on @structure
+ */
+void
+gst_rtsp_permissions_add_role_from_structure (GstRTSPPermissions * permissions,
+ GstStructure * structure)
+{
+ GstRTSPPermissionsImpl *impl = (GstRTSPPermissionsImpl *) permissions;
+ GstStructure *copy;
- gst_structure_set_parent_refcount (structure,
- &impl->permissions.mini_object.refcount);
- g_ptr_array_add (impl->roles, structure);
+ g_return_if_fail (GST_IS_RTSP_PERMISSIONS (permissions));
+ g_return_if_fail (GST_IS_STRUCTURE (structure));
+
+ copy = gst_structure_copy (structure);
+
+ add_role_from_structure (impl, copy);
}
/**
diff --git a/gst/rtsp-server/rtsp-permissions.h b/gst/rtsp-server/rtsp-permissions.h
index 4bdff46..792e397 100644
--- a/gst/rtsp-server/rtsp-permissions.h
+++ b/gst/rtsp-server/rtsp-permissions.h
@@ -91,6 +91,9 @@ void gst_rtsp_permissions_add_role_empty (GstRTSPPermissions *
const gchar * role);
GST_EXPORT
+void gst_rtsp_permissions_add_role_from_structure (GstRTSPPermissions * permissions,
+ GstStructure *structure);
+GST_EXPORT
void gst_rtsp_permissions_add_permission_for_role (GstRTSPPermissions * permissions,
const gchar * role,
const gchar * permission,
diff --git a/tests/check/gst/permissions.c b/tests/check/gst/permissions.c
index 8083b1d..6f5ccf0 100644
--- a/tests/check/gst/permissions.c
+++ b/tests/check/gst/permissions.c
@@ -25,6 +25,7 @@ GST_START_TEST (test_permissions)
{
GstRTSPPermissions *perms;
GstRTSPPermissions *copy;
+ GstStructure *role_structure;
perms = gst_rtsp_permissions_new ();
fail_if (gst_rtsp_permissions_is_allowed (perms, "missing", "permission1"));
@@ -110,6 +111,14 @@ GST_START_TEST (test_permissions)
gst_rtsp_permissions_add_role_empty (perms, "noone");
fail_if (gst_rtsp_permissions_is_allowed (perms, "noone", "permission1"));
+ role_structure = gst_structure_new ("tester", "permission1", G_TYPE_BOOLEAN,
+ TRUE, NULL);
+ gst_rtsp_permissions_add_role_from_structure (perms, role_structure);
+ gst_structure_free (role_structure);
+ fail_unless (gst_rtsp_permissions_is_allowed (perms, "tester",
+ "permission1"));
+ fail_if (gst_rtsp_permissions_is_allowed (perms, "tester", "permission2"));
+
gst_rtsp_permissions_unref (perms);
}