Blame libgupnp-av/gupnp-didl-lite-container.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) <zeeshanak@gnome.org>
Packit 712bc5
 *                                <zeeshan.ali@nokia.com>
Packit 712bc5
 *          Krzesimir Nowak <krnowak@openismus.com>
Packit 712bc5
 *          Christophe Guiraud <christophe.guiraud@intel.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-container
Packit 712bc5
 * @short_description: DIDL-Lite Container
Packit 712bc5
 *
Packit 712bc5
 * #GUPnPDIDLLiteContainer respresents a DIDL-Lite container element.
Packit 712bc5
 */
Packit 712bc5
Packit 712bc5
#include <string.h>
Packit 712bc5
Packit 712bc5
#include "gupnp-didl-lite-container.h"
Packit 712bc5
#include "gupnp-didl-lite-object-private.h"
Packit 712bc5
#include "gupnp-didl-lite-createclass.h"
Packit 712bc5
#include "gupnp-didl-lite-createclass-private.h"
Packit 712bc5
#include "xml-util.h"
Packit 712bc5
Packit 712bc5
Packit 712bc5
G_DEFINE_TYPE (GUPnPDIDLLiteContainer,
Packit 712bc5
               gupnp_didl_lite_container,
Packit 712bc5
               GUPNP_TYPE_DIDL_LITE_OBJECT);
Packit 712bc5
Packit 712bc5
enum {
Packit 712bc5
        PROP_0,
Packit 712bc5
        PROP_SEARCHABLE,
Packit 712bc5
        PROP_CHILD_COUNT,
Packit 712bc5
        PROP_STORAGE_USED,
Packit 712bc5
        PROP_CONTAINER_UPDATE_ID,
Packit 712bc5
        PROP_TOTAL_DELETED_CHILD_COUNT
Packit 712bc5
};
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_container_init (G_GNUC_UNUSED GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        /* Nothing to initialize, yay! */
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
static void
Packit 712bc5
gupnp_didl_lite_container_get_property (GObject    *object,
Packit 712bc5
                                        guint       property_id,
Packit 712bc5
                                        GValue     *value,
Packit 712bc5
                                        GParamSpec *pspec)
Packit 712bc5
{
Packit 712bc5
        GUPnPDIDLLiteContainer *container;
Packit 712bc5
Packit 712bc5
        container = GUPNP_DIDL_LITE_CONTAINER (object);
Packit 712bc5
Packit 712bc5
        switch (property_id) {
Packit 712bc5
        case PROP_SEARCHABLE:
Packit 712bc5
                g_value_set_boolean
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_container_get_searchable (container));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_CHILD_COUNT:
Packit 712bc5
                g_value_set_int
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_container_get_child_count (container));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_STORAGE_USED:
Packit 712bc5
                g_value_set_long
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_container_get_storage_used (container));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_CONTAINER_UPDATE_ID:
Packit 712bc5
                g_value_set_uint
Packit 712bc5
                              (value,
Packit 712bc5
                               gupnp_didl_lite_container_get_container_update_id
Packit 712bc5
                                        (container));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_TOTAL_DELETED_CHILD_COUNT:
Packit 712bc5
                g_value_set_uint
Packit 712bc5
                        (value,
Packit 712bc5
                         gupnp_didl_lite_container_get_total_deleted_child_count
Packit 712bc5
                                        (container));
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_container_set_property (GObject      *object,
Packit 712bc5
                                        guint         property_id,
Packit 712bc5
                                        const GValue *value,
Packit 712bc5
                                        GParamSpec   *pspec)
Packit 712bc5
Packit 712bc5
{
Packit 712bc5
        GUPnPDIDLLiteContainer *container;
Packit 712bc5
Packit 712bc5
        container = GUPNP_DIDL_LITE_CONTAINER (object);
Packit 712bc5
Packit 712bc5
        switch (property_id) {
Packit 712bc5
        case PROP_SEARCHABLE:
Packit 712bc5
                gupnp_didl_lite_container_set_searchable
Packit 712bc5
                                        (container,
Packit 712bc5
                                         g_value_get_boolean (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_CHILD_COUNT:
Packit 712bc5
                gupnp_didl_lite_container_set_child_count
Packit 712bc5
                                        (container,
Packit 712bc5
                                         g_value_get_int (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_STORAGE_USED:
Packit 712bc5
                gupnp_didl_lite_container_set_storage_used
Packit 712bc5
                                        (container,
Packit 712bc5
                                         g_value_get_int64 (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_CONTAINER_UPDATE_ID:
Packit 712bc5
                gupnp_didl_lite_container_set_container_update_id
Packit 712bc5
                                        (container,
Packit 712bc5
                                         g_value_get_uint (value));
Packit 712bc5
                break;
Packit 712bc5
        case PROP_TOTAL_DELETED_CHILD_COUNT:
Packit 712bc5
                gupnp_didl_lite_container_set_total_deleted_child_count
Packit 712bc5
                                        (container,
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_container_class_init (GUPnPDIDLLiteContainerClass *klass)
Packit 712bc5
{
Packit 712bc5
        GObjectClass *object_class;
Packit 712bc5
Packit 712bc5
        object_class = G_OBJECT_CLASS (klass);
Packit 712bc5
Packit 712bc5
        object_class->get_property = gupnp_didl_lite_container_get_property;
Packit 712bc5
        object_class->set_property = gupnp_didl_lite_container_set_property;
Packit 712bc5
Packit 712bc5
        /**
Packit 712bc5
         * GUPnPDIDLLiteContainer:searchable:
Packit 712bc5
         *
Packit 712bc5
         * Whether this container is searchable.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_SEARCHABLE,
Packit 712bc5
                 g_param_spec_boolean ("searchable",
Packit 712bc5
                                       "Searchable",
Packit 712bc5
                                       "Whether this container is searchable.",
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
         * GUPnPDIDLLiteContainer:child-count:
Packit 712bc5
         *
Packit 712bc5
         * The child count of this container.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_CHILD_COUNT,
Packit 712bc5
                 g_param_spec_int ("child-count",
Packit 712bc5
                                   "ChildCount",
Packit 712bc5
                                   "The child count of this container.",
Packit 712bc5
                                   0,
Packit 712bc5
                                   G_MAXINT,
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
        /**
Packit 712bc5
         * GUPnPDIDLLiteContainer:storage-used:
Packit 712bc5
         *
Packit 712bc5
         * The number of bytes used by all child items of this container.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                (object_class,
Packit 712bc5
                 PROP_STORAGE_USED,
Packit 712bc5
                 g_param_spec_int64 ("storage-used",
Packit 712bc5
                                     "Storage Used",
Packit 712bc5
                                     "The Number of bytes used by all child "
Packit 712bc5
                                     "items of this container.",
Packit 712bc5
                                     -1,
Packit 712bc5
                                     G_MAXINT64,
Packit 712bc5
                                     -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
         * GUPnPDIDLLiteContainer:container-update-id:
Packit 712bc5
         *
Packit 712bc5
         * Update ID of this container.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
                             (object_class,
Packit 712bc5
                              PROP_CONTAINER_UPDATE_ID,
Packit 712bc5
                              g_param_spec_uint ("container-update-id",
Packit 712bc5
                                                 "ContainerUpdateID",
Packit 712bc5
                                                 "Update ID of this container.",
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
        /**
Packit 712bc5
         * GUPnPDIDLLiteContainer:total-deleted-child-count:
Packit 712bc5
         *
Packit 712bc5
         * Total deleted child count of this container.
Packit 712bc5
         **/
Packit 712bc5
        g_object_class_install_property
Packit 712bc5
             (object_class,
Packit 712bc5
              PROP_TOTAL_DELETED_CHILD_COUNT,
Packit 712bc5
              g_param_spec_uint ("total-deleted-child-count",
Packit 712bc5
                                 "TotalDeletedChildCOunt",
Packit 712bc5
                                 "Total deleted child count of this container.",
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
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_searchable:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Checks whether @container is searchable.
Packit 712bc5
 *
Packit 712bc5
 * Return value: #TRUE if @container is searchable.
Packit 712bc5
 **/
Packit 712bc5
gboolean
Packit 712bc5
gupnp_didl_lite_container_get_searchable (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, FALSE);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), FALSE);
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        return xml_util_get_boolean_attribute (xml_node, "searchable");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_child_count:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Get the child count of the @container.  If the child count is unknown, -1 is
Packit 712bc5
 * returned.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The child count of the @container, or -1 if it is unknown.
Packit 712bc5
 **/
Packit 712bc5
gint
Packit 712bc5
gupnp_didl_lite_container_get_child_count (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, 0);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), 0);
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        return xml_util_get_int_attribute (xml_node, "childCount", -1);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_container_update_id:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Get the container update ID of the @container.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The container update ID of the @container.
Packit 712bc5
 **/
Packit 712bc5
guint
Packit 712bc5
gupnp_didl_lite_container_get_container_update_id
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, 0);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), 0);
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        return xml_util_get_uint_child_element (xml_node,
Packit 712bc5
                                                "containerUpdateID",
Packit 712bc5
                                                0);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_container_update_id_is_set:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Get whether the container update ID of the @container 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_container_container_update_id_is_set
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        const char *content;
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, FALSE);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), FALSE);
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                        (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
        content = xml_util_get_child_element_content (xml_node,
Packit 712bc5
                                                      "containerUpdateID");
Packit 712bc5
        return content != NULL;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_total_deleted_child_count:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Get the total deleted child count of the @container.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The total deleted child count of the @container.
Packit 712bc5
 **/
Packit 712bc5
guint
Packit 712bc5
gupnp_didl_lite_container_get_total_deleted_child_count
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, 0);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), 0);
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        return xml_util_get_uint_child_element (xml_node,
Packit 712bc5
                                                "totalDeletedChildCount",
Packit 712bc5
                                                -1);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_total_deleted_child_count_is_set:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Get whether the total deleted child conut of the @container is set.
Packit 712bc5
 *
Packit 712bc5
 * Return value: %TRUE if property is set, otherwise %FALSE
Packit 712bc5
 **/
Packit 712bc5
gboolean
Packit 712bc5
gupnp_didl_lite_container_total_deleted_child_count_is_set
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        const char *content;
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, FALSE);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), FALSE);
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                        (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
        content = xml_util_get_child_element_content (xml_node,
Packit 712bc5
                                                      "totalDeletedChildCount");
Packit 712bc5
        return content != NULL;
Packit 712bc5
}
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_create_classes:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Gets the list of create classes of the @container.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (element-type utf8) (transfer full): The list of create classes
Packit 712bc5
 * belonging to @container, or %NULL.
Packit 712bc5
 * #g_list_free the returned list after usage and #g_free each string in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_container_get_create_classes (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        GList *classes = NULL;
Packit 712bc5
        GList *ret = NULL;
Packit 712bc5
        GList *l;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), NULL);
Packit 712bc5
Packit 712bc5
        classes = gupnp_didl_lite_object_get_properties (
Packit 712bc5
                        GUPNP_DIDL_LITE_OBJECT (container),
Packit 712bc5
                        "createClass");
Packit 712bc5
Packit 712bc5
        for (l = classes; l; l = l->next) {
Packit 712bc5
                char *create_class;
Packit 712bc5
                xmlNode *node;
Packit 712bc5
Packit 712bc5
                node = (xmlNode *) l->data;
Packit 712bc5
Packit 712bc5
                if (node->children != NULL) {
Packit 712bc5
                    create_class = g_strdup ((const char *) node->children->content);
Packit 712bc5
Packit 712bc5
                    ret = g_list_append (ret, create_class);
Packit 712bc5
                }
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (classes);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_create_classes_full:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Gets the list of create classes of the @container.
Packit 712bc5
 *
Packit 712bc5
 * Returns: (element-type GUPnPDIDLLiteCreateClass*) (transfer full): The list
Packit 712bc5
 * of create classes belonging to @container, 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_container_get_create_classes_full (
Packit 712bc5
                                            GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        GList *cc_list = NULL;
Packit 712bc5
        GList *ret = NULL;
Packit 712bc5
        GList *l;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), NULL);
Packit 712bc5
Packit 712bc5
        cc_list = gupnp_didl_lite_object_get_properties (
Packit 712bc5
                                           GUPNP_DIDL_LITE_OBJECT (container),
Packit 712bc5
                                           "createClass");
Packit 712bc5
Packit 712bc5
        for (l = cc_list; l; l = l->next) {
Packit 712bc5
                GUPnPDIDLLiteCreateClass *cc;
Packit 712bc5
                xmlNode *cc_node;
Packit 712bc5
                GUPnPAVXMLDoc *cc_doc;
Packit 712bc5
Packit 712bc5
                cc_node = (xmlNode *) l->data;
Packit 712bc5
                if (!cc_node->children)
Packit 712bc5
                        continue;
Packit 712bc5
Packit 712bc5
                cc_doc = gupnp_didl_lite_object_get_gupnp_xml_doc (
Packit 712bc5
                                           GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
                cc = gupnp_didl_lite_create_class_new_from_xml (cc_node, cc_doc);
Packit 712bc5
Packit 712bc5
                ret = g_list_append (ret, cc);
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (cc_list);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_search_classes:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Gets the list of search classes of the @container.
Packit 712bc5
 *
Packit 712bc5
 * Return value: (element-type utf8) (transfer full): The list of search classes
Packit 712bc5
 * belonging to @container, or %NULL. #g_list_free the returned list after usage
Packit 712bc5
 * and #g_free each string in it.
Packit 712bc5
 **/
Packit 712bc5
GList *
Packit 712bc5
gupnp_didl_lite_container_get_search_classes (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        GList *classes = NULL;
Packit 712bc5
        GList *ret = NULL;
Packit 712bc5
        GList *l;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, NULL);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), NULL);
Packit 712bc5
Packit 712bc5
        classes = gupnp_didl_lite_object_get_properties (
Packit 712bc5
                        GUPNP_DIDL_LITE_OBJECT (container),
Packit 712bc5
                        "searchClass");
Packit 712bc5
Packit 712bc5
        for (l = classes; l; l = l->next) {
Packit 712bc5
                char *search_class;
Packit 712bc5
                xmlNode *node;
Packit 712bc5
Packit 712bc5
                node = (xmlNode *) l->data;
Packit 712bc5
                if (node->children != NULL) {
Packit 712bc5
                    search_class = g_strdup ((const char *) node->children->content);
Packit 712bc5
Packit 712bc5
                    ret = g_list_append (ret, search_class);
Packit 712bc5
                }
Packit 712bc5
        }
Packit 712bc5
Packit 712bc5
        g_list_free (classes);
Packit 712bc5
Packit 712bc5
        return ret;
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_get_storage_used:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Get the number of bytes used by all child items of the @container.
Packit 712bc5
 * If storage used is unknown, -1 is returned.
Packit 712bc5
 *
Packit 712bc5
 * Return value: The number of bytes used by all children of the @container,
Packit 712bc5
 * or -1 if it is unknown.
Packit 712bc5
 **/
Packit 712bc5
gint64
Packit 712bc5
gupnp_didl_lite_container_get_storage_used (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        GList *storage = NULL;
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        const char *str;
Packit 712bc5
Packit 712bc5
        g_return_val_if_fail (container != NULL, 0);
Packit 712bc5
        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), 0);
Packit 712bc5
Packit 712bc5
        storage = gupnp_didl_lite_object_get_properties (
Packit 712bc5
                                        GUPNP_DIDL_LITE_OBJECT (container),
Packit 712bc5
                                        "storageUsed");
Packit 712bc5
        if (storage == NULL)
Packit 712bc5
                return -1;
Packit 712bc5
Packit 712bc5
        /* only return value from first node */
Packit 712bc5
        xml_node = (xmlNode *) storage->data;
Packit 712bc5
Packit 712bc5
        g_list_free (storage);
Packit 712bc5
Packit 712bc5
        str = (const char *) xml_node->content;
Packit 712bc5
Packit 712bc5
        return g_ascii_strtoll (str, NULL, 10);
Packit 712bc5
}
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_set_searchable:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @searchable: The searchibility
Packit 712bc5
 *
Packit 712bc5
 * (Un)set the searchibility of @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_set_searchable (GUPnPDIDLLiteContainer *container,
Packit 712bc5
                                          gboolean                searchable)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        const char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        if (searchable)
Packit 712bc5
                str = "1";
Packit 712bc5
        else
Packit 712bc5
                str = "0";
Packit 712bc5
        xmlSetProp (xml_node,
Packit 712bc5
                    (unsigned char *) "searchable",
Packit 712bc5
                    (unsigned char *) str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "searchable");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_set_child_count:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @child_count: The child count
Packit 712bc5
 *
Packit 712bc5
 * Set the child count of the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_set_child_count (GUPnPDIDLLiteContainer *container,
Packit 712bc5
                                           gint                    child_count)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%d", child_count);
Packit 712bc5
        xmlSetProp (xml_node,
Packit 712bc5
                    (unsigned char *) "childCount",
Packit 712bc5
                    (unsigned char *) str);
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "child-count");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_set_container_update_id:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @update_id: The container update ID
Packit 712bc5
 *
Packit 712bc5
 * Set the container update ID of the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_set_container_update_id
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container,
Packit 712bc5
                                         guint                   update_id)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        xmlNsPtr upnp_ns;
Packit 712bc5
        GUPnPAVXMLDoc *xml_doc;
Packit 712bc5
        char *str;
Packit 712bc5
        GUPnPDIDLLiteObject *self_as_object;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        self_as_object = GUPNP_DIDL_LITE_OBJECT (container);
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node (self_as_object);
Packit 712bc5
        xml_doc = gupnp_didl_lite_object_get_gupnp_xml_doc (self_as_object);
Packit 712bc5
        upnp_ns = gupnp_didl_lite_object_get_upnp_namespace (self_as_object);
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%u", update_id);
Packit 712bc5
        xml_util_set_child (xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &upnp_ns,
Packit 712bc5
                            xml_doc->doc,
Packit 712bc5
                            "containerUpdateID",
Packit 712bc5
                            str);
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "container-update-id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_unset_container_update_id:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Unset the container update ID property of the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_unset_container_update_id
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                        (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
        xml_util_unset_child (xml_node, "containerUpdateID");
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "container-update-id");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_set_total_deleted_child_count:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @count: The container update ID
Packit 712bc5
 *
Packit 712bc5
 * Set the container update ID of the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_set_total_deleted_child_count
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container,
Packit 712bc5
                                         guint                   count)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        xmlNsPtr upnp_ns;
Packit 712bc5
        GUPnPAVXMLDoc *xml_doc;
Packit 712bc5
        char *str;
Packit 712bc5
        GUPnPDIDLLiteObject *self_as_object;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        self_as_object = GUPNP_DIDL_LITE_OBJECT (container);
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node (self_as_object);
Packit 712bc5
        xml_doc = gupnp_didl_lite_object_get_gupnp_xml_doc (self_as_object);
Packit 712bc5
        upnp_ns = gupnp_didl_lite_object_get_upnp_namespace (self_as_object);
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%u", count);
Packit 712bc5
        xml_util_set_child (xml_node,
Packit 712bc5
                            GUPNP_XML_NAMESPACE_UPNP,
Packit 712bc5
                            &upnp_ns,
Packit 712bc5
                            xml_doc->doc,
Packit 712bc5
                            "totalDeletedChildCount",
Packit 712bc5
                            str);
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "total-deleted-child-count");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_unset_total_deleted_child_count:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 *
Packit 712bc5
 * Unset the total deleted child count property of the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_unset_total_deleted_child_count
Packit 712bc5
                                        (GUPnPDIDLLiteContainer *container)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                        (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
        xml_util_unset_child (xml_node, "totalDeletedChildCount");
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "total-deleted-child-count");
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_add_create_class:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @create_class: The createClass to add.
Packit 712bc5
 *
Packit 712bc5
 * Add a new create class to the @container. includeDerived defaults to "0".
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_add_create_class (
Packit 712bc5
                GUPnPDIDLLiteContainer *container,
Packit 712bc5
                const char             *create_class)
Packit 712bc5
{
Packit 712bc5
        gupnp_didl_lite_container_add_create_class_full (container,
Packit 712bc5
                                                         create_class,
Packit 712bc5
                                                         FALSE);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_add_create_class_full:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @create_class: The createClass to add.
Packit 712bc5
 * @include_derived: Whether object with dervied classes may be created in
Packit 712bc5
 * this container or not.
Packit 712bc5
 *
Packit 712bc5
 * Add a new create class to the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_add_create_class_full (
Packit 712bc5
                GUPnPDIDLLiteContainer *container,
Packit 712bc5
                const char             *create_class,
Packit 712bc5
                gboolean                include_derived)
Packit 712bc5
{
Packit 712bc5
        xmlNode *container_node, *new_node;
Packit 712bc5
        xmlNs *namespace;
Packit 712bc5
        const char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        container_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
        namespace = gupnp_didl_lite_object_get_upnp_namespace
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        new_node = xmlNewChild (container_node,
Packit 712bc5
                                namespace,
Packit 712bc5
                                (unsigned char *) "createClass",
Packit 712bc5
                                (unsigned char *) create_class);
Packit 712bc5
        if (include_derived)
Packit 712bc5
                str = "1";
Packit 712bc5
        else
Packit 712bc5
                str = "0";
Packit 712bc5
Packit 712bc5
        xmlSetProp (new_node,
Packit 712bc5
                    (unsigned char *) "includeDerived",
Packit 712bc5
                    (unsigned char *) str);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_add_search_class:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @search_class: The searchClass to add.
Packit 712bc5
 *
Packit 712bc5
 * Add a new search class to the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_add_search_class (
Packit 712bc5
                GUPnPDIDLLiteContainer *container,
Packit 712bc5
                const char             *search_class)
Packit 712bc5
{
Packit 712bc5
        gupnp_didl_lite_container_add_search_class_full (container,
Packit 712bc5
                                                         search_class,
Packit 712bc5
                                                         TRUE);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_add_search_class_full:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @search_class: The searchClass to add.
Packit 712bc5
 * @include_derived: includeDerived attribute of the DIDL
Packit 712bc5
 *
Packit 712bc5
 * Add a new search class to the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_add_search_class_full (
Packit 712bc5
                GUPnPDIDLLiteContainer *container,
Packit 712bc5
                const char             *search_class,
Packit 712bc5
                gboolean                include_derived)
Packit 712bc5
{
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        xmlNode *new_xml_node;
Packit 712bc5
        xmlNs *namespace;
Packit 712bc5
        const char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
        namespace = gupnp_didl_lite_object_get_upnp_namespace
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        new_xml_node = xmlNewChild (xml_node,
Packit 712bc5
                                    namespace,
Packit 712bc5
                                    (unsigned char *) "searchClass",
Packit 712bc5
                                    (unsigned char *) search_class);
Packit 712bc5
Packit 712bc5
        if (include_derived)
Packit 712bc5
                str = "1";
Packit 712bc5
        else
Packit 712bc5
                str = "0";
Packit 712bc5
Packit 712bc5
        xmlSetProp (new_xml_node,
Packit 712bc5
                    (unsigned char*) "includeDerived",
Packit 712bc5
                    (unsigned char*) str);
Packit 712bc5
}
Packit 712bc5
Packit 712bc5
/**
Packit 712bc5
 * gupnp_didl_lite_container_set_storage_used:
Packit 712bc5
 * @container: #GUPnPDIDLLiteContainer
Packit 712bc5
 * @storage_used: The number of bytes used by all child items of the
Packit 712bc5
 *                @container or -1 if unknown.
Packit 712bc5
 *
Packit 712bc5
 * Set the number of bytes used by all child items of the @container.
Packit 712bc5
 **/
Packit 712bc5
void
Packit 712bc5
gupnp_didl_lite_container_set_storage_used (
Packit 712bc5
                GUPnPDIDLLiteContainer *container,
Packit 712bc5
                gint64                  storage_used)
Packit 712bc5
{
Packit 712bc5
        GList *storage = NULL;
Packit 712bc5
        xmlNode *xml_node;
Packit 712bc5
        xmlNs *namespace;
Packit 712bc5
        char *str;
Packit 712bc5
Packit 712bc5
        g_return_if_fail (container != NULL);
Packit 712bc5
        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
Packit 712bc5
Packit 712bc5
        xml_node = gupnp_didl_lite_object_get_xml_node
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        namespace = gupnp_didl_lite_object_get_upnp_namespace
Packit 712bc5
                                (GUPNP_DIDL_LITE_OBJECT (container));
Packit 712bc5
Packit 712bc5
        str = g_strdup_printf ("%"G_GINT64_FORMAT, storage_used);
Packit 712bc5
Packit 712bc5
        storage = gupnp_didl_lite_object_get_properties (
Packit 712bc5
                                        GUPNP_DIDL_LITE_OBJECT (container),
Packit 712bc5
                                        "storageUsed");
Packit 712bc5
        if (storage == NULL)
Packit 712bc5
                xmlNewChild (xml_node,
Packit 712bc5
                             namespace,
Packit 712bc5
                             (unsigned char *) "storageUsed",
Packit 712bc5
                             (unsigned char *) str);
Packit 712bc5
        else
Packit 712bc5
                xmlNodeSetContent ((xmlNode *) storage->data,
Packit 712bc5
                                   (unsigned char *) str);
Packit 712bc5
Packit 712bc5
        g_free (str);
Packit 712bc5
Packit 712bc5
        g_object_notify (G_OBJECT (container), "storage-used");
Packit 712bc5
}