|
Packit |
4b6dd7 |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
4b6dd7 |
/*
|
|
Packit |
4b6dd7 |
* GData Client
|
|
Packit |
4b6dd7 |
* Copyright (C) Philip Withnall 2009–2010 <philip@tecnocode.co.uk>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is free software; you can redistribute it and/or
|
|
Packit |
4b6dd7 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License as published by the Free Software Foundation; either
|
|
Packit |
4b6dd7 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is distributed in the hope that it will be useful,
|
|
Packit |
4b6dd7 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4b6dd7 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4b6dd7 |
* Lesser General Public License for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License along with GData Client. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* SECTION:gdata-media-content
|
|
Packit |
4b6dd7 |
* @short_description: Media RSS content element
|
|
Packit |
4b6dd7 |
* @stability: Stable
|
|
Packit |
4b6dd7 |
* @include: gdata/media/gdata-media-content.h
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataMediaContent represents a "content" element from the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The class only implements parsing, not XML output, at the moment.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <glib.h>
|
|
Packit |
4b6dd7 |
#include <libxml/parser.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include "gdata-media-content.h"
|
|
Packit |
4b6dd7 |
#include "gdata-download-stream.h"
|
|
Packit |
4b6dd7 |
#include "gdata-parsable.h"
|
|
Packit |
4b6dd7 |
#include "gdata-parser.h"
|
|
Packit |
4b6dd7 |
#include "gdata-media-enums.h"
|
|
Packit |
4b6dd7 |
#include "gdata-private.h"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void gdata_media_content_finalize (GObject *object);
|
|
Packit |
4b6dd7 |
static void gdata_media_content_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static gboolean pre_parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *root_node, gpointer user_data, GError **error);
|
|
Packit |
4b6dd7 |
static void get_namespaces (GDataParsable *parsable, GHashTable *namespaces);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct _GDataMediaContentPrivate {
|
|
Packit |
4b6dd7 |
gchar *uri;
|
|
Packit |
4b6dd7 |
gsize filesize;
|
|
Packit |
4b6dd7 |
gchar *content_type;
|
|
Packit |
4b6dd7 |
GDataMediaMedium medium;
|
|
Packit |
4b6dd7 |
gboolean is_default;
|
|
Packit |
4b6dd7 |
GDataMediaExpression expression;
|
|
Packit |
4b6dd7 |
gint64 duration;
|
|
Packit |
4b6dd7 |
guint height;
|
|
Packit |
4b6dd7 |
guint width;
|
|
Packit |
4b6dd7 |
/* TODO: implement other properties from the Media RSS standard */
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
enum {
|
|
Packit |
4b6dd7 |
PROP_URI = 1,
|
|
Packit |
4b6dd7 |
PROP_FILESIZE,
|
|
Packit |
4b6dd7 |
PROP_CONTENT_TYPE,
|
|
Packit |
4b6dd7 |
PROP_MEDIUM,
|
|
Packit |
4b6dd7 |
PROP_IS_DEFAULT,
|
|
Packit |
4b6dd7 |
PROP_EXPRESSION,
|
|
Packit |
4b6dd7 |
PROP_DURATION,
|
|
Packit |
4b6dd7 |
PROP_HEIGHT,
|
|
Packit |
4b6dd7 |
PROP_WIDTH
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_DEFINE_TYPE (GDataMediaContent, gdata_media_content, GDATA_TYPE_PARSABLE)
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_media_content_class_init (GDataMediaContentClass *klass)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_type_class_add_private (klass, sizeof (GDataMediaContentPrivate));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gobject_class->get_property = gdata_media_content_get_property;
|
|
Packit |
4b6dd7 |
gobject_class->finalize = gdata_media_content_finalize;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
parsable_class->pre_parse_xml = pre_parse_xml;
|
|
Packit |
4b6dd7 |
parsable_class->get_namespaces = get_namespaces;
|
|
Packit |
4b6dd7 |
parsable_class->element_name = "content";
|
|
Packit |
4b6dd7 |
parsable_class->element_namespace = "media";
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:uri:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The direct URI to the media object.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_URI,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("uri",
|
|
Packit |
4b6dd7 |
"URI", "The direct URI to the media object.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:filesize:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The number of bytes of the media object.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_FILESIZE,
|
|
Packit |
4b6dd7 |
g_param_spec_ulong ("filesize",
|
|
Packit |
4b6dd7 |
"Filesize", "The number of bytes of the media object.",
|
|
Packit |
4b6dd7 |
0, G_MAXULONG, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:content-type:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The standard MIME type of the object.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("content-type",
|
|
Packit |
4b6dd7 |
"Content type", "The standard MIME type of the object.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:medium:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The type of object, complementing #GDataMediaContent:content-type. It allows the consuming application to make simpler decisions between
|
|
Packit |
4b6dd7 |
* different content objects, based on whether they're a video or audio stream, for example.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_MEDIUM,
|
|
Packit |
4b6dd7 |
g_param_spec_enum ("medium",
|
|
Packit |
4b6dd7 |
"Medium", "The type of object.",
|
|
Packit |
4b6dd7 |
GDATA_TYPE_MEDIA_MEDIUM, GDATA_MEDIA_UNKNOWN,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:is-default:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Determines if this is the default content for the media group. There should only be one default object per media group.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_IS_DEFAULT,
|
|
Packit |
4b6dd7 |
g_param_spec_boolean ("is-default",
|
|
Packit |
4b6dd7 |
"Default?", "Determines if this is the default content for the media group.",
|
|
Packit |
4b6dd7 |
FALSE,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:expression:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Determines if the object is a sample or the full version of the object, or even if it is a continuous stream.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_EXPRESSION,
|
|
Packit |
4b6dd7 |
g_param_spec_enum ("expression",
|
|
Packit |
4b6dd7 |
"Expression", "Determines if the object is a sample or the full version of the object.",
|
|
Packit |
4b6dd7 |
GDATA_TYPE_MEDIA_EXPRESSION, GDATA_MEDIA_EXPRESSION_FULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:duration:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The number of seconds for which the media object plays.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_DURATION,
|
|
Packit |
4b6dd7 |
g_param_spec_int64 ("duration",
|
|
Packit |
4b6dd7 |
"Duration", "The number of seconds for which the media object plays.",
|
|
Packit |
4b6dd7 |
0, G_MAXINT64, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:height:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The height of the media object.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_HEIGHT,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("height",
|
|
Packit |
4b6dd7 |
"Height", "The height of the media object.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataMediaContent:width:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The width of the media object.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_WIDTH,
|
|
Packit |
4b6dd7 |
g_param_spec_uint ("width",
|
|
Packit |
4b6dd7 |
"Width", "The width of the media object.",
|
|
Packit |
4b6dd7 |
0, G_MAXUINT, 0,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_media_content_init (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_MEDIA_CONTENT, GDataMediaContentPrivate);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_media_content_finalize (GObject *object)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataMediaContentPrivate *priv = GDATA_MEDIA_CONTENT (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (priv->uri);
|
|
Packit |
4b6dd7 |
g_free (priv->content_type);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
G_OBJECT_CLASS (gdata_media_content_parent_class)->finalize (object);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_media_content_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataMediaContentPrivate *priv = GDATA_MEDIA_CONTENT (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (property_id) {
|
|
Packit |
4b6dd7 |
case PROP_URI:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->uri);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_FILESIZE:
|
|
Packit |
4b6dd7 |
g_value_set_ulong (value, priv->filesize);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_CONTENT_TYPE:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->content_type);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_MEDIUM:
|
|
Packit |
4b6dd7 |
g_value_set_enum (value, priv->medium);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_IS_DEFAULT:
|
|
Packit |
4b6dd7 |
g_value_set_boolean (value, priv->is_default);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_EXPRESSION:
|
|
Packit |
4b6dd7 |
g_value_set_enum (value, priv->expression);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_DURATION:
|
|
Packit |
4b6dd7 |
g_value_set_int64 (value, priv->duration);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_HEIGHT:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->height);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_WIDTH:
|
|
Packit |
4b6dd7 |
g_value_set_uint (value, priv->width);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
/* We don't have any other property... */
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
pre_parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *root_node, gpointer user_data, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataMediaContentPrivate *priv = GDATA_MEDIA_CONTENT (parsable)->priv;
|
|
Packit |
4b6dd7 |
xmlChar *uri, *expression, *medium, *duration, *filesize, *height, *width;
|
|
Packit |
4b6dd7 |
gboolean is_default_bool;
|
|
Packit |
4b6dd7 |
GDataMediaExpression expression_enum;
|
|
Packit |
4b6dd7 |
GDataMediaMedium medium_enum;
|
|
Packit |
4b6dd7 |
guint height_uint, width_uint;
|
|
Packit |
4b6dd7 |
gint64 duration_int64;
|
|
Packit |
4b6dd7 |
gulong filesize_ulong;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse isDefault */
|
|
Packit |
4b6dd7 |
if (gdata_parser_boolean_from_property (root_node, "isDefault", &is_default_bool, 0, error) == FALSE)
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse expression */
|
|
Packit |
4b6dd7 |
expression = xmlGetProp (root_node, (xmlChar*) "expression");
|
|
Packit |
4b6dd7 |
if (expression == NULL || xmlStrcmp (expression, (xmlChar*) "full") == 0) {
|
|
Packit |
4b6dd7 |
expression_enum = GDATA_MEDIA_EXPRESSION_FULL;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (expression, (xmlChar*) "sample") == 0) {
|
|
Packit |
4b6dd7 |
expression_enum = GDATA_MEDIA_EXPRESSION_SAMPLE;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (expression, (xmlChar*) "nonstop") == 0) {
|
|
Packit |
4b6dd7 |
expression_enum = GDATA_MEDIA_EXPRESSION_NONSTOP;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
gdata_parser_error_unknown_property_value (root_node, "expression", (gchar*) expression, error);
|
|
Packit |
4b6dd7 |
xmlFree (expression);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
xmlFree (expression);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse medium */
|
|
Packit |
4b6dd7 |
medium = xmlGetProp (root_node, (xmlChar*) "medium");
|
|
Packit |
4b6dd7 |
if (medium == NULL) {
|
|
Packit |
4b6dd7 |
medium_enum = GDATA_MEDIA_UNKNOWN;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (medium, (xmlChar*) "image") == 0) {
|
|
Packit |
4b6dd7 |
medium_enum = GDATA_MEDIA_IMAGE;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (medium, (xmlChar*) "audio") == 0) {
|
|
Packit |
4b6dd7 |
medium_enum = GDATA_MEDIA_AUDIO;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (medium, (xmlChar*) "video") == 0) {
|
|
Packit |
4b6dd7 |
medium_enum = GDATA_MEDIA_VIDEO;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (medium, (xmlChar*) "document") == 0) {
|
|
Packit |
4b6dd7 |
medium_enum = GDATA_MEDIA_DOCUMENT;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (medium, (xmlChar*) "executable") == 0) {
|
|
Packit |
4b6dd7 |
medium_enum = GDATA_MEDIA_EXECUTABLE;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
gdata_parser_error_unknown_property_value (root_node, "medium", (gchar*) medium, error);
|
|
Packit |
4b6dd7 |
xmlFree (medium);
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
xmlFree (medium);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse duration */
|
|
Packit |
4b6dd7 |
duration = xmlGetProp (root_node, (xmlChar*) "duration");
|
|
Packit |
4b6dd7 |
duration_int64 = (duration == NULL) ? 0 : g_ascii_strtoll ((gchar*) duration, NULL, 10);
|
|
Packit |
4b6dd7 |
xmlFree (duration);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse filesize */
|
|
Packit |
4b6dd7 |
filesize = xmlGetProp (root_node, (xmlChar*) "fileSize");
|
|
Packit |
4b6dd7 |
filesize_ulong = (filesize == NULL) ? 0 : g_ascii_strtoull ((gchar*) filesize, NULL, 10);
|
|
Packit |
4b6dd7 |
xmlFree (filesize);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse height and width */
|
|
Packit |
4b6dd7 |
height = xmlGetProp (root_node, (xmlChar*) "height");
|
|
Packit |
4b6dd7 |
height_uint = (height == NULL) ? 0 : g_ascii_strtoull ((gchar*) height, NULL, 10);
|
|
Packit |
4b6dd7 |
xmlFree (height);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
width = xmlGetProp (root_node, (xmlChar*) "width");
|
|
Packit |
4b6dd7 |
width_uint = (width == NULL) ? 0 : g_ascii_strtoull ((gchar*) width, NULL, 10);
|
|
Packit |
4b6dd7 |
xmlFree (width);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Other properties */
|
|
Packit |
4b6dd7 |
uri = xmlGetProp (root_node, (xmlChar*) "url");
|
|
Packit |
4b6dd7 |
if (uri != NULL && *uri == '\0') {
|
|
Packit |
4b6dd7 |
xmlFree (uri);
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_property_missing (root_node, "url", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
priv->uri = (gchar*) uri;
|
|
Packit |
4b6dd7 |
priv->filesize = filesize_ulong;
|
|
Packit |
4b6dd7 |
priv->content_type = (gchar*) xmlGetProp (root_node, (xmlChar*) "type");
|
|
Packit |
4b6dd7 |
priv->medium = medium_enum;
|
|
Packit |
4b6dd7 |
priv->is_default = is_default_bool;
|
|
Packit |
4b6dd7 |
priv->expression = expression_enum;
|
|
Packit |
4b6dd7 |
priv->duration = duration_int64;
|
|
Packit |
4b6dd7 |
priv->height = height_uint;
|
|
Packit |
4b6dd7 |
priv->width = width_uint;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
get_namespaces (GDataParsable *parsable, GHashTable *namespaces)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_hash_table_insert (namespaces, (gchar*) "media", (gchar*) "http://search.yahoo.com/mrss/");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_uri:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:uri property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the content's URI
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_media_content_get_uri (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->uri;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_filesize:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:filesize property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the number of bytes in the content, or 0
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gsize
|
|
Packit |
4b6dd7 |
gdata_media_content_get_filesize (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->filesize;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_content_type:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:content-type property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the content's content (MIME) type, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_media_content_get_content_type (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->content_type;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_medium:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:medium property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the type of the content, or %GDATA_MEDIA_UNKNOWN
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataMediaMedium
|
|
Packit |
4b6dd7 |
gdata_media_content_get_medium (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), GDATA_MEDIA_UNKNOWN);
|
|
Packit |
4b6dd7 |
return self->priv->medium;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_is_default:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:is-default property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: %TRUE if the #GDataMediaContent is the default content for the media group, %FALSE otherwise
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gboolean
|
|
Packit |
4b6dd7 |
gdata_media_content_is_default (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), FALSE);
|
|
Packit |
4b6dd7 |
return self->priv->is_default;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_expression:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:expression property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the content's expression, or %GDATA_MEDIA_EXPRESSION_FULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataMediaExpression
|
|
Packit |
4b6dd7 |
gdata_media_content_get_expression (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), GDATA_MEDIA_EXPRESSION_FULL);
|
|
Packit |
4b6dd7 |
return self->priv->expression;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_duration:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:duration property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the content's duration in seconds, or 0
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gint64
|
|
Packit |
4b6dd7 |
gdata_media_content_get_duration (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->duration;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_height:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:height property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the content's height in pixels, or 0
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
guint
|
|
Packit |
4b6dd7 |
gdata_media_content_get_height (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->height;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_get_width:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataMediaContent:width property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the content's width in pixels, or 0
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
guint
|
|
Packit |
4b6dd7 |
gdata_media_content_get_width (GDataMediaContent *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), 0);
|
|
Packit |
4b6dd7 |
return self->priv->width;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_media_content_download:
|
|
Packit |
4b6dd7 |
* @self: a #GDataMediaContent
|
|
Packit |
4b6dd7 |
* @service: the #GDataService
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): a #GCancellable for the entire download stream, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Downloads and returns a #GDataDownloadStream allowing the content represented by @self to be read.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* To get the content type of the downloaded data, gdata_download_stream_get_content_type() can be called on the returned #GDataDownloadStream.
|
|
Packit |
4b6dd7 |
* Calling gdata_download_stream_get_content_length() on the stream will not return a meaningful result, however, as the stream is encoded in chunks,
|
|
Packit |
4b6dd7 |
* rather than by content length.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In order to cancel the download, a #GCancellable passed in to @cancellable must be cancelled using g_cancellable_cancel(). Cancelling the individual
|
|
Packit |
4b6dd7 |
* #GInputStream operations on the #GDataDownloadStream will not cancel the entire download; merely the read or close operation in question. See the
|
|
Packit |
4b6dd7 |
* #GDataDownloadStream:cancellable for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataDownloadStream to download the content with, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDownloadStream *
|
|
Packit |
4b6dd7 |
gdata_media_content_download (GDataMediaContent *self, GDataService *service, GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *src_uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_MEDIA_CONTENT (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_SERVICE (service), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* We keep a GError in the argument list so that we can add authentication errors, etc., in future if necessary */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Get the download URI and create a stream for it */
|
|
Packit |
4b6dd7 |
src_uri = gdata_media_content_get_uri (self);
|
|
Packit |
4b6dd7 |
return GDATA_DOWNLOAD_STREAM (gdata_download_stream_new (service, NULL, src_uri, cancellable));
|
|
Packit |
4b6dd7 |
}
|