aggregator: Assert if the sink/src pad type that is to be used is not a GstAggregator...
[platform/upstream/gstreamer.git] / gst / gstchildproxy.c
index 3e153f3..22c5d1a 100644 (file)
  *
  * You should have received a copy of the GNU Library General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 /**
  * SECTION:gstchildproxy
+ * @title: GstChildProxy
  * @short_description: Interface for multi child elements.
  * @see_also: #GstBin
  *
@@ -100,7 +101,7 @@ gst_child_proxy_default_get_child_by_name (GstChildProxy * parent,
 /**
  * gst_child_proxy_get_child_by_name:
  * @parent: the parent object to get the child from
- * @name: the childs name
+ * @name: the child's name
  *
  * Looks up a child element by the given name.
  *
@@ -108,39 +109,51 @@ gst_child_proxy_default_get_child_by_name (GstChildProxy * parent,
  * together with gst_object_get_name(). If the interface is to be used with
  * #GObjects, this methods needs to be overridden.
  *
- * Returns: (transfer full): the child object or %NULL if not found. Unref
- *     after usage.
+ * Returns: (transfer full) (nullable): the child object or %NULL if
+ *     not found. Unref after usage.
  *
  * MT safe.
  */
 GObject *
 gst_child_proxy_get_child_by_name (GstChildProxy * parent, const gchar * name)
 {
+  GstChildProxyInterface *iface;
+
   g_return_val_if_fail (GST_IS_CHILD_PROXY (parent), 0);
 
-  return (GST_CHILD_PROXY_GET_INTERFACE (parent)->get_child_by_name (parent,
-          name));
+  iface = GST_CHILD_PROXY_GET_INTERFACE (parent);
+
+  if (iface->get_child_by_name != NULL)
+    return iface->get_child_by_name (parent, name);
+
+  return NULL;
 }
 
 /**
  * gst_child_proxy_get_child_by_index:
  * @parent: the parent object to get the child from
- * @index: the childs position in the child list
+ * @index: the child's position in the child list
  *
  * Fetches a child by its number.
  *
- * Returns: (transfer full): the child object or %NULL if not found (index
- *     too high). Unref after usage.
+ * Returns: (transfer full) (nullable): the child object or %NULL if
+ *     not found (index too high). Unref after usage.
  *
  * MT safe.
  */
 GObject *
 gst_child_proxy_get_child_by_index (GstChildProxy * parent, guint index)
 {
+  GstChildProxyInterface *iface;
+
   g_return_val_if_fail (GST_IS_CHILD_PROXY (parent), NULL);
 
-  return (GST_CHILD_PROXY_GET_INTERFACE (parent)->get_child_by_index (parent,
-          index));
+  iface = GST_CHILD_PROXY_GET_INTERFACE (parent);
+
+  if (iface->get_child_by_index != NULL)
+    return iface->get_child_by_index (parent, index);
+
+  return NULL;
 }
 
 /**
@@ -156,76 +169,87 @@ gst_child_proxy_get_child_by_index (GstChildProxy * parent, guint index)
 guint
 gst_child_proxy_get_children_count (GstChildProxy * parent)
 {
+  GstChildProxyInterface *iface;
+
   g_return_val_if_fail (GST_IS_CHILD_PROXY (parent), 0);
 
-  return (GST_CHILD_PROXY_GET_INTERFACE (parent)->get_children_count (parent));
+  iface = GST_CHILD_PROXY_GET_INTERFACE (parent);
+
+  if (iface->get_children_count != NULL)
+    return iface->get_children_count (parent);
+
+  return 0;
 }
 
 /**
  * gst_child_proxy_lookup:
- * @object: object to lookup the property in
+ * @object: child proxy object to lookup the property in
  * @name: name of the property to look up
  * @target: (out) (allow-none) (transfer full): pointer to a #GObject that
  *     takes the real object to set property on
- * @pspec: (out) (allow-none) (transfer full): pointer to take the #GParamSpec
+ * @pspec: (out) (allow-none) (transfer none): pointer to take the #GParamSpec
  *     describing the property
  *
  * Looks up which object and #GParamSpec would be effected by the given @name.
  *
- * Returns: TRUE if @target and @pspec could be found. FALSE otherwise. In that
- * case the values for @pspec and @target are not modified. Unref @target after
- * usage.
- *
  * MT safe.
+ *
+ * Returns: %TRUE if @target and @pspec could be found. %FALSE otherwise. In that
+ * case the values for @pspec and @target are not modified. Unref @target after
+ * usage. For plain GObjects @target is the same as @object.
  */
 gboolean
-gst_child_proxy_lookup (GObject * object, const gchar * name,
+gst_child_proxy_lookup (GstChildProxy * object, const gchar * name,
     GObject ** target, GParamSpec ** pspec)
 {
+  GObject *obj;
   gboolean res = FALSE;
   gchar **names, **current;
 
-  g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+  g_return_val_if_fail (GST_IS_CHILD_PROXY (object), FALSE);
   g_return_val_if_fail (name != NULL, FALSE);
 
-  gst_object_ref (object);
+  obj = G_OBJECT (g_object_ref (object));
 
   current = names = g_strsplit (name, "::", -1);
+  /* find the owner of the property */
   while (current[1]) {
     GObject *next;
 
-    if (!GST_IS_CHILD_PROXY (object)) {
+    if (!GST_IS_CHILD_PROXY (obj)) {
       GST_INFO
           ("object %s is not a parent, so you cannot request a child by name %s",
-          (GST_IS_OBJECT (object) ? GST_OBJECT_NAME (object) : ""), current[0]);
+          (GST_IS_OBJECT (obj) ? GST_OBJECT_NAME (obj) : ""), current[0]);
       break;
     }
-    next = gst_child_proxy_get_child_by_name (GST_CHILD_PROXY (object),
+    next = gst_child_proxy_get_child_by_name (GST_CHILD_PROXY (obj),
         current[0]);
     if (!next) {
       GST_INFO ("no such object %s", current[0]);
       break;
     }
-    gst_object_unref (object);
-    object = next;
+    g_object_unref (obj);
+    obj = next;
     current++;
   }
+
+  /* look for psec */
   if (current[1] == NULL) {
     GParamSpec *spec =
-        g_object_class_find_property (G_OBJECT_GET_CLASS (object), current[0]);
+        g_object_class_find_property (G_OBJECT_GET_CLASS (obj), current[0]);
     if (spec == NULL) {
       GST_INFO ("no param spec named %s", current[0]);
     } else {
       if (pspec)
         *pspec = spec;
       if (target) {
-        gst_object_ref (object);
-        *target = object;
+        g_object_ref (obj);
+        *target = obj;
       }
       res = TRUE;
     }
   }
-  gst_object_unref (object);
+  g_object_unref (obj);
   g_strfreev (names);
   return res;
 }
@@ -240,21 +264,21 @@ gst_child_proxy_lookup (GObject * object, const gchar * name,
  * You are responsible for freeing it by calling g_value_unset()
  */
 void
-gst_child_proxy_get_property (GObject * object, const gchar * name,
+gst_child_proxy_get_property (GstChildProxy * object, const gchar * name,
     GValue * value)
 {
   GParamSpec *pspec;
   GObject *target;
 
-  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (GST_IS_CHILD_PROXY (object));
   g_return_if_fail (name != NULL);
   g_return_if_fail (G_IS_VALUE (value));
 
   if (!gst_child_proxy_lookup (object, name, &target, &pspec))
     goto not_found;
 
-  g_object_get_property (G_OBJECT (target), pspec->name, value);
-  gst_object_unref (target);
+  g_object_get_property (target, pspec->name, value);
+  g_object_unref (target);
 
   return;
 
@@ -270,12 +294,12 @@ not_found:
  * gst_child_proxy_get_valist:
  * @object: the object to query
  * @first_property_name: name of the first property to get
- * @var_args: return location for the first property, followed optionally by more name/return location pairs, followed by NULL
+ * @var_args: return location for the first property, followed optionally by more name/return location pairs, followed by %NULL
  *
  * Gets properties of the parent object and its children.
  */
 void
-gst_child_proxy_get_valist (GObject * object,
+gst_child_proxy_get_valist (GstChildProxy * object,
     const gchar * first_property_name, va_list var_args)
 {
   const gchar *name;
@@ -284,7 +308,7 @@ gst_child_proxy_get_valist (GObject * object,
   GParamSpec *pspec;
   GObject *target;
 
-  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (GST_IS_CHILD_PROXY (object));
 
   name = first_property_name;
 
@@ -294,8 +318,8 @@ gst_child_proxy_get_valist (GObject * object,
       goto not_found;
 
     g_value_init (&value, pspec->value_type);
-    g_object_get_property (G_OBJECT (target), pspec->name, &value);
-    gst_object_unref (target);
+    g_object_get_property (target, pspec->name, &value);
+    g_object_unref (target);
 
     G_VALUE_LCOPY (&value, var_args, 0, &error);
     if (error)
@@ -324,16 +348,17 @@ cant_copy:
  * gst_child_proxy_get:
  * @object: the parent object
  * @first_property_name: name of the first property to get
- * @...: return location for the first property, followed optionally by more name/return location pairs, followed by NULL
+ * @...: return location for the first property, followed optionally by more name/return location pairs, followed by %NULL
  *
  * Gets properties of the parent object and its children.
  */
 void
-gst_child_proxy_get (GObject * object, const gchar * first_property_name, ...)
+gst_child_proxy_get (GstChildProxy * object, const gchar * first_property_name,
+    ...)
 {
   va_list var_args;
 
-  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (GST_IS_CHILD_PROXY (object));
 
   va_start (var_args, first_property_name);
   gst_child_proxy_get_valist (object, first_property_name, var_args);
@@ -349,21 +374,21 @@ gst_child_proxy_get (GObject * object, const gchar * first_property_name, ...)
  * Sets a single property using the GstChildProxy mechanism.
  */
 void
-gst_child_proxy_set_property (GObject * object, const gchar * name,
+gst_child_proxy_set_property (GstChildProxy * object, const gchar * name,
     const GValue * value)
 {
   GParamSpec *pspec;
   GObject *target;
 
-  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (GST_IS_CHILD_PROXY (object));
   g_return_if_fail (name != NULL);
   g_return_if_fail (G_IS_VALUE (value));
 
   if (!gst_child_proxy_lookup (object, name, &target, &pspec))
     goto not_found;
 
-  g_object_set_property (G_OBJECT (target), pspec->name, value);
-  gst_object_unref (target);
+  g_object_set_property (target, pspec->name, value);
+  g_object_unref (target);
   return;
 
 not_found:
@@ -378,12 +403,12 @@ not_found:
  * gst_child_proxy_set_valist:
  * @object: the parent object
  * @first_property_name: name of the first property to set
- * @var_args: value for the first property, followed optionally by more name/value pairs, followed by NULL
+ * @var_args: value for the first property, followed optionally by more name/value pairs, followed by %NULL
  *
  * Sets properties of the parent object and its children.
  */
 void
-gst_child_proxy_set_valist (GObject * object,
+gst_child_proxy_set_valist (GstChildProxy * object,
     const gchar * first_property_name, va_list var_args)
 {
   const gchar *name;
@@ -392,7 +417,7 @@ gst_child_proxy_set_valist (GObject * object,
   GParamSpec *pspec;
   GObject *target;
 
-  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (GST_IS_CHILD_PROXY (object));
 
   name = first_property_name;
 
@@ -407,8 +432,8 @@ gst_child_proxy_set_valist (GObject * object,
     if (error)
       goto cant_copy;
 
-    g_object_set_property (G_OBJECT (target), pspec->name, &value);
-    gst_object_unref (target);
+    g_object_set_property (target, pspec->name, &value);
+    g_object_unref (target);
 
     g_value_unset (&value);
     name = va_arg (var_args, gchar *);
@@ -426,7 +451,8 @@ cant_copy:
     g_warning ("error copying value %s in object %s: %s", pspec->name,
         (GST_IS_OBJECT (object) ? GST_OBJECT_NAME (object) : ""), error);
     g_value_unset (&value);
-    gst_object_unref (target);
+    g_object_unref (target);
+    g_free (error);
     return;
   }
 }
@@ -435,16 +461,17 @@ cant_copy:
  * gst_child_proxy_set:
  * @object: the parent object
  * @first_property_name: name of the first property to set
- * @...: value for the first property, followed optionally by more name/value pairs, followed by NULL
+ * @...: value for the first property, followed optionally by more name/value pairs, followed by %NULL
  *
  * Sets properties of the parent object and its children.
  */
 void
-gst_child_proxy_set (GObject * object, const gchar * first_property_name, ...)
+gst_child_proxy_set (GstChildProxy * object, const gchar * first_property_name,
+    ...)
 {
   va_list var_args;
 
-  g_return_if_fail (G_IS_OBJECT (object));
+  g_return_if_fail (GST_IS_CHILD_PROXY (object));
 
   va_start (var_args, first_property_name);
   gst_child_proxy_set_valist (object, first_property_name, var_args);
@@ -453,32 +480,32 @@ gst_child_proxy_set (GObject * object, const gchar * first_property_name, ...)
 
 /**
  * gst_child_proxy_child_added:
- * @object: the parent object
+ * @parent: the parent object
  * @child: the newly added child
  * @name: the name of the new child
  *
  * Emits the "child-added" signal.
  */
 void
-gst_child_proxy_child_added (GObject * object, GObject * child,
+gst_child_proxy_child_added (GstChildProxy * parent, GObject * child,
     const gchar * name)
 {
-  g_signal_emit (G_OBJECT (object), signals[CHILD_ADDED], 0, child, name);
+  g_signal_emit (parent, signals[CHILD_ADDED], 0, child, name);
 }
 
 /**
  * gst_child_proxy_child_removed:
- * @object: the parent object
+ * @parent: the parent object
  * @child: the removed child
  * @name: the name of the old child
  *
  * Emits the "child-removed" signal.
  */
 void
-gst_child_proxy_child_removed (GObject * object, GObject * child,
+gst_child_proxy_child_removed (GstChildProxy * parent, GObject * child,
     const gchar * name)
 {
-  g_signal_emit (G_OBJECT (object), signals[CHILD_REMOVED], 0, child, name);
+  g_signal_emit (parent, signals[CHILD_REMOVED], 0, child, name);
 }
 
 /* gobject methods */