diff options
Diffstat (limited to 'libgupnp-dlna/gupnp-dlna-information.c')
-rw-r--r-- | libgupnp-dlna/gupnp-dlna-information.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/libgupnp-dlna/gupnp-dlna-information.c b/libgupnp-dlna/gupnp-dlna-information.c new file mode 100644 index 0000000..5585893 --- /dev/null +++ b/libgupnp-dlna/gupnp-dlna-information.c @@ -0,0 +1,265 @@ +/* + * Copyright (C) 2010 Nokia Corporation. + * + * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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. + */ + +#include "gupnp-dlna-information.h" +#include <gst/gstminiobject.h> + +/** + * SECTION:gupnp-dlna-information + * @short_description: Object containing metadata information returned by the + * #GUPnPDLNADiscoverer API + * + * The GUPnPDLNAInformation object holds metadata information discovered by the + * GUPnPDiscoverer API. The DLNA profile name and MIME type have their own + * fields, and other metadata is held in a GstDiscovererInfo structure. + * All fields are read-only. + */ + +G_DEFINE_TYPE (GUPnPDLNAInformation, gupnp_dlna_information, G_TYPE_OBJECT) + +#define GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + GUPNP_TYPE_DLNA_INFORMATION, \ + GUPnPDLNAInformationPrivate)) + +typedef struct _GUPnPDLNAInformationPrivate GUPnPDLNAInformationPrivate; + +struct _GUPnPDLNAInformationPrivate { + GstDiscovererInfo *info; + gchar *name; + gchar *mime; +}; + +enum { + PROP_0, + PROP_DLNA_NAME, + PROP_DLNA_MIME, + PROP_DISCOVERER_INFO, +}; + +static void +gupnp_dlna_information_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GUPnPDLNAInformation *self = GUPNP_DLNA_INFORMATION (object); + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + switch (property_id) { + case PROP_DLNA_NAME: + g_value_set_string (value, priv->name); + + break; + + case PROP_DLNA_MIME: + g_value_set_string (value, priv->mime); + + break; + + case PROP_DISCOVERER_INFO: + gst_value_set_mini_object (value, + GST_MINI_OBJECT(priv->info)); + + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, + property_id, + pspec); + + break; + } +} + +static void +gupnp_dlna_information_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GUPnPDLNAInformation *self = GUPNP_DLNA_INFORMATION (object); + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + switch (property_id) { + case PROP_DLNA_NAME: + g_free (priv->name); + priv->name = g_value_dup_string (value); + + break; + + case PROP_DLNA_MIME: + g_free (priv->mime); + priv->mime = g_value_dup_string (value); + + break; + + case PROP_DISCOVERER_INFO: + if (priv->info) + gst_discoverer_info_unref (priv->info); + priv->info = GST_DISCOVERER_INFO + (gst_value_dup_mini_object (value)); + + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, + property_id, + pspec); + + break; + } +} + + +static void +gupnp_dlna_information_finalize (GObject *object) +{ + GUPnPDLNAInformation *self = GUPNP_DLNA_INFORMATION (object); + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + g_free (priv->name); + g_free (priv->mime); + if (priv->info) + gst_discoverer_info_unref (priv->info); + + G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->finalize (object); +} + +static void +gupnp_dlna_information_class_init (GUPnPDLNAInformationClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; + + g_type_class_add_private (klass, sizeof (GUPnPDLNAInformationPrivate)); + + object_class->get_property = gupnp_dlna_information_get_property; + object_class->set_property = gupnp_dlna_information_set_property; + object_class->finalize = gupnp_dlna_information_finalize; + + pspec = g_param_spec_string ("name", + "DLNA profile name", + "The name of the DLNA profile " + "corresponding to the strream", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_DLNA_NAME, pspec); + + pspec = g_param_spec_string ("mime", + "DLNA profile MIME type corresponding " + "to the stream", + "The DLNA MIME type of the stream", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_DLNA_MIME, pspec); + + pspec = gst_param_spec_mini_object ("info", + "Stream metadata", + "Metadata of the stream in a " + "GstDiscovererInfo structure", + GST_TYPE_DISCOVERER_INFO, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, + PROP_DISCOVERER_INFO, + pspec); +} + +static void +gupnp_dlna_information_init (GUPnPDLNAInformation *self) +{ + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + priv->name = NULL; + priv->mime = NULL; + priv->info = NULL; +} + +/** + * gupnp_dlna_information_new: + * @name: DLNA media profile name corresponding to the media + * @mime: DLNA MIME type for the media + * @info: #GstDiscovererInfo type with additional metadata about the + * stream + * + * Creates a new #GUPnPDLNAInformation object with the given properties. + * + * Returns: A newly created #GUPnPDLNAInformation object. + */ +GUPnPDLNAInformation* +gupnp_dlna_information_new (gchar *name, + gchar *mime, + GstDiscovererInfo *info) +{ + return g_object_new (GUPNP_TYPE_DLNA_INFORMATION, + "name", name, + "mime", mime, + "info", info, + NULL); +} + +/** + * gupnp_dlna_information_get_name: + * @self: The #GUPnPDLNAInformation object + * + * Returns: the DLNA profile name of the stream represented by @self. Do not + * free this string. + */ +const gchar * +gupnp_dlna_information_get_name (GUPnPDLNAInformation *self) +{ + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + return priv->name; +} + +/** + * gupnp_dlna_information_get_mime: + * @self: The #GUPnPDLNAInformation object + * + * Returns: the DLNA MIME type of the stream represented by @self. Do not + * free this string. + */ +const gchar * +gupnp_dlna_information_get_mime (GUPnPDLNAInformation *self) +{ + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + return priv->mime; +} + +/**finalize + * gupnp_dlna_information_get_info: + * @self: The #GUPnPDLNAInformation object + * + * Returns: additional stream metadata for @self in the form of a + * #GstDiscovererInfo structure. Do not free this structure. + */ +const GstDiscovererInfo * +gupnp_dlna_information_get_info (GUPnPDLNAInformation *self) +{ + GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self); + + return priv->info; +} |