/* * Copyright (C) 2012 Intel Corporation. * Copyright (C) 2009 Nokia Corporation. * * Author: Christophe Guiraud * Author: Zeeshan Ali (Khattak) * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** * SECTION:gupnp-didl-lite-create-class * @short_description: DIDL-Lite CreateClass * * #GUPnPDIDLLiteCreateClass respresents a DIDL-Lite create class element. */ #include #include "gupnp-didl-lite-createclass.h" #include "gupnp-didl-lite-createclass-private.h" #include "xml-util.h" G_DEFINE_TYPE (GUPnPDIDLLiteCreateClass, gupnp_didl_lite_create_class, G_TYPE_OBJECT); struct _GUPnPDIDLLiteCreateClassPrivate { xmlNode *xml_node; GUPnPAVXMLDoc *xml_doc; }; enum { PROP_0, PROP_XML_NODE, PROP_XML_DOC, PROP_CONTENT, PROP_INCLUDE_DERIVED, PROP_FRIENDLY_NAME, }; static void gupnp_didl_lite_create_class_init (GUPnPDIDLLiteCreateClass *create_class) { create_class->priv = G_TYPE_INSTANCE_GET_PRIVATE (create_class, GUPNP_TYPE_DIDL_LITE_CREATE_CLASS, GUPnPDIDLLiteCreateClassPrivate); } static void gupnp_didl_lite_create_class_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GUPnPDIDLLiteCreateClass *create_class; create_class = GUPNP_DIDL_LITE_CREATE_CLASS (object); switch (property_id) { case PROP_XML_NODE: g_value_set_pointer (value, gupnp_didl_lite_create_class_get_xml_node (create_class)); break; case PROP_CONTENT: g_value_set_string (value, gupnp_didl_lite_create_class_get_content (create_class)); break; case PROP_INCLUDE_DERIVED: g_value_set_boolean (value, gupnp_didl_lite_create_class_get_include_derived (create_class)); break; case PROP_FRIENDLY_NAME: g_value_set_string (value, gupnp_didl_lite_create_class_get_friendly_name (create_class)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gupnp_didl_lite_create_class_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GUPnPDIDLLiteCreateClass *create_class; create_class = GUPNP_DIDL_LITE_CREATE_CLASS (object); switch (property_id) { case PROP_XML_NODE: create_class->priv->xml_node = g_value_get_pointer (value); break; case PROP_XML_DOC: create_class->priv->xml_doc = g_value_dup_boxed (value); break; case PROP_CONTENT: gupnp_didl_lite_create_class_set_content (create_class, g_value_get_string (value)); break; case PROP_INCLUDE_DERIVED: gupnp_didl_lite_create_class_set_include_derived (create_class, g_value_get_boolean (value)); break; case PROP_FRIENDLY_NAME: gupnp_didl_lite_create_class_set_friendly_name (create_class, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gupnp_didl_lite_create_class_dispose (GObject *object) { GObjectClass *object_class; GUPnPDIDLLiteCreateClassPrivate *priv; priv = GUPNP_DIDL_LITE_CREATE_CLASS (object)->priv; g_clear_pointer (&priv->xml_doc, xml_doc_unref); object_class = G_OBJECT_CLASS (gupnp_didl_lite_create_class_parent_class); object_class->dispose (object); } static void gupnp_didl_lite_create_class_class_init (GUPnPDIDLLiteCreateClassClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->get_property = gupnp_didl_lite_create_class_get_property; object_class->set_property = gupnp_didl_lite_create_class_set_property; object_class->dispose = gupnp_didl_lite_create_class_dispose; g_type_class_add_private (klass, sizeof (GUPnPDIDLLiteCreateClassPrivate)); /** * GUPnPDIDLLiteCreateClass:xml-node: * * The pointer to desc node in XML document. **/ g_object_class_install_property (object_class, PROP_XML_NODE, g_param_spec_pointer ("xml-node", "XMLNode", "The pointer to desc node in XML" " document.", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteCreateClass:xml-doc: * * The reference to XML document containing this object. * * Internal property. * * Stability: Private **/ g_object_class_install_property (object_class, PROP_XML_DOC, g_param_spec_boxed ("xml-doc", "XMLDoc", "The reference to XML document" " containing this object.", xml_doc_get_type (), G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteCreateClass:content: * * The content of this create Class. **/ g_object_class_install_property (object_class, PROP_CONTENT, g_param_spec_string ("content", "Content", "The content of this create Class.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteCreateClass:include-derived: * * Whether this create Class can be derived. **/ g_object_class_install_property (object_class, PROP_INCLUDE_DERIVED, g_param_spec_boolean ("include-derived", "IncludeDerived", "Wether this create Class can be derived.", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); /** * GUPnPDIDLLiteCreateClass:friendly-name: * * The friendly name of this create Class. **/ g_object_class_install_property (object_class, PROP_FRIENDLY_NAME, g_param_spec_string ("friendly-name", "FriendlyName", "The friendly name of this create Class.", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); } /** * gupnp_didl_lite_create_class_get_content: * @create_class: #GUPnPDIDLLiteCreateClass * * Get the content of the @create_class. * * Return value: The Content of the @create_class, or %NULL. **/ const char * gupnp_didl_lite_create_class_get_content (GUPnPDIDLLiteCreateClass *create_class) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class), NULL); if (G_UNLIKELY (create_class->priv->xml_node->children == NULL)) return NULL; return (const char *) create_class->priv->xml_node->children->content; } /** * gupnp_didl_lite_create_class_set_content: * @create_class: #GUPnPDIDLLiteCreateClass * @content: The content * * Set the content of the @create_class. **/ void gupnp_didl_lite_create_class_set_content (GUPnPDIDLLiteCreateClass *create_class, const char *content) { xmlChar *escaped; g_return_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class)); g_return_if_fail (create_class != NULL); escaped = xmlEncodeSpecialChars (create_class->priv->xml_doc->doc, (const unsigned char *) content); xmlNodeSetContent (create_class->priv->xml_node, escaped); xmlFree (escaped); g_object_notify (G_OBJECT (create_class), "content"); } /** * gupnp_didl_lite_create_class_get_include_derived: * @create_class: #GUPnPDIDLLiteCreateClass * * Checks whether @create_class can be derived. * * Return value: #TRUE if @create_class can be derived. **/ gboolean gupnp_didl_lite_create_class_get_include_derived (GUPnPDIDLLiteCreateClass *create_class) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class), FALSE); return xml_util_get_boolean_attribute (create_class->priv->xml_node, "includeDerived"); } /** * gupnp_didl_lite_create_class_set_include_derived: * @create_class: #GUPnPDIDLLiteCreateClass * @include_derived: the derivability * * (Un)set the derivability of create_class. **/ void gupnp_didl_lite_create_class_set_include_derived (GUPnPDIDLLiteCreateClass *create_class, gboolean include_derived) { const char *str; g_return_if_fail (create_class != NULL); g_return_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class)); if (include_derived) str = "1"; else str = "0"; xmlSetProp (create_class->priv->xml_node, (unsigned char *) "includeDerived", (unsigned char *) str); g_object_notify (G_OBJECT (create_class), "include-derived"); } /** * gupnp_didl_lite_create_class_get_friendly_name: * @create_class: #GUPnPDIDLLiteCreateClass * * Get the friendly name of the @create_class. * * Return value: The FriendlyName of the @create_class, or %NULL. **/ const char * gupnp_didl_lite_create_class_get_friendly_name (GUPnPDIDLLiteCreateClass *create_class) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class), NULL); return xml_util_get_attribute_content (create_class->priv->xml_node, "name"); } /** * gupnp_didl_lite_create_class_set_friendly_name: * @create_class: #GUPnPDIDLLiteCreateClass * @friendly_name: The friendly name * * Set the friendly name of the @create_class. **/ void gupnp_didl_lite_create_class_set_friendly_name (GUPnPDIDLLiteCreateClass *create_class, const char *friendly_name) { g_return_if_fail (create_class != NULL); g_return_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class)); xmlSetProp (create_class->priv->xml_node, (unsigned char *) "name", (const unsigned char *) friendly_name); g_object_notify (G_OBJECT (create_class), "friendly-name"); } /** * gupnp_didl_lite_create_class_new_from_xml: * @xml_node: The pointer to relevant node in XML document * @xml_doc: The reference to containing XML document * * Creates a new #GUPnPDIDLLiteCreateClass for the @xml_node. * * Returns: (transfer full): A new #GUPnPDIDLLiteCreateClass object. Unref after usage. **/ GUPnPDIDLLiteCreateClass * gupnp_didl_lite_create_class_new_from_xml (xmlNode *xml_node, GUPnPAVXMLDoc *xml_doc) { return g_object_new (GUPNP_TYPE_DIDL_LITE_CREATE_CLASS, "xml-node", xml_node, "xml-doc", xml_doc, NULL); } /** * gupnp_didl_lite_create_class_get_xml_node: * @create_class: The #GUPnPDIDLLiteCreateClass * * Get the pointer to relevant node in XML document. * * Returns: (transfer none): The pointer to relevant node in XML document. **/ xmlNode * gupnp_didl_lite_create_class_get_xml_node (GUPnPDIDLLiteCreateClass *create_class) { g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class), NULL); return create_class->priv->xml_node; }