First pass of sfdb tag searching. Not functional, but very very close.

git-svn-id: svn://localhost/ardour2/trunk@1272 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Taybin Rutkin 2007-01-05 04:24:23 +00:00
parent 143e8eba1d
commit d631a8d89f
8 changed files with 192 additions and 85 deletions

View file

@ -46,9 +46,8 @@ class AudioLibrary
private:
string src;
string path2uri (string);
bool safe_file_extension (string);
string path2uri (string path);
string uri2path (string uri);
};
extern AudioLibrary* Library;

View file

@ -59,6 +59,8 @@ class AudioFileSource : public AudioSource {
static bool get_soundfile_info (string path, SoundFileInfo& _info, string& error);
static bool safe_file_extension (string path);
void set_allow_remove_if_empty (bool yn);
void mark_for_remove();

View file

@ -77,6 +77,13 @@ AudioLibrary::path2uri (string path)
return uri.str();
}
string
AudioLibrary::uri2path (string uri)
{
string path = xmlURIUnescapeString(uri.c_str(), 0, 0);
return path.substr(5);
}
void
AudioLibrary::set_tags (string member, vector<string> tags)
{
@ -142,8 +149,8 @@ AudioLibrary::search_members_and (vector<string>& members, const vector<string>
if (*head != 0) {
lrdf_uris* ulist = lrdf_match_multi(*head);
for (uint32_t j = 0; ulist && j < ulist->count; ++j) {
// printf("AND: %s\n", ulist->items[j]);
members.push_back(ulist->items[j]);
// cerr << "AND: " << uri2path(ulist->items[j]) << endl;
members.push_back(uri2path(ulist->items[j]));
}
lrdf_free_uris(ulist);
@ -154,33 +161,9 @@ AudioLibrary::search_members_and (vector<string>& members, const vector<string>
// memory clean up
pattern = *head;
while(pattern){
free(pattern->predicate);
free(pattern->object);
old = pattern;
pattern = pattern->next;
delete old;
}
}
bool
AudioLibrary::safe_file_extension(string file)
{
return !(file.rfind(".wav") == string::npos &&
file.rfind(".aiff")== string::npos &&
file.rfind(".aif") == string::npos &&
file.rfind(".snd") == string::npos &&
file.rfind(".au") == string::npos &&
file.rfind(".raw") == string::npos &&
file.rfind(".sf") == string::npos &&
file.rfind(".cdr") == string::npos &&
file.rfind(".smp") == string::npos &&
file.rfind(".maud")== string::npos &&
file.rfind(".vwe") == string::npos &&
file.rfind(".paf") == string::npos &&
#ifdef HAVE_COREAUDIO
file.rfind(".mp3") == string::npos &&
file.rfind(".aac") == string::npos &&
file.rfind(".mp4") == string::npos &&
#endif // HAVE_COREAUDIO
file.rfind(".voc") == string::npos);
}

View file

@ -543,3 +543,26 @@ AudioFileSource::setup_peakfile ()
return 0;
}
}
bool
AudioFileSource::safe_file_extension(string file)
{
return !(file.rfind(".wav") == string::npos &&
file.rfind(".aiff")== string::npos &&
file.rfind(".aif") == string::npos &&
file.rfind(".snd") == string::npos &&
file.rfind(".au") == string::npos &&
file.rfind(".raw") == string::npos &&
file.rfind(".sf") == string::npos &&
file.rfind(".cdr") == string::npos &&
file.rfind(".smp") == string::npos &&
file.rfind(".maud")== string::npos &&
file.rfind(".vwe") == string::npos &&
file.rfind(".paf") == string::npos &&
#ifdef HAVE_COREAUDIO
file.rfind(".mp3") == string::npos &&
file.rfind(".aac") == string::npos &&
file.rfind(".mp4") == string::npos &&
#endif // HAVE_COREAUDIO
file.rfind(".voc") == string::npos);
}

View file

@ -4,18 +4,24 @@
#include <iterator>
#include <string>
#include <pbd/whitespace.h>
namespace PBD {
/**
Tokenize string, this should work for standard
strings aswell as Glib::ustring. This is a bit of a hack,
strings as well as Glib::ustring. This is a bit of a hack,
there are much better string tokenizing patterns out there.
If strip_whitespace is set to true, tokens will be checked to see
that they still have a length after stripping. If no length, they
are discarded.
*/
template<typename StringType, typename Iter>
unsigned int
tokenize(const StringType& str,
const StringType& delims,
Iter it)
Iter it,
bool strip_whitespace=false)
{
typename StringType::size_type start_pos = 0;
typename StringType::size_type end_pos = 0;
@ -28,14 +34,30 @@ tokenize(const StringType& str,
if (end_pos == str.npos) {
end_pos = str.length();
}
*it++ = str.substr(start_pos, end_pos - start_pos);
if (strip_whitespace) {
StringType stripped = str.substr(start_pos, end_pos - start_pos);
strip_whitespace_edges (stripped);
if (stripped.length()) {
*it++ = stripped;
}
} else {
*it++ = str.substr(start_pos, end_pos - start_pos);
}
++token_count;
start_pos = str.find_first_not_of(delims, end_pos + 1);
}
} while (start_pos != str.npos);
if (start_pos != str.npos) {
*it++ = str.substr(start_pos, str.length() - start_pos);
if (strip_whitespace) {
StringType stripped = str.substr(start_pos, str.length() - start_pos);
strip_whitespace_edges (stripped);
if (stripped.length()) {
*it++ = stripped;
}
} else {
*it++ = str.substr(start_pos, str.length() - start_pos);
}
++token_count;
}