X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgstchildproxy.c;h=22c5d1aa0ad977db54f84c0913740bcbe84c6e8a;hb=dac5966da6a0f53d0443dfa1ac239289028c415d;hp=3e153f38bb970ed3bd557b9ead06717a43d95c85;hpb=1d052f0ccef9872a2d7c82e4286298f34df13b95;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gstchildproxy.c b/gst/gstchildproxy.c index 3e153f3..22c5d1a 100644 --- a/gst/gstchildproxy.c +++ b/gst/gstchildproxy.c @@ -15,12 +15,13 @@ * * 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 */