00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00031 #include "stdinc.h"
00032
00033 #include <xspf_c.h>
00034
00035 #include "util.h"
00036 #include "vfs.h"
00037 #include "vfs_modules.h"
00038
00039 int
00040 vfs_xspf_match(struct vfsent *ve, int isdir)
00041 {
00042
00043 if (isdir || !g_str_has_suffix(ve->name, ".xspf"))
00044 return (-1);
00045
00046 ve->recurse = 0;
00047 return (0);
00048 }
00049
00050 int
00051 vfs_xspf_populate(struct vfsent *ve)
00052 {
00053 struct xspf_list *slist;
00054 struct xspf_track *strack;
00055 struct xspf_mvalue *sloc;
00056 char *dirname, *baseuri, *filename;
00057 struct vfsref *vr;
00058
00059 baseuri = url_escape(ve->filename);
00060 slist = xspf_parse(ve->filename, baseuri);
00061 g_free(baseuri);
00062 if (slist == NULL)
00063 return (-1);
00064
00065 dirname = g_path_get_dirname(ve->filename);
00066
00067 XSPF_LIST_FOREACH_TRACK(slist, strack) {
00068 XSPF_TRACK_FOREACH_LOCATION(strack, sloc) {
00069
00070 filename = url_unescape(sloc->value);
00071
00072
00073 vr = vfs_lookup(filename, strack->title, dirname, 1);
00074 if (vr != NULL)
00075 vfs_list_insert_tail(&ve->population, vr);
00076 }
00077 }
00078
00079 g_free(dirname);
00080 xspf_free(slist);
00081 return (0);
00082 }
00083
00084 int
00085 vfs_xspf_write(const struct vfslist *vl, const char *filename)
00086 {
00087 struct xspf_list *list;
00088 struct xspf_track *track;
00089 struct xspf_mvalue *location;
00090 char *fn, *baseuri;
00091 struct vfsref *vr;
00092 int ret;
00093
00094 list = xspf_new();
00095
00096 VFS_LIST_FOREACH_REVERSE(vl, vr) {
00097
00098 track = xspf_new_track_before(&list->tracks);
00099
00100
00101 if (g_utf8_validate(vfs_name(vr), -1, NULL))
00102 xspf_setvalue(&track->title, vfs_name(vr));
00103
00104 location = xspf_new_mvalue_before(&track->locations);
00105 fn = url_escape(vfs_filename(vr));
00106 xspf_setvalue(&location->value, fn);
00107 g_free(fn);
00108 }
00109
00110 baseuri = url_escape(filename);
00111 ret = xspf_write(list, filename, baseuri);
00112 g_free(baseuri);
00113 xspf_free(list);
00114
00115 return (ret);
00116 }