Blame libgupnp-av/gupnp-didl-lite-object.c

Packit 712bc5
/*
Packit 712bc5
 * Copyright (C) 2009 Nokia Corporation.
Packit 712bc5
 * Copyright (C) 2012 Intel Corporation
Packit 712bc5
 *
Packit 712bc5
 * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
Packit 712bc5
 *                                <zeeshanak@gnome.org>
Packit 712bc5
 *          Krzesimir Nowak <krnowak@openismus.com>
Packit 712bc5
 *
Packit 712bc5
 * This library is free software; you can redistribute it and/or
Packit 712bc5
 * modify it under the terms of the GNU Library General Public
Packit 712bc5
 * License as published by the Free Software Foundation; either
Packit 712bc5
 * version 2 of the License, or (at your option) any later version.
Packit 712bc5
 *
Packit 712bc5
 * This library is distributed in the hope that it will be useful,
Packit 712bc5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 712bc5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 712bc5
 * Library General Public License for more details.
Packit 712bc5
 *
Packit 712bc5
 * You should have received a copy of the GNU Library General Public
Packit 712bc5
 * License along with this library; if not, write to the
Packit 712bc5
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit 712bc5
 * Boston, MA 02110-1301, USA.
Packit 712bc5
 */
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * SECTION:gupnp-didl-lite-object
Packit 712bc5
 * @short_description: DIDL-Lite Object
Packit 712bc5
 *
Packit 712bc5
 * #GUPnPDIDLLiteObject respresent a DIDL-Lite object element.
Packit 712bc5
 */
Packit 712bc5
Packit 712bc5
#include <string.h>
Packit 712bc5
Packit 712bc5
#include "gupnp-didl-lite-object.h"
Packit 712bc5
#include "gupnp-didl-lite-object-private.h"
Packit 712bc5
#include "gupnp-didl-lite-resource-private.h"
Packit 712bc5
#include "gupnp-didl-lite-descriptor-private.h"
Packit 712bc5
#include "gupnp-didl-lite-container.h"
Packit 712bc5
#include "gupnp-didl-lite-item.h"
Packit 712bc5
#include "gupnp-didl-lite-contributor-private.h"
Packit 712bc5
#include "xml-util.h"
Packit 712bc5
#include "fragment-util.h"
Packit 712bc5
#include "xsd-data.h"
Packit 712bc5
Packit 712bc5
G_DEFINE_ABSTRACT_TYPE (GUPnPDIDLLiteObject,
Packit 712bc5
                        gupnp_didl_lite_object,
Packit 712bc5
                        G_TYPE_OBJECT);
Packit 712bc5
Packit 712bc5
struct _GUPnPDIDLLiteObjectPrivate {
Packit 712bc5
        xmlNode       *xml_node;
Packit 712bc5
        GUPnPAVXMLDoc *xml_doc;
Packit 712bc5
Packit 712bc5
        xmlNs *upnp_ns;
Packit 712bc5
        xmlNs *dc_ns;
Packit 712bc5
        xmlNs *dlna_ns;
Packit 712bc5
        xmlNs *pv_ns;
Packit 712bc5
};
Packit 712bc5
Packit 712bc5
static XSDData *didl_lite_xsd;
Packit 712bc5
Packit 712bc5
enum {
Packit 712bc5
        PROP_0,
Packit 712bc5
        PROP_XML_NODE,
Packit 712bc5
        PROP_XML_DOC,
Packit 712bc5
        PROP_UPNP_NAMESPACE,
Packit 712bc5
        PROP_DC_NAMESPACE,
Packit 712bc5
        PROP_DLNA_NAMESPACE,
Packit 712bc5
        PROP_PV_NAMESPACE,
Packit 712bc5
        PROP_ID,
Packit 712bc5
        PROP_PARENT_ID,
Packit 712bc5
        PROP_RESTRICTED,
Packit 712bc5
        PROP_TITLE,
Packit 712bc5
        PROP_UPNP_CLASS,
Packit 712bc5
        PROP_CREATOR,
Packit 712bc5
        PROP_ARTIST,
Packit 712bc5
        PROP_AUTHOR,
Packit 712bc5
        PROP_GENRE,
Packit 712bc5
        PROP_WRITE_STATUS,
Packit 712bc5
        PROP_ALBUM,
Packit 712bc5
        PROP_ALBUM_ART,
Packit 712bc5
        PROP_DESCRIPTION,
Packit 712bc5
        PROP_DATE,
Packit 712bc5
        PROP_TRACK_NUMBER,
Packit 712bc5
        PROP_DLNA_MANAGED,
Packit 712bc5
        PROP_UPDATE_ID
Packit 712bc5
};
Packit 712bc5
Packit 712bc5
static int
Packit 712bc5
is_non_transcoded_resource (GUPnPDIDLLiteResource *resource)
Packit 712bc5
{
Packit 712bc5
        GUPnPProtocolInfo *info;
Packit 712bc5
Packit 712bc5
        info = gupnp_didl_lite_resource_get_protocol_info (resource);
Packit 712bc5
        if (G_UNLIKELY (info == NULL))
Packit 712bc5
                return -1;
Packit 712bc5
Packit 712bc5
        return gupnp_protocol_info_get_dlna_conversion (info) &
Packit 712bc5
               GUPNP_DLNA_CONVERSION_TRANSCODED;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_object_init (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        object->priv = G_TYPE_INSTANCE_GET_PRIVATE
Packit 712bc5
                                        (object,
Packit 712bc5
                                         GUPNP_TYPE_DIDL_LITE_OBJECT,
Packit 712bc5
                                         GUPnPDIDLLiteObjectPrivate);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_object_set_property (GObject      *object,
Packit 712bc5
                                     guint         property_id,
Packit 712bc5
                                     const GValue *value,
Packit 712bc5
                                     GParamSpec   *pspec)
Packit 712bc5
Packit 712bc5
{
Packit 712bc5
        GUPnPDIDLLiteObject *didl_object;
Packit 712bc5
Packit 712bc5
        didl_object = GUPNP_DIDL_LITE_OBJECT (object);
Packit 712bc5
Packit 712bc5
        switch (property_id) {
Packit 712bc5
        case PROP_XML_NODE:
Packit 712bc5
                didl_object->priv->xml_node = g_value_get_pointer (value);
Packit 712bc5
                break;
Packit 712bc5
        case PROP_XML_DOC:
Packit 712bc5
                didl_object->priv->xml_doc = g_value_dup_boxed (value);
Packit 712bc5
                break;
Packit 712bc5
        case PROP_UPNP_NAMESPACE:
Packit 712bc5
                didl_object->priv->upnp_ns = g_value_get_pointer (value);
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DC_NAMESPACE:
Packit 712bc5
                didl_object->priv->dc_ns = g_value_get_pointer (value);
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DLNA_NAMESPACE:
Packit 712bc5
                didl_object->priv->dlna_ns = g_value_get_pointer (value);
Packit 712bc5
                break;
Packit 712bc5
        case PROP_PV_NAMESPACE:
Packit 712bc5
                didl_object->priv->pv_ns = g_value_get_pointer (value);
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ID:
Packit 712bc5
                gupnp_didl_lite_object_set_id (didl_object,
Packit 712bc5
                                               g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_PARENT_ID:
Packit 712bc5
                gupnp_didl_lite_object_set_parent_id
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_RESTRICTED:
Packit 712bc5
                gupnp_didl_lite_object_set_restricted
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_boolean (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_TITLE:
Packit 712bc5
                gupnp_didl_lite_object_set_title
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_UPNP_CLASS:
Packit 712bc5
                gupnp_didl_lite_object_set_upnp_class
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_CREATOR:
Packit 712bc5
                gupnp_didl_lite_object_set_creator
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ARTIST:
Packit 712bc5
                gupnp_didl_lite_object_set_artist
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_AUTHOR:
Packit 712bc5
                gupnp_didl_lite_object_set_author
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_GENRE:
Packit 712bc5
                gupnp_didl_lite_object_set_genre
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_WRITE_STATUS:
Packit 712bc5
                gupnp_didl_lite_object_set_write_status
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ALBUM:
Packit 712bc5
                gupnp_didl_lite_object_set_album
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ALBUM_ART:
Packit 712bc5
                gupnp_didl_lite_object_set_album_art
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DESCRIPTION:
Packit 712bc5
                gupnp_didl_lite_object_set_description
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DATE:
Packit 712bc5
                gupnp_didl_lite_object_set_date
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_string (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_TRACK_NUMBER:
Packit 712bc5
                gupnp_didl_lite_object_set_track_number
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_int (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DLNA_MANAGED:
Packit 712bc5
                gupnp_didl_lite_object_set_dlna_managed
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_flags (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_UPDATE_ID:
Packit 712bc5
                gupnp_didl_lite_object_set_update_id
Packit 712bc5
                                        (didl_object,
Packit 712bc5
                                         g_value_get_uint (value));
Packit 712bc5
                break;
Packit 712bc5
        default:
Packit 712bc5
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit 712bc5
                break;
Packit 712bc5
        }
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_object_get_property (GObject    *object,
Packit 712bc5
                                     guint       property_id,
Packit 712bc5
                                     GValue     *value,
Packit 712bc5
                                     GParamSpec *pspec)
Packit 712bc5
{
Packit 712bc5
        GUPnPDIDLLiteObject *didl_object;
Packit 712bc5
Packit 712bc5
        didl_object = GUPNP_DIDL_LITE_OBJECT (object);
Packit 712bc5
Packit 712bc5
        switch (property_id) {
Packit 712bc5
        case PROP_XML_NODE:
Packit 712bc5
                g_value_set_pointer
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_xml_node (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_UPNP_NAMESPACE:
Packit 712bc5
                g_value_set_pointer
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_upnp_namespace
Packit 712bc5
                                (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DC_NAMESPACE:
Packit 712bc5
                g_value_set_pointer
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_dc_namespace
Packit 712bc5
                                (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DLNA_NAMESPACE:
Packit 712bc5
                g_value_set_pointer
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_dlna_namespace
Packit 712bc5
                                (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_PV_NAMESPACE:
Packit 712bc5
                g_value_set_pointer
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_pv_namespace
Packit 712bc5
                                (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ID:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_id (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_PARENT_ID:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_parent_id (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_RESTRICTED:
Packit 712bc5
                g_value_set_boolean
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_restricted (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_TITLE:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_title (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_UPNP_CLASS:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_upnp_class (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_CREATOR:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_creator (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ARTIST:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_artist (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_AUTHOR:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_author (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_GENRE:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_genre (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_WRITE_STATUS:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_write_status (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ALBUM:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_album (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_ALBUM_ART:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_album_art (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DESCRIPTION:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_description (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DATE:
Packit 712bc5
                g_value_set_string
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_date (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_TRACK_NUMBER:
Packit 712bc5
                g_value_set_int
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_track_number (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_DLNA_MANAGED:
Packit 712bc5
                g_value_set_flags
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_dlna_managed (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_UPDATE_ID:
Packit 712bc5
                g_value_set_uint
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_object_get_update_id (didl_object));
Packit 712bc5
                break;
Packit 712bc5
        default:
Packit 712bc5
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit 712bc5
                break;
Packit 712bc5
        }
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_object_dispose (GObject *object)
Packit 712bc5
{
Packit 712bc5
        GObjectClass               *object_class;
Packit 712bc5
        GUPnPDIDLLiteObjectPrivate *priv;
Packit 712bc5
Packit 712bc5
        priv = GUPNP_DIDL_LITE_OBJECT (object)->priv;
Packit 712bc5
Packit 712bc5
        g_clear_pointer (&priv->xml_doc, xml_doc_unref);
Packit 712bc5
Packit 712bc5
        object_class = G_OBJECT_CLASS (gupnp_didl_lite_object_parent_class);
Packit 712bc5
        object_class->dispose (object);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_object_class_init (GUPnPDIDLLiteObjectClass *klass)
Packit 712bc5
{
Packit 712bc5
        GObjectClass *object_class;
Packit 712bc5
Packit 712bc5
        object_class = G_OBJECT_CLASS (klass);
Packit 712bc5
Packit 712bc5
        object_class->set_property = gupnp_didl_lite_object_set_property;
Packit 712bc5
        object_class->get_property = gupnp_didl_lite_object_get_property;
Packit 712bc5
        object_class->dispose = gupnp_didl_lite_object_dispose;
Packit 712bc5
Packit 712bc5
        g_type_class_add_private (klass, sizeof (GUPnPDIDLLiteObjectPrivate));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:xml-node:
Packit 712bc5
         *
Packit 712bc5
         * The pointer to object node in XML document.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_XML_NODE,
Packit 712bc5
                 g_param_spec_pointer ("xml-node",
Packit 712bc5
                                       "XMLNode",
Packit 712bc5
                                       "The pointer to object node in XML"
Packit 712bc5
                                       " document.",
Packit 712bc5
                                       G_PARAM_READWRITE |
Packit 712bc5
                                       G_PARAM_CONSTRUCT_ONLY |
Packit 712bc5
                                       G_PARAM_STATIC_NAME |
Packit 712bc5
                                       G_PARAM_STATIC_NICK |
Packit 712bc5
                                       G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:xml-doc:
Packit 712bc5
         *
Packit 712bc5
         * The reference to XML document containing this object.
Packit 712bc5
         *
Packit 712bc5
         * Internal property.
Packit 712bc5
         *
Packit 712bc5
         * Stability: Private
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_XML_DOC,
Packit 712bc5
                 g_param_spec_boxed ("xml-doc",
Packit 712bc5
                                      "XMLDoc",
Packit 712bc5
                                      "The reference to XML document"
Packit 712bc5
                                      " containing this object.",
Packit 712bc5
                                      xml_doc_get_type (),
Packit 712bc5
                                      G_PARAM_WRITABLE |
Packit 712bc5
                                      G_PARAM_CONSTRUCT_ONLY |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:upnp-namespace:
Packit 712bc5
         *
Packit 712bc5
         * Pointer to the UPnP namespace registered with the XML document
Packit 712bc5
         * containing this object.
Packit 712bc5
         *
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_UPNP_NAMESPACE,
Packit 712bc5
                 g_param_spec_pointer ("upnp-namespace",
Packit 712bc5
                                       "XML namespace",
Packit 712bc5
                                       "Pointer to the UPnP XML namespace "
Packit 712bc5
                                       "registered with the XML document "
Packit 712bc5
                                       "containing this object.",
Packit 712bc5
                                       G_PARAM_READWRITE |
Packit 712bc5
                                       G_PARAM_CONSTRUCT_ONLY |
Packit 712bc5
                                       G_PARAM_STATIC_NAME |
Packit 712bc5
                                       G_PARAM_STATIC_NICK |
Packit 712bc5
                                       G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:dc-namespace:
Packit 712bc5
         *
Packit 712bc5
         * Pointer to the DublinCore namespace registered with the XML document
Packit 712bc5
         * containing this object.
Packit 712bc5
         *
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_DC_NAMESPACE,
Packit 712bc5
                 g_param_spec_pointer ("dc-namespace",
Packit 712bc5
                                       "XML namespace",
Packit 712bc5
                                       "Pointer to the Dublin Core XML "
Packit 712bc5
                                       "namespace registered with the XML "
Packit 712bc5
                                       "document containing this object.",
Packit 712bc5
                                       G_PARAM_READWRITE |
Packit 712bc5
                                       G_PARAM_CONSTRUCT_ONLY |
Packit 712bc5
                                       G_PARAM_STATIC_NAME |
Packit 712bc5
                                       G_PARAM_STATIC_NICK |
Packit 712bc5
                                       G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:dlna-namespace:
Packit 712bc5
         *
Packit 712bc5
         * Pointer to the DLNA metadata namespace registered with the XML
Packit 712bc5
         * document containing this object.
Packit 712bc5
         *
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_DLNA_NAMESPACE,
Packit 712bc5
                 g_param_spec_pointer ("dlna-namespace",
Packit 712bc5
                                       "XML namespace",
Packit 712bc5
                                       "Pointer to the DLNA metadata namespace "
Packit 712bc5
                                       "registered with the XML document "
Packit 712bc5
                                       "containing this object.",
Packit 712bc5
                                       G_PARAM_READWRITE |
Packit 712bc5
                                       G_PARAM_CONSTRUCT_ONLY |
Packit 712bc5
                                       G_PARAM_STATIC_NAME |
Packit 712bc5
                                       G_PARAM_STATIC_NICK |
Packit 712bc5
                                       G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:pv-namespace:
Packit 712bc5
         *
Packit 712bc5
         * Pointer to the PV metadata namespace registered with the XML
Packit 712bc5
         * document containing this object.
Packit 712bc5
         *
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_PV_NAMESPACE,
Packit 712bc5
                 g_param_spec_pointer ("pv-namespace",
Packit 712bc5
                                       "XML namespace",
Packit 712bc5
                                       "Pointer to the PV metadata namespace "
Packit 712bc5
                                       "registered with the XML document "
Packit 712bc5
                                       "containing this object.",
Packit 712bc5
                                       G_PARAM_READWRITE |
Packit 712bc5
                                       G_PARAM_CONSTRUCT_ONLY |
Packit 712bc5
                                       G_PARAM_STATIC_STRINGS));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:id:
Packit 712bc5
         *
Packit 712bc5
         * The ID of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_ID,
Packit 712bc5
                 g_param_spec_string ("id",
Packit 712bc5
                                      "ID",
Packit 712bc5
                                      "The ID of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:parent-id:
Packit 712bc5
         *
Packit 712bc5
         * The ID of the parent container of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_PARENT_ID,
Packit 712bc5
                 g_param_spec_string ("parent-id",
Packit 712bc5
                                      "ParentID",
Packit 712bc5
                                      "The ID of the parent container of"
Packit 712bc5
                                      " this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:restricted:
Packit 712bc5
         *
Packit 712bc5
         * Whether this object is restricted.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_RESTRICTED,
Packit 712bc5
                 g_param_spec_boolean ("restricted",
Packit 712bc5
                                       "Restricted",
Packit 712bc5
                                       "Whether this object is restricted.",
Packit 712bc5
                                       FALSE,
Packit 712bc5
                                       G_PARAM_READWRITE |
Packit 712bc5
                                       G_PARAM_STATIC_NAME |
Packit 712bc5
                                       G_PARAM_STATIC_NICK |
Packit 712bc5
                                       G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:title:
Packit 712bc5
         *
Packit 712bc5
         * The title of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_TITLE,
Packit 712bc5
                 g_param_spec_string ("title",
Packit 712bc5
                                      "Title",
Packit 712bc5
                                      "The title of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:upnp-class:
Packit 712bc5
         *
Packit 712bc5
         * The UPnP class of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_UPNP_CLASS,
Packit 712bc5
                 g_param_spec_string ("upnp-class",
Packit 712bc5
                                      "UPnPClassName",
Packit 712bc5
                                      "The UPnP class of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:creator:
Packit 712bc5
         *
Packit 712bc5
         * The creator of this object.
Packit 712bc5
         *
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_CREATOR,
Packit 712bc5
                 g_param_spec_string ("creator",
Packit 712bc5
                                      "Creator",
Packit 712bc5
                                      "The creator of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:artist:
Packit 712bc5
         *
Packit 712bc5
         * The artist of this object.
Packit 712bc5
         *
Packit 712bc5
         * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_get_artists and
Packit 712bc5
         * #gupnp_didl_lite_object_add_artist instead since unlike this
Packit 712bc5
         * property, they are capable of dealing with multiple artist nodes.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_ARTIST,
Packit 712bc5
                 g_param_spec_string ("artist",
Packit 712bc5
                                      "Artist",
Packit 712bc5
                                      "The artist of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:author:
Packit 712bc5
         *
Packit 712bc5
         * The author of this object.
Packit 712bc5
         *
Packit 712bc5
         * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_get_authors and
Packit 712bc5
         * #gupnp_didl_lite_object_add_author instead since unlike this
Packit 712bc5
         * property, they are capable of dealing with multiple author nodes.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_AUTHOR,
Packit 712bc5
                 g_param_spec_string ("author",
Packit 712bc5
                                      "Author",
Packit 712bc5
                                      "The author of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:genre:
Packit 712bc5
         *
Packit 712bc5
         * The genre of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_GENRE,
Packit 712bc5
                 g_param_spec_string ("genre",
Packit 712bc5
                                      "Genre",
Packit 712bc5
                                      "The genre of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:write-status:
Packit 712bc5
         *
Packit 712bc5
         * The write status of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_WRITE_STATUS,
Packit 712bc5
                 g_param_spec_string ("write-status",
Packit 712bc5
                                      "WriteStatus",
Packit 712bc5
                                      "The write status of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:album:
Packit 712bc5
         *
Packit 712bc5
         * The album of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_ALBUM,
Packit 712bc5
                 g_param_spec_string ("album",
Packit 712bc5
                                      "Album",
Packit 712bc5
                                      "The album of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:album-art:
Packit 712bc5
         *
Packit 712bc5
         * The URI to album art of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_ALBUM_ART,
Packit 712bc5
                 g_param_spec_string ("album-art",
Packit 712bc5
                                      "AlbumArt",
Packit 712bc5
                                      "The URI to album art of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:description:
Packit 712bc5
         *
Packit 712bc5
         * The description of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_DESCRIPTION,
Packit 712bc5
                 g_param_spec_string ("description",
Packit 712bc5
                                      "Description",
Packit 712bc5
                                      "The description of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:date:
Packit 712bc5
         *
Packit 712bc5
         * The date of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_DATE,
Packit 712bc5
                 g_param_spec_string ("date",
Packit 712bc5
                                      "Date",
Packit 712bc5
                                      "The date of this object.",
Packit 712bc5
                                      NULL,
Packit 712bc5
                                      G_PARAM_READWRITE |
Packit 712bc5
                                      G_PARAM_STATIC_NAME |
Packit 712bc5
                                      G_PARAM_STATIC_NICK |
Packit 712bc5
                                      G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:track-number:
Packit 712bc5
         *
Packit 712bc5
         * The original track number of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_TRACK_NUMBER,
Packit 712bc5
                 g_param_spec_int ("track-number",
Packit 712bc5
                                   "TrackNumber",
Packit 712bc5
                                   "The original track number of this  object.",
Packit 712bc5
                                   -1, G_MAXINT, -1,
Packit 712bc5
                                   G_PARAM_READWRITE |
Packit 712bc5
                                   G_PARAM_STATIC_NAME |
Packit 712bc5
                                   G_PARAM_STATIC_NICK |
Packit 712bc5
                                   G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:dlna-managed:
Packit 712bc5
         *
Packit 712bc5
         * The 'dlna:dlnaManaged' attribute.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_DLNA_MANAGED,
Packit 712bc5
                 g_param_spec_flags ("dlna-managed",
Packit 712bc5
                                     "DLNAManaged",
Packit 712bc5
                                     "The 'dlna:dlnaManaged' attribute",
Packit 712bc5
                                     GUPNP_TYPE_OCM_FLAGS,
Packit 712bc5
                                     GUPNP_OCM_FLAGS_NONE,
Packit 712bc5
                                     G_PARAM_READWRITE |
Packit 712bc5
                                     G_PARAM_STATIC_NAME |
Packit 712bc5
                                     G_PARAM_STATIC_NICK |
Packit 712bc5
                                     G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteObject:update-id:
Packit 712bc5
         *
Packit 712bc5
         * Update ID of this object.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                                (object_class,
Packit 712bc5
                                 PROP_UPDATE_ID,
Packit 712bc5
                                 g_param_spec_uint ("update-id",
Packit 712bc5
                                                    "UpdateID",
Packit 712bc5
                                                    "Update ID of this object.",
Packit 712bc5
                                                    0,
Packit 712bc5
                                                    G_MAXUINT,
Packit 712bc5
                                                    0,
Packit 712bc5
                                                    G_PARAM_READWRITE |
Packit 712bc5
                                                    G_PARAM_STATIC_NAME |
Packit 712bc5
                                                    G_PARAM_STATIC_NICK |
Packit 712bc5
                                                    G_PARAM_STATIC_BLURB));
Packit 712bc5
Packit 712bc5
        if (didl_lite_xsd == NULL)
Packit 712bc5
                didl_lite_xsd = fragment_util_get_didl_lite_xsd_data ();
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static gboolean
Packit 712bc5
is_resource_compatible (GUPnPDIDLLiteResource *resource,
Packit 712bc5
                        char                 **protocols)
Packit 712bc5
{
Packit 712bc5
        gboolean ret = FALSE;
Packit 712bc5
        char **it;
Packit 712bc5
Packit 712bc5
        for (it = protocols; *it != NULL && !ret; it++) {
Packit 712bc5
                GUPnPProtocolInfo *info;
Packit 712bc5
                GUPnPProtocolInfo *res_info;
Packit 712bc5
Packit 712bc5
                info = gupnp_protocol_info_new_from_string (*it, NULL);
Packit 712bc5
                if (info == NULL)
Packit 712bc5
                        continue;
Packit 712bc5
Packit 712bc5
                res_info = gupnp_didl_lite_resource_get_protocol_info
Packit 712bc5
                                                        (resource);
Packit 712bc5
                if (res_info == NULL)
Packit 712bc5
                        continue;
Packit 712bc5
Packit 712bc5
                ret = gupnp_protocol_info_is_compatible (info, res_info);
Packit 712bc5
Packit 712bc5
                g_object_unref (info);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static GList *
Packit 712bc5
get_contributor_list_by_name (GUPnPDIDLLiteObject *object,
Packit 712bc5
                              const char          *name)
Packit 712bc5
{
Packit 712bc5
        GList *contributors = NULL;
Packit 712bc5
        GList *ret = NULL;
Packit 712bc5
        GList *l;
Packit 712bc5
Packit 712bc5
        contributors = gupnp_didl_lite_object_get_properties (object, name);
Packit 712bc5
Packit 712bc5
        for (l = contributors; l; l = l->next) {
Packit 712bc5
                GUPnPDIDLLiteContributor *contributor;
Packit 712bc5
                xmlNode *contributor_node;
Packit 712bc5
Packit 712bc5
                contributor_node = (xmlNode *) l->data;
Packit 712bc5
                if (!contributor_node->children)
Packit 712bc5
                        continue;
Packit 712bc5
Packit 712bc5
                contributor = gupnp_didl_lite_contributor_new_from_xml
Packit 712bc5
                                        (contributor_node,
Packit 712bc5
                                         object->priv->xml_doc);
Packit 712bc5
Packit 712bc5
                ret = g_list_append (ret, contributor);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (contributors);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static char *
Packit 712bc5
get_contributors_xml_string_by_name (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                     const char          *name)
Packit 712bc5
{
Packit 712bc5
        GList     *contributors = NULL;
Packit 712bc5
        char      *ret = NULL;
Packit 712bc5
        GList     *l;
Packit 712bc5
        xmlBuffer *buffer;
Packit 712bc5
Packit 712bc5
        contributors = gupnp_didl_lite_object_get_properties (object, name);
Packit 712bc5
        if (contributors == NULL)
Packit 712bc5
                return NULL;
Packit 712bc5
Packit 712bc5
        buffer = xmlBufferCreate ();
Packit 712bc5
Packit 712bc5
        for (l = contributors; l; l = l->next) {
Packit 712bc5
                xmlNode *node;
Packit 712bc5
Packit 712bc5
                node = (xmlNode *) l->data;
Packit 712bc5
                if (!node->children)
Packit 712bc5
                        continue;
Packit 712bc5
Packit 712bc5
                xmlNodeDump (buffer,
Packit 712bc5
                             object->priv->xml_doc->doc,
Packit 712bc5
                             node,
Packit 712bc5
                             0,
Packit 712bc5
                             0);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        ret = g_strndup ((char *) xmlBufferContent (buffer),
Packit 712bc5
                         xmlBufferLength (buffer));
Packit 712bc5
        xmlBufferFree (buffer);
Packit 712bc5
Packit 712bc5
        g_list_free (contributors);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
unset_contributors_by_name (GUPnPDIDLLiteObject *object, const char *name)
Packit 712bc5
{
Packit 712bc5
        GList *contributors = NULL;
Packit 712bc5
        GList *l;
Packit 712bc5
Packit 712bc5
        contributors = gupnp_didl_lite_object_get_properties (object, name);
Packit 712bc5
        if (contributors == NULL)
Packit 712bc5
                return;
Packit 712bc5
Packit 712bc5
        for (l = contributors; l; l = l->next) {
Packit 712bc5
                xmlNode *node;
Packit 712bc5
Packit 712bc5
                node = (xmlNode *) l->data;
Packit 712bc5
                if (!node->children)
Packit 712bc5
                        continue;
Packit 712bc5
Packit 712bc5
                xmlUnlinkNode (node);
Packit 712bc5
                xmlFreeNode (node);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (contributors);
Packit 712bc5
Packit 712bc5
        return;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_new_from_xml:
Packit 712bc5
 * @xml_node: The pointer to 'res' node in XML document
Packit 712bc5
 * @xml_doc: The reference to XML document containing this object
Packit 712bc5
 * @upnp_ns: The pointer to 'upnp' namespace in XML document
Packit 712bc5
 * @dc_ns: The pointer to 'dc' namespace in XML document
Packit 712bc5
 * @dlna_ns: The pointer to 'dlna' namespace in XML document
Packit 712bc5
 * @pv_ns: The pointer to 'pv' namespace in XML document
Packit 712bc5
 *
Packit 712bc5
 * Creates a new #GUPnPDIDLLiteObject for the @xml_node.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A new #GUPnPDIDLLiteObject object. Unref after usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteObject *
Packit 712bc5
gupnp_didl_lite_object_new_from_xml (xmlNode       *xml_node,
Packit 712bc5
                                     GUPnPAVXMLDoc *xml_doc,
Packit 712bc5
                                     xmlNs         *upnp_ns,
Packit 712bc5
                                     xmlNs         *dc_ns,
Packit 712bc5
                                     xmlNs         *dlna_ns,
Packit 712bc5
                                     xmlNs         *pv_ns)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (xml_node != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (xml_node->name != NULL, NULL);
Packit 712bc5
Packit 712bc5
        if (g_ascii_strcasecmp ((char *) xml_node->name, "container") == 0)
Packit 712bc5
                return g_object_new (GUPNP_TYPE_DIDL_LITE_CONTAINER,
Packit 712bc5
                                     "xml-node", xml_node,
Packit 712bc5
                                     "xml-doc", xml_doc,
Packit 712bc5
                                     "upnp-namespace", upnp_ns,
Packit 712bc5
                                     "dc-namespace", dc_ns,
Packit 712bc5
                                     "dlna-namespace", dlna_ns,
Packit 712bc5
                                     "pv-namespace", pv_ns,
Packit 712bc5
                                     NULL);
Packit 712bc5
        else if (g_ascii_strcasecmp ((char *) xml_node->name, "item") == 0)
Packit 712bc5
                return g_object_new (GUPNP_TYPE_DIDL_LITE_ITEM,
Packit 712bc5
                                     "xml-node", xml_node,
Packit 712bc5
                                     "xml-doc", xml_doc,
Packit 712bc5
                                     "upnp-namespace", upnp_ns,
Packit 712bc5
                                     "dc-namespace", dc_ns,
Packit 712bc5
                                     "dlna-namespace", dlna_ns,
Packit 712bc5
                                     "pv-namespace", pv_ns,
Packit 712bc5
                                     NULL);
Packit 712bc5
        else
Packit 712bc5
                return NULL;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_gupnp_xml_doc:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the pointer to the XML document containing this object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer none): The pointer to the XML document containing this
Packit 712bc5
 * object.
Packit 712bc5
 **/
Packit 712bc5
GUPnPAVXMLDoc *
Packit 712bc5
gupnp_didl_lite_object_get_gupnp_xml_doc (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return object->priv->xml_doc;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_xml_node:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the pointer to object node in XML document.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer none): The pointer to object node in XML document.
Packit 712bc5
 **/
Packit 712bc5
xmlNode *
Packit 712bc5
gupnp_didl_lite_object_get_xml_node (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return object->priv->xml_node;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_upnp_namespace:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the pointer to the UPnP namespace registered with the XML document.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer none): The pointer to UPnP namespace in XML document.
Packit 712bc5
 **/
Packit 712bc5
xmlNsPtr
Packit 712bc5
gupnp_didl_lite_object_get_upnp_namespace (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_ns (object->priv->xml_doc->doc,
Packit 712bc5
                                GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                                &(object->priv->upnp_ns));
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_dc_namespace:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the pointer to the DublinCore namespace registered with the XML document
Packit 712bc5
 * containing this object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer none): The pointer to DublinCore namespace in XML document.
Packit 712bc5
 **/
Packit 712bc5
xmlNsPtr
Packit 712bc5
gupnp_didl_lite_object_get_dc_namespace (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_ns (object->priv->xml_doc->doc,
Packit 712bc5
                                GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                                &(object->priv->dc_ns));
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_upnp_class:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the UPnP class of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The class of @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_upnp_class (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "class");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_dlna_namespace:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the pointer to the DLNA metadata namespace registered with the XML
Packit 712bc5
 * document containing this object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer none): The pointer to DLNA namespace in XML document.
Packit 712bc5
 **/
Packit 712bc5
xmlNsPtr
Packit 712bc5
gupnp_didl_lite_object_get_dlna_namespace (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_ns (object->priv->xml_doc->doc,
Packit 712bc5
                                GUPNP_XML_NAMESPACE_DLNA,
Packit 712bc5
                                &(object->priv->dlna_ns));
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_pv_namespace:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the pointer to the PV metadata namespace registered with the XML
Packit 712bc5
 * document containing this object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer none): The pointer to PV namespace in XML document.
Packit 712bc5
 **/
Packit 712bc5
xmlNsPtr
Packit 712bc5
gupnp_didl_lite_object_get_pv_namespace (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_ns (object->priv->xml_doc->doc,
Packit 712bc5
                                GUPNP_XML_NAMESPACE_PV,
Packit 712bc5
                                &(object->priv->pv_ns));
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the ID of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The ID of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_id (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_attribute_content (object->priv->xml_node, "id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_parent_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the ID of the parent of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The ID of parent of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_parent_id (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_attribute_content (object->priv->xml_node,
Packit 712bc5
                                               "parentID");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_properties:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @name: name of the properties
Packit 712bc5
 *
Packit 712bc5
 * Use this function to retreive property nodes by name.
Packit 712bc5
 *
Packit 712bc5
 * Return value: (element-type xmlNode*) (transfer container): The list of
Packit 712bc5
 * property nodes by the name @property_name belonging to @object, or %NULL.
Packit 712bc5
 * #g_list_free the returned list after usage but do not modify the contents.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_object_get_properties (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                       const char          *name)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
        g_return_val_if_fail (name != NULL, NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_elements_by_name (object->priv->xml_node,
Packit 712bc5
                                                    name);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_is_restricted_set:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Whehter the restricted attribute exists on @object
Packit 712bc5
 *
Packit 712bc5
 * Return value: #TRUE if restricted exists, #FALSE otherwise.
Packit 712bc5
 **/
Packit 712bc5
gboolean
Packit 712bc5
gupnp_didl_lite_object_is_restricted_set (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (object != NULL, FALSE);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), FALSE);
Packit 712bc5
Packit 712bc5
        return xml_util_get_attribute_content (object->priv->xml_node,
Packit 712bc5
                                               "restricted") != NULL;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_restricted:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Whether the @object is restricted or not.
Packit 712bc5
 *
Packit 712bc5
 * Return value: #TRUE if @object is restricted.
Packit 712bc5
 **/
Packit 712bc5
gboolean
Packit 712bc5
gupnp_didl_lite_object_get_restricted (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), FALSE);
Packit 712bc5
Packit 712bc5
        return xml_util_get_boolean_attribute (object->priv->xml_node,
Packit 712bc5
                                               "restricted");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_title:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the title of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The title of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_title (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "title");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_creator:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the creator of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The creator of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_creator (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "creator");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_creators:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the creators of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (element-type GUPnPDIDLLiteContributor*) (transfer full): The list
Packit 712bc5
 * of creators belonging to @object, or %NULL.
Packit 712bc5
 * #g_list_free the returned list after usage and unref each object in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_object_get_creators (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return get_contributor_list_by_name (object, "creator");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_artist:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the artist of the @object. If role is not %NULL, it is set to the role
Packit 712bc5
 * of the artist if available.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The artist of the @object, or %NULL.
Packit 712bc5
 *
Packit 712bc5
 * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_get_artists instead.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_artist (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "artist");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_artists:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the artists of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (element-type GUPnPDIDLLiteContributor*) (transfer full): The list
Packit 712bc5
 * of artists belonging to @object, or %NULL.
Packit 712bc5
 * #g_list_free the returned list after usage and unref each object in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_object_get_artists (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return get_contributor_list_by_name (object, "artist");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_author:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the author of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The author of the @object, or %NULL.
Packit 712bc5
 *
Packit 712bc5
 * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_get_authors instead.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_author (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "author");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_authors:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the authors of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (element-type GUPnPDIDLLiteContributor*) (transfer full): The list
Packit 712bc5
 * of authors belonging to @object, or %NULL.
Packit 712bc5
 * #g_list_free the returned list after usage and unref each object in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_object_get_authors (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return get_contributor_list_by_name (object, "author");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_descriptors:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the descriptors of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (element-type GUPnPDIDLLiteDescriptor*) (transfer full): The list of
Packit 712bc5
 * descriptors belonging to @object, or %NULL.
Packit 712bc5
 * #g_list_free the returned list after usage and unref each object in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_object_get_descriptors (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        GList *descriptors = NULL;
Packit 712bc5
        GList *ret = NULL;
Packit 712bc5
        GList *l;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        descriptors = gupnp_didl_lite_object_get_properties (object, "desc");
Packit 712bc5
Packit 712bc5
        for (l = descriptors; l; l = l->next) {
Packit 712bc5
                GUPnPDIDLLiteDescriptor *descriptor;
Packit 712bc5
                xmlNode *descriptor_node;
Packit 712bc5
Packit 712bc5
                descriptor_node = (xmlNode *) l->data;
Packit 712bc5
Packit 712bc5
                descriptor = gupnp_didl_lite_descriptor_new_from_xml
Packit 712bc5
                                        (descriptor_node,
Packit 712bc5
                                         object->priv->xml_doc);
Packit 712bc5
Packit 712bc5
                ret = g_list_append (ret, descriptor);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (descriptors);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_genre:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the genre of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The genre of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_genre (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "genre");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_write_status:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the write status of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The write status of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_write_status (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "writeStatus");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_album:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the album of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The album of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_album (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "album");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_album_art:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the URI to album art of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The URI to album art of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_album_art (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "albumArtURI");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_description:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the description of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The description of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_description (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "description");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_date:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the date of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The date of the @object, or %NULL.
Packit 712bc5
 **/
Packit 712bc5
const char *
Packit 712bc5
gupnp_didl_lite_object_get_date (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                   "date");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_track_number:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the original track number of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The original track number of the @object, or -1.
Packit 712bc5
 **/
Packit 712bc5
int
Packit 712bc5
gupnp_didl_lite_object_get_track_number (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        const char *str;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), -1);
Packit 712bc5
Packit 712bc5
        str = xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                  "originalTrackNumber");
Packit 712bc5
        if (str == NULL)
Packit 712bc5
                return -1;
Packit 712bc5
Packit 712bc5
        return atoi (str);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_dlna_managed:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the 'dlna:dlnaManaged' attribute of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The 'dlna:dlnaManaged' attribute of the @object.
Packit 712bc5
 **/
Packit 712bc5
GUPnPOCMFlags
Packit 712bc5
gupnp_didl_lite_object_get_dlna_managed (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        const char *str;
Packit 712bc5
        GUPnPOCMFlags dlna_managed;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (object != NULL, GUPNP_OCM_FLAGS_NONE);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object),
Packit 712bc5
                              GUPNP_OCM_FLAGS_NONE);
Packit 712bc5
Packit 712bc5
        str = xml_util_get_attribute_content (object->priv->xml_node,
Packit 712bc5
                                              "dlnaManaged");
Packit 712bc5
        if (str == NULL)
Packit 712bc5
                return GUPNP_OCM_FLAGS_NONE;
Packit 712bc5
Packit 712bc5
        sscanf (str, "%08x", &dlna_managed);
Packit 712bc5
Packit 712bc5
        return dlna_managed;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_update_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the update ID of the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The update ID of the @object.
Packit 712bc5
 **/
Packit 712bc5
guint
Packit 712bc5
gupnp_didl_lite_object_get_update_id (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (object != NULL, 0);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), 0);
Packit 712bc5
Packit 712bc5
        return xml_util_get_uint_child_element (object->priv->xml_node,
Packit 712bc5
                                                "objectUpdateID",
Packit 712bc5
                                                0);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_update_id_is_set:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get whether the update ID of the @object is set.
Packit 712bc5
 *
Packit 712bc5
 * Return value: %TRUE if update ID is set, otherwise %FALSE
Packit 712bc5
 **/
Packit 712bc5
gboolean
Packit 712bc5
gupnp_didl_lite_object_update_id_is_set (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        const char *content;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (object != NULL, FALSE);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), FALSE);
Packit 712bc5
Packit 712bc5
        content = xml_util_get_child_element_content (object->priv->xml_node,
Packit 712bc5
                                                      "objectUpdateID");
Packit 712bc5
        return content != NULL;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_resources:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Use this function to retreive resources from the @object.
Packit 712bc5
 *
Packit 712bc5
 * Return value: (element-type GUPnPDIDLLiteResource*) (transfer full): The list
Packit 712bc5
 *               of resources belonging to  @object, or %NULL. #g_list_free the
Packit 712bc5
 *               returned list after usage and unref each resource in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_object_get_resources (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        GList *resources = NULL;
Packit 712bc5
        GList *res = NULL;
Packit 712bc5
        GList *ret = NULL;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        resources = gupnp_didl_lite_object_get_properties (object, "res");
Packit 712bc5
Packit 712bc5
        for (res = resources; res; res = res->next) {
Packit 712bc5
                GUPnPDIDLLiteResource *resource;
Packit 712bc5
                xmlNode *res_node;
Packit 712bc5
Packit 712bc5
                res_node = (xmlNode *) res->data;
Packit 712bc5
Packit 712bc5
                /* Create a resource struct out of DIDLLite XML */
Packit 712bc5
                resource = gupnp_didl_lite_resource_new_from_xml
Packit 712bc5
                                        (res_node,
Packit 712bc5
                                         object->priv->xml_doc,
Packit 712bc5
                                         object->priv->dlna_ns,
Packit 712bc5
                                         object->priv->pv_ns);
Packit 712bc5
Packit 712bc5
                ret = g_list_append (ret, resource);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (resources);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_compat_resource:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @sink_protocol_info: The SinkProtocolInfo string from MediaRenderer
Packit 712bc5
 * @lenient: Enable lenient mode
Packit 712bc5
 *
Packit 712bc5
 * Use this function to get a resource from the @object that is compatible with
Packit 712bc5
 * any of the protocols specified in the @sink_protocol_info. The value of
Packit 712bc5
 * @sink_protocol_info will typically be acquired from 'Sink' argument of
Packit 712bc5
 * 'GetProtocolInfo' action or 'SinkProtocolInfo' state-variable of a
Packit 712bc5
 * ConnectionManager service.
Packit 712bc5
 *
Packit 712bc5
 * If @lenient is #TRUE, the first resource in the list is returned instead of
Packit 712bc5
 * %NULL if none of resources and protocols are found to be compatible.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer full): The resource belonging to @object that is comaptible with
Packit 712bc5
 * any of the protocols specified in @sink_protocol_info, or %NULL. Unref after
Packit 712bc5
 * usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteResource *
Packit 712bc5
gupnp_didl_lite_object_get_compat_resource
Packit 712bc5
                                (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                 const char          *sink_protocol_info,
Packit 712bc5
                                 gboolean             lenient)
Packit 712bc5
{
Packit 712bc5
        GUPnPDIDLLiteResource *resource = NULL;
Packit 712bc5
        GList  *resources = NULL;
Packit 712bc5
        GList  *compat_resources = NULL;
Packit 712bc5
        GList  *res;
Packit 712bc5
        char **protocols = NULL;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
        g_return_val_if_fail (sink_protocol_info != NULL, NULL);
Packit 712bc5
Packit 712bc5
        resources = gupnp_didl_lite_object_get_resources (object);
Packit 712bc5
        if (resources == NULL)
Packit 712bc5
                return NULL;
Packit 712bc5
Packit 712bc5
        protocols = g_strsplit (sink_protocol_info, ",", -1);
Packit 712bc5
        for (res = resources;
Packit 712bc5
             res != NULL;
Packit 712bc5
             res = res->next) {
Packit 712bc5
                resource = (GUPnPDIDLLiteResource *) res->data;
Packit 712bc5
Packit 712bc5
                if (is_resource_compatible (resource, protocols))
Packit 712bc5
                        compat_resources = g_list_append (compat_resources,
Packit 712bc5
                                                          resource);
Packit 712bc5
        }
Packit 712bc5
        g_strfreev (protocols);
Packit 712bc5
        protocols = NULL;
Packit 712bc5
Packit 712bc5
        resource = NULL;
Packit 712bc5
Packit 712bc5
        if (compat_resources != NULL) {
Packit 712bc5
                /* Try to find non-transcoded resource */
Packit 712bc5
                res = g_list_find_custom (compat_resources,
Packit 712bc5
                                          NULL,
Packit 712bc5
                                          (GCompareFunc)
Packit 712bc5
                                          is_non_transcoded_resource);
Packit 712bc5
Packit 712bc5
                if (res != NULL)
Packit 712bc5
                        resource = (GUPnPDIDLLiteResource *) res->data;
Packit 712bc5
                else
Packit 712bc5
                        /* Just use the first compatible resource */
Packit 712bc5
                        resource = (GUPnPDIDLLiteResource *)
Packit 712bc5
                                   compat_resources->data;
Packit 712bc5
Packit 712bc5
        } else if (lenient)
Packit 712bc5
                /* Just use the first resource */
Packit 712bc5
                resource = (GUPnPDIDLLiteResource *) resources->data;
Packit 712bc5
Packit 712bc5
        /* Unref all resources except for the one we just took */
Packit 712bc5
        for (res = resources; res; res = res->next)
Packit 712bc5
                if (res->data != resource)
Packit 712bc5
                        g_object_unref (res->data);
Packit 712bc5
        g_list_free (resources);
Packit 712bc5
        g_list_free (compat_resources);
Packit 712bc5
Packit 712bc5
        return resource;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_upnp_class:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 * @upnp_class: The UPnP class as string.
Packit 712bc5
 *
Packit 712bc5
 * Set the UPnP class of the @object to @upnp_class.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_upnp_class (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                       const char          *upnp_class)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "class",
Packit 712bc5
                            upnp_class);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "upnp-class");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @id: The ID
Packit 712bc5
 *
Packit 712bc5
 * Set the ID of the @object to @id.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_id (GUPnPDIDLLiteObject *object,
Packit 712bc5
                               const char          *id)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xmlSetProp (object->priv->xml_node,
Packit 712bc5
                    (unsigned char *) "id",
Packit 712bc5
                    (unsigned char *) id);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_parent_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @parent_id: The parent ID
Packit 712bc5
 *
Packit 712bc5
 * Set the ID of the parent of the @object to @parent_id.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_parent_id (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                      const char          *parent_id)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xmlSetProp (object->priv->xml_node,
Packit 712bc5
                    (unsigned char *) "parentID",
Packit 712bc5
                    (unsigned char *) parent_id);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "parent-id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_restricted:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @restricted: The restricted status
Packit 712bc5
 *
Packit 712bc5
 * Set the restricted status of @object to @restricted.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_restricted (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                       gboolean             restricted)
Packit 712bc5
{
Packit 712bc5
        const char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        if (restricted)
Packit 712bc5
                str = "1";
Packit 712bc5
        else
Packit 712bc5
                str = "0";
Packit 712bc5
        xmlSetProp (object->priv->xml_node,
Packit 712bc5
                    (unsigned char *) "restricted",
Packit 712bc5
                    (unsigned char *) str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "restricted");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_title:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @title: The title
Packit 712bc5
 *
Packit 712bc5
 * Set the title of the @object to @title.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_title (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                  const char          *title)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                            &(object->priv->dc_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "title",
Packit 712bc5
                            title);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "title");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_creator:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @creator: The creator
Packit 712bc5
 *
Packit 712bc5
 * Set the creator of the @object to @creator.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_creator (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                    const char          *creator)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                            &(object->priv->dc_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "creator",
Packit 712bc5
                            creator);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "creator");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_add_creator:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Add a new creator node to the @object and return the associated
Packit 712bc5
 * #GUPnPDIDLLiteContributor object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer full): A new #GUPnPDIDLLiteContributor object. Unref after usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteContributor *
Packit 712bc5
gupnp_didl_lite_object_add_creator (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        xmlNode *res_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (object != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        res_node = xmlNewChild (object->priv->xml_node,
Packit 712bc5
                                object->priv->dc_ns,
Packit 712bc5
                                (unsigned char *) "creator",
Packit 712bc5
                                NULL);
Packit 712bc5
Packit 712bc5
        return gupnp_didl_lite_contributor_new_from_xml (res_node,
Packit 712bc5
                                                         object->priv->xml_doc);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_artist:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 * @artist: The Artist
Packit 712bc5
 *
Packit 712bc5
 * Set the Artist of the @object to @artist.
Packit 712bc5
 *
Packit 712bc5
 * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_add_artist instead.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_artist (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                   const char          *artist)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "artist",
Packit 712bc5
                            artist);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "artist");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_add_artist:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Add a new Artist node to the @object and return the associated
Packit 712bc5
 * #GUPnPDIDLLiteContributor object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer full): A new #GUPnPDIDLLiteContributor object. Unref after usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteContributor *
Packit 712bc5
gupnp_didl_lite_object_add_artist (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        xmlNode *res_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (object != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        res_node = xmlNewChild (object->priv->xml_node,
Packit 712bc5
                                object->priv->upnp_ns,
Packit 712bc5
                                (unsigned char *) "artist",
Packit 712bc5
                                NULL);
Packit 712bc5
Packit 712bc5
        return gupnp_didl_lite_contributor_new_from_xml (res_node,
Packit 712bc5
                                                         object->priv->xml_doc);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_author:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 * @author: The Author
Packit 712bc5
 *
Packit 712bc5
 * Set the Author of the @object to @author.
Packit 712bc5
 *
Packit 712bc5
 * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_add_author instead.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_author (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                   const char          *author)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "author",
Packit 712bc5
                            author);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "author");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_add_author:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Add a new author node to the @object and return the associated
Packit 712bc5
 * #GUPnPDIDLLiteContributor object.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer full): A new #GUPnPDIDLLiteContributor object. Unref after usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteContributor *
Packit 712bc5
gupnp_didl_lite_object_add_author (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        xmlNode *res_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (object != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        res_node = xmlNewChild (object->priv->xml_node,
Packit 712bc5
                                object->priv->upnp_ns,
Packit 712bc5
                                (unsigned char *) "author",
Packit 712bc5
                                NULL);
Packit 712bc5
Packit 712bc5
        return gupnp_didl_lite_contributor_new_from_xml (res_node,
Packit 712bc5
                                                         object->priv->xml_doc);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_genre:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 * @genre: The Genre
Packit 712bc5
 *
Packit 712bc5
 * Set the genre of the @object to @genre.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_genre (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                  const char          *genre)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "genre",
Packit 712bc5
                            genre);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "genre");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_write_status:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @write_status: The write status string
Packit 712bc5
 *
Packit 712bc5
 * Set the write status of the @object to @write_status.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_write_status (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                         const char          *write_status)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                            &(object->priv->dc_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "writeStatus",
Packit 712bc5
                            write_status);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "write-status");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_album:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @album: The album string
Packit 712bc5
 *
Packit 712bc5
 * Set the album of the @object to @album.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_album (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                  const char          *album)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "album",
Packit 712bc5
                            album);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "album");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_album_art:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @album_art: The URI of album art
Packit 712bc5
 *
Packit 712bc5
 * Set the URI to album art of the @object to @album_art.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_album_art (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                      const char          *album_art)
Packit 712bc5
{
Packit 712bc5
        xmlNode *node;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        node = xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                                   GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                                   &(object->priv->upnp_ns),
Packit 712bc5
                                   object->priv->xml_doc->doc,
Packit 712bc5
                                   "albumArtURI",
Packit 712bc5
                                   album_art);
Packit 712bc5
Packit 712bc5
        xml_util_get_ns (object->priv->xml_doc->doc,
Packit 712bc5
                         GUPNP_XML_NAMESPACE_DLNA,
Packit 712bc5
                         &(object->priv->dlna_ns));
Packit 712bc5
Packit 712bc5
        xmlSetNsProp (node,
Packit 712bc5
                      object->priv->dlna_ns,
Packit 712bc5
                      (const unsigned char *) "profileID",
Packit 712bc5
                      (const unsigned char *) "JPEG_TN");
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "album-art");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_description:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @description: The description string
Packit 712bc5
 *
Packit 712bc5
 * Set the description of the @object to @description.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_description (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                        const char          *description)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                            &(object->priv->dc_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "description",
Packit 712bc5
                            description);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "description");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_date:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @date: The date string
Packit 712bc5
 *
Packit 712bc5
 * Set the date of the @object to @date.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_date (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                 const char          *date)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_DC,
Packit 712bc5
                            &(object->priv->dc_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "date",
Packit 712bc5
                            date);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "date");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_track_number:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @track_number: The original track number
Packit 712bc5
 *
Packit 712bc5
 * Set the original track number of the @object to @track_number.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_track_number (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                         int                  track_number)
Packit 712bc5
{
Packit 712bc5
        char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%d", track_number);
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "originalTrackNumber",
Packit 712bc5
                            str);
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "track-number");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_dlna_managed:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @dlna_managed: The #GUPnPOCMFlags.
Packit 712bc5
 *
Packit 712bc5
 * Set the 'dlna:dlnaManaged' attribute of the @object to @dlna_managed.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_dlna_managed (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                         GUPnPOCMFlags        dlna_managed)
Packit 712bc5
{
Packit 712bc5
        char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_get_ns (object->priv->xml_doc->doc,
Packit 712bc5
                         GUPNP_XML_NAMESPACE_DLNA,
Packit 712bc5
                         &(object->priv->dlna_ns));
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%08x", dlna_managed);
Packit 712bc5
        xmlSetNsProp (object->priv->xml_node,
Packit 712bc5
                      object->priv->dlna_ns,
Packit 712bc5
                      (const unsigned char *) "dlnaManaged",
Packit 712bc5
                      (const unsigned char *) str);
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "dlna-managed");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_set_update_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 * @update_id: Update ID
Packit 712bc5
 *
Packit 712bc5
 * Set the update ID of the @object.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_set_update_id (GUPnPDIDLLiteObject *object,
Packit 712bc5
                                      guint                update_id)
Packit 712bc5
{
Packit 712bc5
        char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%u", update_id);
Packit 712bc5
        xml_util_set_child (object->priv->xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &(object->priv->upnp_ns),
Packit 712bc5
                            object->priv->xml_doc->doc,
Packit 712bc5
                            "objectUpdateID",
Packit 712bc5
                            str);
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "update-id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_unset_update_id:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Unset the update ID property of the @object.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_unset_update_id (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        xml_util_unset_child (object->priv->xml_node,
Packit 712bc5
                              "objectUpdateID");
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "update-id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_add_resource:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a new resource, attaches it to @object and returns it.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer full): A new #GUPnPDIDLLiteResource object. Unref after usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteResource *
Packit 712bc5
gupnp_didl_lite_object_add_resource (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        xmlNode *res_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        res_node = xmlNewChild (object->priv->xml_node,
Packit 712bc5
                                NULL,
Packit 712bc5
                                (unsigned char *) "res",
Packit 712bc5
                                NULL);
Packit 712bc5
Packit 712bc5
        return gupnp_didl_lite_resource_new_from_xml (res_node,
Packit 712bc5
                                                      object->priv->xml_doc,
Packit 712bc5
                                                      object->priv->dlna_ns,
Packit 712bc5
                                                      object->priv->pv_ns);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_add_descriptor:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a new descriptor, attaches it to @object and returns it.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (transfer full): A new #GUPnPDIDLLiteDescriptor object. Unref after usage.
Packit 712bc5
 **/
Packit 712bc5
GUPnPDIDLLiteDescriptor *
Packit 712bc5
gupnp_didl_lite_object_add_descriptor (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        xmlNode *desc_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        desc_node = xmlNewChild (object->priv->xml_node,
Packit 712bc5
                                NULL,
Packit 712bc5
                                (unsigned char *) "desc",
Packit 712bc5
                                NULL);
Packit 712bc5
Packit 712bc5
        return gupnp_didl_lite_descriptor_new_from_xml (desc_node,
Packit 712bc5
                                                        object->priv->xml_doc);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_title_xml_string:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a string representation of the DIDL-Lite XML fragment related to the
Packit 712bc5
 * object title.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_title_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_string (object->priv->xml_node,
Packit 712bc5
                                          object->priv->xml_doc->doc,
Packit 712bc5
                                          "title");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_date_xml_string:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a string representation of the DIDL-Lite XML fragment related to the
Packit 712bc5
 * object date.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_date_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_string (object->priv->xml_node,
Packit 712bc5
                                          object->priv->xml_doc->doc,
Packit 712bc5
                                          "date");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_upnp_class_xml_string:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a string representation of the DIDL-Lite XML fragment related to the
Packit 712bc5
 * object UPnP class.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_upnp_class_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_string (object->priv->xml_node,
Packit 712bc5
                                          object->priv->xml_doc->doc,
Packit 712bc5
                                          "class");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_album_xml_string:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a string representation of the DIDL-Lite XML fragment related to the
Packit 712bc5
 * object album.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_album_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_string (object->priv->xml_node,
Packit 712bc5
                                          object->priv->xml_doc->doc,
Packit 712bc5
                                          "album");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_track_number_xml_string:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a string representation of the DIDL-Lite XML fragment related to the
Packit 712bc5
 * object track number.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_track_number_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return xml_util_get_child_string (object->priv->xml_node,
Packit 712bc5
                                          object->priv->xml_doc->doc,
Packit 712bc5
                                          "originalTrackNumber");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_artists_xml_string:
Packit 712bc5
 * @object: A #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Creates a string representation of the DIDL-Lite XML fragments related to the
Packit 712bc5
 * object artists.
Packit 712bc5
 *
Packit 712bc5
 * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_artists_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
Packit 712bc5
Packit 712bc5
        return get_contributors_xml_string_by_name (object, "artist");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_unset_artists:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Unset the artists properties of the @object.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_object_unset_artists (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        g_return_if_fail (object != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
Packit 712bc5
Packit 712bc5
        unset_contributors_by_name (object, "artist");
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (object), "artist");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/* GENERAL DOCS ABOUT FRAGMENT APPLYING.
Packit 712bc5
 *
Packit 712bc5
 * The function applying fragments takes two arrays of fragments. One
Packit 712bc5
 * array contains current fragments and another one contains new
Packit 712bc5
 * fragments. Both arrays have to be of equal length and have more
Packit 712bc5
 * then zero elements. Each of fragments in both arrays make a pair
Packit 712bc5
 * (i.e. first/second/third/... fragment in current array and
Packit 712bc5
 * first/second/third/... fragment in new array form a pair). Each
Packit 712bc5
 * fragment can have zero, one or more XML elements.
Packit 712bc5
 *
Packit 712bc5
 * For each fragment pair first we check if current fragment is indeed
Packit 712bc5
 * a part of this object's document. If it is then we check validity
Packit 712bc5
 * of new fragment for applying. If it is then we replace the current
Packit 712bc5
 * fragment with new fragment in object's document copy and validate
Packit 712bc5
 * the modified document against didl-lite schema. After all fragment
Packit 712bc5
 * pairs are processed we replace a part describing this object in
Packit 712bc5
 * original document with respective one in modified document.
Packit 712bc5
 *
Packit 712bc5
 * Checking if current fragment is a part of object's document is in
Packit 712bc5
 * essence checking for deep equality of document's node and this
Packit 712bc5
 * fragment (i.e. element name and properties have to be equal, same
Packit 712bc5
 * for children).
Packit 712bc5
 *
Packit 712bc5
 * Checking if new fragment is valid for applying is about checking
Packit 712bc5
 * whether element in new fragment is either a context (i.e. both
Packit 712bc5
 * current element and new element are deep equal) or element
Packit 712bc5
 * modification (i.e. changes attributes but element name is still the
Packit 712bc5
 * same). There may be a case when there are more elements in current
Packit 712bc5
 * fragment than in new fragment then those excessive elements are
Packit 712bc5
 * checked whether they can be really removed. The other case is when
Packit 712bc5
 * there are more elements in new fragments than in current fragment -
Packit 712bc5
 * in such situation we check if additions are valid.
Packit 712bc5
 *
Packit 712bc5
 * By checking validity of modification, removals or additions we mean
Packit 712bc5
 * that no read-only properties are changed. Additionaly, for
Packit 712bc5
 * removals, we check if required properties are not removed.
Packit 712bc5
 *
Packit 712bc5
 * This approach may fail in some more twisted cases.
Packit 712bc5
 */
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_apply_fragments:
Packit 712bc5
 * @object: The #GUPnPDIDLLiteObject
Packit 712bc5
 * @current_fragments: (array length=current_size) (transfer none): XML
Packit 712bc5
 * fragments of @object.
Packit 712bc5
 * @current_size: Size of @current_fragments or -1.
Packit 712bc5
 * @new_fragments: (array length=new_size) (transfer none): Substitutes
Packit 712bc5
 * for @current_fragments.
Packit 712bc5
 * @new_size: Size of @new_fragments or -1.
Packit 712bc5
 *
Packit 712bc5
 * Updates object by applying @new_fragments in places of
Packit 712bc5
 * @current_fragments. For @current_size and @new_size -1 can be
Packit 712bc5
 * passed when respectively @current_fragments and @new_fragments are
Packit 712bc5
 * NULL terminated.
Packit 712bc5
 *
Packit 712bc5
 * Returns: Result of operation.
Packit 712bc5
 */
Packit 712bc5
GUPnPDIDLLiteFragmentResult
Packit 712bc5
gupnp_didl_lite_object_apply_fragments (GUPnPDIDLLiteObject  *object,
Packit 712bc5
                                        gchar               **current_fragments,
Packit 712bc5
                                        gint                  current_size,
Packit 712bc5
                                        gchar               **new_fragments,
Packit 712bc5
                                        gint                  new_size)
Packit 712bc5
{
Packit 712bc5
        DocNode modified;
Packit 712bc5
        DocNode original;
Packit 712bc5
        GUPnPDIDLLiteFragmentResult result;
Packit 712bc5
        gint iter;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object),
Packit 712bc5
                              GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR);
Packit 712bc5
        g_return_val_if_fail (current_fragments != NULL,
Packit 712bc5
                              GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_INVALID);
Packit 712bc5
        g_return_val_if_fail (new_fragments != NULL,
Packit 712bc5
                              GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_INVALID);
Packit 712bc5
Packit 712bc5
        result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK;
Packit 712bc5
        modified.doc = NULL;
Packit 712bc5
Packit 712bc5
        if (current_size < 0)
Packit 712bc5
                current_size = g_strv_length (current_fragments);
Packit 712bc5
        if (new_size < 0)
Packit 712bc5
                new_size = g_strv_length (new_fragments);
Packit 712bc5
Packit 712bc5
        if (current_size != new_size) {
Packit 712bc5
                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_MISMATCH;
Packit 712bc5
Packit 712bc5
                goto out;
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        if (!current_size) {
Packit 712bc5
                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_INVALID;
Packit 712bc5
Packit 712bc5
                goto out;
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        original.doc = object->priv->xml_doc->doc;
Packit 712bc5
        original.node = object->priv->xml_node;
Packit 712bc5
        modified.doc = xmlCopyDoc (original.doc, 1);
Packit 712bc5
Packit 712bc5
        if (modified.doc == NULL) {
Packit 712bc5
                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
Packit 712bc5
Packit 712bc5
                goto out;
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        modified.node = xml_util_find_node (modified.doc->children,
Packit 712bc5
                                            original.node);
Packit 712bc5
Packit 712bc5
        if (modified.node == NULL) {
Packit 712bc5
                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
Packit 712bc5
Packit 712bc5
                goto out;
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        for (iter = 0; iter < new_size; ++iter) {
Packit 712bc5
                const gchar *current_fragment = current_fragments[iter];
Packit 712bc5
                const gchar *new_fragment = new_fragments[iter];
Packit 712bc5
Packit 712bc5
                result = fragment_util_check_fragments (&original,
Packit 712bc5
                                                        &modified,
Packit 712bc5
                                                        current_fragment,
Packit 712bc5
                                                        new_fragment,
Packit 712bc5
                                                        didl_lite_xsd);
Packit 712bc5
Packit 712bc5
                if (result != GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK)
Packit 712bc5
                        goto out;
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        if (!fragment_util_apply_modification (&object->priv->xml_node,
Packit 712bc5
                                               &modified))
Packit 712bc5
                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
Packit 712bc5
 out:
Packit 712bc5
        if (modified.doc != NULL)
Packit 712bc5
                xmlFreeDoc (modified.doc);
Packit 712bc5
        return result;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_object_get_xml_string:
Packit 712bc5
 * @object: #GUPnPDIDLLiteObject
Packit 712bc5
 *
Packit 712bc5
 * Get the representation of this object as an XML string.
Packit 712bc5
 * Returns: (transfer full): XML representation of this object as string.
Packit 712bc5
 **/
Packit 712bc5
char *
Packit 712bc5
gupnp_didl_lite_object_get_xml_string (GUPnPDIDLLiteObject *object)
Packit 712bc5
{
Packit 712bc5
        xmlBuffer *buffer = NULL;
Packit 712bc5
        char *ret = NULL;
Packit 712bc5
Packit 712bc5
        buffer = xmlBufferCreate ();
Packit 712bc5
        xmlNodeDump (buffer,
Packit 712bc5
                     object->priv->xml_doc->doc,
Packit 712bc5
                     object->priv->xml_node,
Packit 712bc5
                     0,
Packit 712bc5
                     0);
Packit 712bc5
Packit 712bc5
        ret = g_strndup ((char *) xmlBufferContent (buffer),
Packit 712bc5
                         xmlBufferLength (buffer));
Packit 712bc5
        xmlBufferFree (buffer);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}