summaryrefslogtreecommitdiff
path: root/libgupnp-dlna/gupnp-dlna-information.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgupnp-dlna/gupnp-dlna-information.c')
-rw-r--r--libgupnp-dlna/gupnp-dlna-information.c408
1 files changed, 408 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..7d1ea8d
--- /dev/null
+++ b/libgupnp-dlna/gupnp-dlna-information.c
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-dlna-information
+ * @short_description: Base class for storing various types of
+ * metadata informations.
+ *
+ * Subclasses of #GUPnPDLNAInformation should override all virtual
+ * functions provided by this class. The overrides should return a
+ * subclasses of specific information base classes.
+ *
+ * When instantiating a subclass of #GUPnPDLNAInformation make sure
+ * that "uri" with a URI to media file is passed to g_object_new().
+ */
+
+#include "gupnp-dlna-information.h"
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAInformation,
+ gupnp_dlna_information,
+ G_TYPE_OBJECT)
+
+struct _GUPnPDLNAInformationPrivate {
+ gchar* uri;
+ gboolean got_audio_info;
+ gboolean got_container_info;
+ gboolean got_image_info;
+ gboolean got_video_info;
+ GUPnPDLNAAudioInformation *audio_info;
+ GUPnPDLNAContainerInformation *container_info;
+ GUPnPDLNAImageInformation *image_info;
+ GUPnPDLNAVideoInformation *video_info;
+};
+
+enum {
+ PROP_0,
+
+ PROP_URI,
+ PROP_AUDIO_INFO,
+ PROP_CONTAINER_INFO,
+ PROP_IMAGE_INFO,
+ PROP_VIDEO_INFO
+};
+
+static void
+gupnp_dlna_information_dispose (GObject *object)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+ GUPnPDLNAInformationPrivate *priv = info->priv;
+
+ g_clear_object (&priv->audio_info);
+ g_clear_object (&priv->container_info);
+ g_clear_object (&priv->image_info);
+ g_clear_object (&priv->video_info);
+ G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->dispose (object);
+}
+
+static void
+gupnp_dlna_information_finalize (GObject *object)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+
+ g_free (info->priv->uri);
+ G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->finalize (object);
+}
+
+static void
+gupnp_dlna_information_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+ GUPnPDLNAInformationPrivate *priv = info->priv;
+
+ switch (property_id) {
+ case PROP_URI:
+ g_free (priv->uri);
+ priv->uri = g_value_dup_string (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gupnp_dlna_information_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+ GUPnPDLNAInformationPrivate *priv = info->priv;
+
+ switch (property_id) {
+ case PROP_URI:
+ g_value_set_string (value, priv->uri);
+
+ break;
+ case PROP_AUDIO_INFO:
+ g_value_set_object
+ (value,
+ gupnp_dlna_information_get_audio_information (info));
+
+ break;
+ case PROP_CONTAINER_INFO:
+ g_value_set_object
+ (value,
+ gupnp_dlna_information_get_container_information (info));
+
+ break;
+ case PROP_IMAGE_INFO:
+ g_value_set_object
+ (value,
+ gupnp_dlna_information_get_image_information (info));
+
+ break;
+ case PROP_VIDEO_INFO:
+ g_value_set_object
+ (value,
+ gupnp_dlna_information_get_video_information (info));
+
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+
+ break;
+ }
+}
+
+static void
+gupnp_dlna_information_class_init (GUPnPDLNAInformationClass *info_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (info_class);
+ GParamSpec *pspec;
+
+ object_class->dispose = gupnp_dlna_information_dispose;
+ object_class->finalize = gupnp_dlna_information_finalize;
+ object_class->set_property = gupnp_dlna_information_set_property;
+ object_class->get_property = gupnp_dlna_information_get_property;
+ info_class->get_container_information = NULL;
+ info_class->get_image_information = NULL;
+ info_class->get_video_information = NULL;
+ info_class->get_audio_information = NULL;
+
+ /**
+ * GUPnPDLNAInformation:uri:
+ *
+ * URI of file which metadata this object stores.
+ */
+ pspec = g_param_spec_string ("uri",
+ "uri",
+ "URI of file which metadata this object "
+ "stores",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_URI, pspec);
+
+ /**
+ * GUPnPDLNAInformation:audio-information:
+ *
+ * Audio information of a file.
+ */
+ pspec = g_param_spec_object ("audio-information",
+ "Audio information",
+ "Audio information of a file",
+ GUPNP_TYPE_DLNA_AUDIO_INFORMATION,
+ G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_AUDIO_INFO, pspec);
+
+ /**
+ * GUPnPDLNAInformation:container-information:
+ *
+ * Container information of a file.
+ */
+ pspec = g_param_spec_object ("container-information",
+ "Container information",
+ "Container information of a file",
+ GUPNP_TYPE_DLNA_CONTAINER_INFORMATION,
+ G_PARAM_READABLE);
+ g_object_class_install_property (object_class,
+ PROP_CONTAINER_INFO,
+ pspec);
+
+ /**
+ * GUPnPDLNAInformation:image-information:
+ *
+ * Image information of a file.
+ */
+ pspec = g_param_spec_object ("image-information",
+ "Image information",
+ "Image information of a file",
+ GUPNP_TYPE_DLNA_IMAGE_INFORMATION,
+ G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_IMAGE_INFO, pspec);
+
+ /**
+ * GUPnPDLNAInformation:video-information:
+ *
+ * Video information of a file.
+ */
+ pspec = g_param_spec_object ("video-information",
+ "Video information",
+ "Video information of a file",
+ GUPNP_TYPE_DLNA_VIDEO_INFORMATION,
+ G_PARAM_READABLE);
+ g_object_class_install_property (object_class, PROP_VIDEO_INFO, pspec);
+
+ g_type_class_add_private (info_class,
+ sizeof (GUPnPDLNAInformationPrivate));
+}
+
+static void
+gupnp_dlna_information_init (GUPnPDLNAInformation *info)
+{
+ GUPnPDLNAInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+ (info,
+ GUPNP_TYPE_DLNA_INFORMATION,
+ GUPnPDLNAInformationPrivate);
+
+ priv->uri = NULL;
+ priv->got_audio_info = FALSE;
+ priv->got_container_info = FALSE;
+ priv->got_image_info = FALSE;
+ priv->got_video_info = FALSE;
+ priv->audio_info = NULL;
+ priv->container_info = NULL;
+ priv->image_info = NULL;
+ priv->video_info = NULL;
+ info->priv = priv;
+}
+
+/**
+ * gupnp_dlna_information_get_audio_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an audio information of media file if applicable (e.g. for
+ * video and audio files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAAudioInformation object or %NULL.
+ */
+GUPnPDLNAAudioInformation *
+gupnp_dlna_information_get_audio_information (GUPnPDLNAInformation *info)
+{
+ GUPnPDLNAInformationPrivate *priv;
+
+ g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+ priv = info->priv;
+ if (!priv->got_audio_info) {
+ GUPnPDLNAInformationClass *info_class;
+
+ info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+ g_return_val_if_fail
+ (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+ NULL);
+ g_return_val_if_fail (info_class->get_audio_information != NULL,
+ NULL);
+
+ priv->audio_info = info_class->get_audio_information (info);
+ priv->got_audio_info = TRUE;
+ }
+
+ return priv->audio_info;
+}
+
+/**
+ * gupnp_dlna_information_get_container_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * video and audio files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAContainerInformation object or %NULL.
+ */
+GUPnPDLNAContainerInformation *
+gupnp_dlna_information_get_container_information (GUPnPDLNAInformation *info)
+{
+ GUPnPDLNAInformationPrivate *priv;
+
+ g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+ priv = info->priv;
+ if (!priv->got_container_info) {
+ GUPnPDLNAInformationClass *info_class;
+
+ info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+ g_return_val_if_fail
+ (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+ NULL);
+ g_return_val_if_fail
+ (info_class->get_container_information != NULL,
+ NULL);
+
+ priv->container_info =
+ info_class->get_container_information (info);
+ priv->got_container_info = TRUE;
+ }
+
+ return priv->container_info;
+}
+
+/**
+ * gupnp_dlna_information_get_image_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * image files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAImageInformation object or %NULL.
+ */
+GUPnPDLNAImageInformation *
+gupnp_dlna_information_get_image_information (GUPnPDLNAInformation *info)
+{
+ GUPnPDLNAInformationPrivate *priv;
+
+ g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+ priv = info->priv;
+ if (!priv->got_image_info) {
+ GUPnPDLNAInformationClass *info_class;
+
+ info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+ g_return_val_if_fail
+ (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+ NULL);
+ g_return_val_if_fail (info_class->get_image_information != NULL,
+ NULL);
+
+ priv->image_info = info_class->get_image_information (info);
+ priv->got_image_info = TRUE;
+ }
+
+ return priv->image_info;
+}
+
+/**
+ * gupnp_dlna_information_get_video_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * video files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAVideoInformation object or %NULL.
+ */
+GUPnPDLNAVideoInformation *
+gupnp_dlna_information_get_video_information (GUPnPDLNAInformation *info)
+{
+ GUPnPDLNAInformationPrivate *priv;
+
+ g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+ priv = info->priv;
+ if (!priv->got_video_info) {
+ GUPnPDLNAInformationClass *info_class;
+
+ info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+ g_return_val_if_fail
+ (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+ NULL);
+ g_return_val_if_fail (info_class->get_video_information != NULL,
+ NULL);
+
+ priv->video_info = info_class->get_video_information (info);
+ priv->got_video_info = TRUE;
+ }
+
+ return priv->video_info;
+}
+
+/**
+ * gupnp_dlna_information_get_uri:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Returns: (transfer none): An URI of a file.
+ */
+const gchar *
+gupnp_dlna_information_get_uri (GUPnPDLNAInformation *info)
+{
+ g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+ return info->priv->uri;
+}