2 Copyright (C) 2003-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <libxml/uri.h>
25 #include <glibmm/miscutils.h>
27 #include <pbd/compose.h>
29 #include <ardour/audio_library.h>
30 #include <ardour/utils.h>
35 using namespace ARDOUR
;
37 static const char* TAG
= "http://ardour.org/ontology/Tag";
39 AudioLibrary::AudioLibrary ()
41 /* XXX URL - '/' is always the separator */
43 src
= "file:" + get_user_ardour_path() + "/sfdb";
45 // workaround for possible bug in raptor that crashes when saving to a
48 touch_file(Glib::build_filename (get_user_ardour_path(), "sfdb"));
50 lrdf_read_file(src
.c_str());
53 AudioLibrary::~AudioLibrary ()
58 AudioLibrary::save_changes ()
60 if (lrdf_export_by_source(src
.c_str(), src
.substr(5).c_str())) {
61 PBD::warning
<< string_compose(_("Could not open %1. Audio Library not saved"), src
) << endmsg
;
66 AudioLibrary::path2uri (string path
)
69 memset(&temp
, 0, sizeof(temp
));
71 xmlChar
*cal
= xmlCanonicPath((xmlChar
*) path
.c_str());
72 temp
.path
= (char *) cal
;
73 xmlChar
*ret
= xmlSaveUri(&temp
);
77 uri
<< "file:" << (const char*) ret
;
85 AudioLibrary::uri2path (string uri
)
87 string path
= xmlURIUnescapeString(uri
.c_str(), 0, 0);
88 return path
.substr(5);
92 AudioLibrary::set_tags (string member
, vector
<string
> tags
)
94 sort (tags
.begin(), tags
.end());
95 tags
.erase (unique(tags
.begin(), tags
.end()), tags
.end());
97 string
file_uri(path2uri(member
));
99 lrdf_remove_uri_matches (file_uri
.c_str());
101 for (vector
<string
>::iterator i
= tags
.begin(); i
!= tags
.end(); ++i
) {
102 lrdf_add_triple (src
.c_str(), file_uri
.c_str(), TAG
, (*i
).c_str(), lrdf_literal
);
107 AudioLibrary::get_tags (string member
)
111 lrdf_statement pattern
;
112 pattern
.subject
= strdup(path2uri(member
).c_str());
113 pattern
.predicate
= (char*)TAG
;
115 pattern
.object_type
= lrdf_literal
;
117 lrdf_statement
* matches
= lrdf_matches (&pattern
);
118 free (pattern
.subject
);
120 lrdf_statement
* current
= matches
;
121 while (current
!= 0) {
122 tags
.push_back (current
->object
);
124 current
= current
->next
;
127 lrdf_free_statements (matches
);
129 sort (tags
.begin(), tags
.end());
135 AudioLibrary::search_members_and (vector
<string
>& members
, const vector
<string
> tags
)
137 lrdf_statement
**head
;
138 lrdf_statement
* pattern
= 0;
139 lrdf_statement
* old
= 0;
142 vector
<string
>::const_iterator i
;
143 for (i
= tags
.begin(); i
!= tags
.end(); ++i
){
144 pattern
= new lrdf_statement
;
145 pattern
->subject
= (char*)"?";
146 pattern
->predicate
= (char*)TAG
;
147 pattern
->object
= strdup((*i
).c_str());
154 lrdf_uris
* ulist
= lrdf_match_multi(*head
);
155 for (uint32_t j
= 0; ulist
&& j
< ulist
->count
; ++j
) {
156 // cerr << "AND: " << uri2path(ulist->items[j]) << endl;
157 members
.push_back(uri2path(ulist
->items
[j
]));
159 lrdf_free_uris(ulist
);
161 sort(members
.begin(), members
.end());
162 unique(members
.begin(), members
.end());
168 free(pattern
->object
);
170 pattern
= pattern
->next
;