summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2012-10-30 20:26:22 +0100
committerJens Georg <mail@jensge.org>2012-11-19 13:17:19 +0100
commita6fb9414fb3d23147823b8e225b2292003fd63a3 (patch)
tree2bda74617a5a5b47f61b52d28fc5f436ba90a594
parent71e46f7db6e1906a4fbfcaaf30f69d40d6abaf45 (diff)
downloadgupnp-av-a6fb9414fb3d23147823b8e225b2292003fd63a3.tar.gz
Add dlna:lifetime property to items
-rw-r--r--doc/gupnp-av-sections.txt2
-rw-r--r--libgupnp-av/Makefile.am2
-rw-r--r--libgupnp-av/gupnp-didl-lite-item.c90
-rw-r--r--libgupnp-av/gupnp-didl-lite-item.h9
-rw-r--r--libgupnp-av/gupnp-didl-lite-resource.c34
-rw-r--r--libgupnp-av/time-utils.c68
-rw-r--r--libgupnp-av/time-utils.h35
7 files changed, 207 insertions, 33 deletions
diff --git a/doc/gupnp-av-sections.txt b/doc/gupnp-av-sections.txt
index 899c739..3164f3f 100644
--- a/doc/gupnp-av-sections.txt
+++ b/doc/gupnp-av-sections.txt
@@ -123,6 +123,8 @@ gupnp_didl_lite_container_get_type
GUPnPDIDLLiteItem
gupnp_didl_lite_item_get_ref_id
gupnp_didl_lite_item_set_ref_id
+gupnp_didl_lite_item_get_lifetime
+gupnp_didl_lite_item_set_lifetime
<SUBSECTION Standard>
GUPnPDIDLLiteItemClass
GUPNP_TYPE_DIDL_LITE_ITEM
diff --git a/libgupnp-av/Makefile.am b/libgupnp-av/Makefile.am
index 3699367..5d0b6f9 100644
--- a/libgupnp-av/Makefile.am
+++ b/libgupnp-av/Makefile.am
@@ -75,6 +75,8 @@ libgupnp_av_1_0_la_SOURCES = gupnp-didl-lite-object.c \
gvalue-util.h \
fragment-util.c \
fragment-util.h \
+ time-utils.c \
+ time-utils.h \
xsd-data.c \
xsd-data.h \
$(BUILT_SOURCES)
diff --git a/libgupnp-av/gupnp-didl-lite-item.c b/libgupnp-av/gupnp-didl-lite-item.c
index 9e5d34c..ab38cb6 100644
--- a/libgupnp-av/gupnp-didl-lite-item.c
+++ b/libgupnp-av/gupnp-didl-lite-item.c
@@ -31,6 +31,7 @@
#include "gupnp-didl-lite-item.h"
#include "xml-util.h"
+#include "time-utils.h"
G_DEFINE_TYPE (GUPnPDIDLLiteItem,
gupnp_didl_lite_item,
@@ -38,7 +39,8 @@ G_DEFINE_TYPE (GUPnPDIDLLiteItem,
enum {
PROP_0,
- PROP_REF_ID
+ PROP_REF_ID,
+ PROP_LIFETIME
};
static void
@@ -63,6 +65,11 @@ gupnp_didl_lite_item_get_property (GObject *object,
(value,
gupnp_didl_lite_item_get_ref_id (item));
break;
+ case PROP_LIFETIME:
+ g_value_set_long
+ (value,
+ gupnp_didl_lite_item_get_lifetime (item));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -85,6 +92,10 @@ gupnp_didl_lite_item_set_property (GObject *object,
gupnp_didl_lite_item_set_ref_id (item,
g_value_get_string (value));
break;
+ case PROP_LIFETIME:
+ gupnp_didl_lite_item_set_lifetime (item,
+ g_value_get_long (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -117,6 +128,24 @@ gupnp_didl_lite_item_class_init (GUPnPDIDLLiteItemClass *klass)
G_PARAM_STATIC_NAME |
G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB));
+
+ /**
+ * GUPnPDIDLLiteItem:lifetime:
+ *
+ * The lifetime in seconds of this DIDLLite item in a media collection.
+ **/
+ g_object_class_install_property
+ (object_class,
+ PROP_LIFETIME,
+ g_param_spec_long ("lifetime",
+ "Lifetime",
+ "The lifetime (in seconds) of this"
+ " item.",
+ -1,
+ G_MAXLONG,
+ -1,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
}
/**
@@ -166,3 +195,62 @@ gupnp_didl_lite_item_set_ref_id (GUPnPDIDLLiteItem *item,
g_object_notify (G_OBJECT (item), "ref-id");
}
+
+/**
+ * gupnp_didl_lite_item_set_lifetime:
+ * @item: #GUPnPDIDLLiteItem
+ * @lifetime: The lifetime (in seconds) of this item in a media collection.
+ **/
+void
+gupnp_didl_lite_item_set_lifetime (GUPnPDIDLLiteItem *item,
+ glong lifetime)
+{
+ xmlNode *node = NULL;
+ xmlNs *ns = NULL;
+ GUPnPXMLDoc *doc = NULL;
+ GUPnPDIDLLiteObject *object = NULL;
+
+ g_return_if_fail (GUPNP_IS_DIDL_LITE_ITEM (item));
+
+ object = GUPNP_DIDL_LITE_OBJECT (item);
+ node = gupnp_didl_lite_object_get_xml_node (object);
+ ns = gupnp_didl_lite_object_get_dlna_namespace (object);
+ g_object_get (G_OBJECT (object), "xml-doc", &doc, NULL);
+
+ if (lifetime < 0)
+ xml_util_unset_child (node, "lifetime");
+ else {
+ char *str;
+
+ str = seconds_to_time (lifetime);
+ xml_util_set_child (node, ns, doc->doc, "lifetime", str);
+ g_free (str);
+ }
+
+ g_object_notify (G_OBJECT (object), "lifetime");
+}
+
+/**
+ * gupnp_didl_lite_item_get_lifetime:
+ * @item: #GUPnPDIDLLiteItem
+ *
+ * Returns: -1 if unset or the lifetime (in seconds) of the current item.
+ **/
+glong
+gupnp_didl_lite_item_get_lifetime (GUPnPDIDLLiteItem *item)
+{
+ xmlNode *node = NULL;
+ const char *lifetime_str;
+ long lifetime;
+ GUPnPDIDLLiteObject *object = NULL;
+
+ g_return_val_if_fail (GUPNP_IS_DIDL_LITE_ITEM (item), -1);
+
+ object = GUPNP_DIDL_LITE_OBJECT (item);
+ node = gupnp_didl_lite_object_get_xml_node (object);
+
+ lifetime_str = xml_util_get_child_element_content (node, "lifetime");
+ lifetime = seconds_from_time (lifetime_str);
+
+ return lifetime;
+}
diff --git a/libgupnp-av/gupnp-didl-lite-item.h b/libgupnp-av/gupnp-didl-lite-item.h
index 1719729..e55c271 100644
--- a/libgupnp-av/gupnp-didl-lite-item.h
+++ b/libgupnp-av/gupnp-didl-lite-item.h
@@ -1,8 +1,10 @@
/*
* Copyright (C) 2009 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
*
* Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
* <zeeshanak@gnome.org>
+ * Jens Georg <jensg@openismus.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -73,6 +75,13 @@ void
gupnp_didl_lite_item_set_ref_id (GUPnPDIDLLiteItem *item,
const char *ref_id);
+void
+gupnp_didl_lite_item_set_lifetime (GUPnPDIDLLiteItem *item,
+ glong lifetime);
+
+glong
+gupnp_didl_lite_item_get_lifetime (GUPnPDIDLLiteItem *item);
+
G_END_DECLS
#endif /* __GUPNP_DIDL_LITE_ITEM_H__ */
diff --git a/libgupnp-av/gupnp-didl-lite-resource.c b/libgupnp-av/gupnp-didl-lite-resource.c
index 8210b7c..041976a 100644
--- a/libgupnp-av/gupnp-didl-lite-resource.c
+++ b/libgupnp-av/gupnp-didl-lite-resource.c
@@ -35,9 +35,7 @@
#include "gupnp-didl-lite-resource.h"
#include "xml-util.h"
-
-#define SEC_PER_MIN 60
-#define SEC_PER_HOUR 3600
+#include "time-utils.h"
G_DEFINE_TYPE (GUPnPDIDLLiteResource,
gupnp_didl_lite_resource,
@@ -106,31 +104,6 @@ return_point:
g_strfreev (tokens);
}
-static long
-seconds_from_time (const char *time_str)
-{
- char **tokens;
- gdouble seconds = -1;
-
- if (time_str == NULL)
- return -1;
-
- tokens = g_strsplit (time_str, ":", -1);
- if (tokens[0] == NULL ||
- tokens[1] == NULL ||
- tokens[2] == NULL)
- goto return_point;
-
- seconds = g_strtod (tokens[2], NULL);
- seconds += g_strtod (tokens[1], NULL) * SEC_PER_MIN;
- seconds += g_strtod (tokens[0], NULL) * SEC_PER_HOUR;
-
-return_point:
- g_strfreev (tokens);
-
- return (long) seconds;
-}
-
static void
on_protocol_info_changed (GUPnPProtocolInfo *info,
GParamSpec *pspec,
@@ -1220,10 +1193,7 @@ gupnp_didl_lite_resource_set_duration (GUPnPDIDLLiteResource *resource,
else {
char *str;
- str = g_strdup_printf ("%ld:%.2ld:%.2ld.000",
- duration / (60 * 60),
- (duration / 60) % 60,
- duration % 60);
+ str = seconds_to_time (duration);
xmlSetProp (resource->priv->xml_node,
(unsigned char *) "duration",
(unsigned char *) str);
diff --git a/libgupnp-av/time-utils.c b/libgupnp-av/time-utils.c
new file mode 100644
index 0000000..0964f9e
--- /dev/null
+++ b/libgupnp-av/time-utils.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Jens Georg <jensg@openismus.com>
+ *
+ * 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.
+ */
+
+#include <glib.h>
+
+#include "time-utils.h"
+
+#define SEC_PER_MIN 60
+#define SEC_PER_HOUR 3600
+
+long
+seconds_from_time (const char *time_str)
+{
+ char **tokens;
+ gdouble seconds = -1;
+
+ if (time_str == NULL)
+ return -1;
+
+ tokens = g_strsplit (time_str, ":", -1);
+ if (tokens[0] == NULL ||
+ tokens[1] == NULL ||
+ tokens[2] == NULL)
+ goto return_point;
+
+ seconds = g_strtod (tokens[2], NULL);
+ seconds += g_strtod (tokens[1], NULL) * SEC_PER_MIN;
+ seconds += g_strtod (tokens[0], NULL) * SEC_PER_HOUR;
+
+return_point:
+ g_strfreev (tokens);
+
+ return (long) seconds;
+}
+
+char *
+seconds_to_time (long seconds)
+{
+ char *str;
+
+ if (seconds < 0)
+ return NULL;
+
+ str = g_strdup_printf ("%ld:%.2ld:%.2ld.000",
+ seconds / (60 * 60),
+ (seconds / 60) % 60,
+ seconds % 60);
+
+ return str;
+}
diff --git a/libgupnp-av/time-utils.h b/libgupnp-av/time-utils.h
new file mode 100644
index 0000000..d15c598
--- /dev/null
+++ b/libgupnp-av/time-utils.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Jens Georg <jensg@openismus.com>
+ *
+ * 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.
+ */
+
+#ifndef __TIME_UTILS_H__
+#define __TIME_UTILS_H__
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL long
+seconds_from_time (const char *time_string);
+
+G_GNUC_INTERNAL char *
+seconds_to_time (long seconds);
+
+G_END_DECLS
+
+#endif /* __TIME_UTILS_H__ */