[grilo] Add a serializing function for medias
- From: Juan A. Suarez Romero <jasuarez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo] Add a serializing function for medias
- Date: Wed, 2 Jun 2010 12:14:53 +0000 (UTC)
commit 896c38c83ba27fba79ad73a52fb21f705e5ad481
Author: Juan A. Suarez Romero <jasuarez igalia com>
Date: Tue May 25 13:20:21 2010 +0200
Add a serializing function for medias
It returns a string that represent a media.
Lot of times, having a "serialized" version of a media is very useful. For
instance, one can save this serial in a list, or send it to a non-grilo
compliant application.
Then, the media can be recovered from the serial.
Serial follows the same scheme as an URI:
<type>://<escaped_source_name>/<escaped_id>
As it can be seen, both "id" and "source" are required in media in order to
build the serial.
<type> denotes the type of media we are dealing with. Thus, we will have:
GrlMedia => "grl"
GrlMediaAudio => "grlaudio"
GrlMediaVideo => "grlvideo"
GrlMediaBox => "grlbox"
GrlMediaImage => "grlimage"
It is worth to tell that the implementation takes in account future new medias.
Thus, if in future a GrlMediaFoo type is added, then <type> will be "grlfoo"
for this new media, without needing changes in code.
src/data/grl-media.c | 35 +++++++++++++++++++++++++++++++++++
src/data/grl-media.h | 3 +++
2 files changed, 38 insertions(+), 0 deletions(-)
---
diff --git a/src/data/grl-media.c b/src/data/grl-media.c
index 50310d1..4a85103 100644
--- a/src/data/grl-media.c
+++ b/src/data/grl-media.c
@@ -103,3 +103,38 @@ grl_media_set_rating (GrlMedia *media, gfloat rating, gfloat max)
GRL_METADATA_KEY_RATING,
normalized_value);
}
+
+gchar *
+grl_media_serialize (GrlMedia *media)
+{
+ GRegex *type_regex;
+ const gchar *id;
+ const gchar *source;
+ const gchar *type_name;
+ gchar *escaped_id;
+ gchar *escaped_source;
+ gchar *protocol;
+ gchar *serial;
+
+ g_return_val_if_fail (GRL_IS_MEDIA (media), NULL);
+ g_return_val_if_fail ((id = grl_media_get_id (media)), NULL);
+ g_return_val_if_fail ((source = grl_media_get_source (media)), NULL);
+
+ type_name = g_type_name (G_TYPE_FROM_INSTANCE (media));
+
+ /* Convert typename to scheme protocol */
+ type_regex = g_regex_new ("GrlMedia(.*)", 0, 0, NULL);
+ protocol = g_regex_replace (type_regex, type_name, -1, 0, "grl\\L\\1\\E", 0, NULL);
+ g_regex_unref (type_regex);
+
+ /* Build serial string with escaped components */
+ escaped_id = g_uri_escape_string (id, NULL, TRUE);
+ escaped_source = g_uri_escape_string (source, NULL, TRUE);
+
+ serial = g_strconcat (protocol, "://", escaped_source, "/", escaped_id, NULL);
+
+ g_free (escaped_id);
+ g_free (escaped_source);
+
+ return serial;
+}
diff --git a/src/data/grl-media.h b/src/data/grl-media.h
index 627ec35..adcaccd 100644
--- a/src/data/grl-media.h
+++ b/src/data/grl-media.h
@@ -384,8 +384,11 @@ void grl_media_set_rating (GrlMedia *media, gfloat rating, gfloat max);
grl_data_get_string(GRL_DATA((data)), GRL_METADATA_KEY_LAST_PLAYED)
GType grl_media_get_type (void) G_GNUC_CONST;
+
GrlMedia *grl_media_new (void);
+gchar *grl_media_serialize (GrlMedia *media);
+
G_END_DECLS
#endif /* _GRL_MEDIA_H_ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]