From d631a8d89fd0a4b72a84c415ca2bdb4c2ca99bbc Mon Sep 17 00:00:00 2001 From: Taybin Rutkin Date: Fri, 5 Jan 2007 04:24:23 +0000 Subject: 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 --- libs/ardour/ardour/audio_library.h | 5 ++--- libs/ardour/ardour/audiofilesource.h | 2 ++ libs/ardour/audio_library.cc | 35 +++++++++-------------------------- libs/ardour/audiofilesource.cc | 23 +++++++++++++++++++++++ libs/pbd/pbd/tokenizer.h | 30 ++++++++++++++++++++++++++---- 5 files changed, 62 insertions(+), 33 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/audio_library.h b/libs/ardour/ardour/audio_library.h index 4edf6d94e4..8c01f0e3dc 100644 --- a/libs/ardour/ardour/audio_library.h +++ b/libs/ardour/ardour/audio_library.h @@ -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; diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h index 66cc240770..2133136e68 100644 --- a/libs/ardour/ardour/audiofilesource.h +++ b/libs/ardour/ardour/audiofilesource.h @@ -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(); diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc index 92069d929f..2ed4739a96 100644 --- a/libs/ardour/audio_library.cc +++ b/libs/ardour/audio_library.cc @@ -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 tags) { @@ -142,8 +149,8 @@ AudioLibrary::search_members_and (vector& members, const vector 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& members, const vector // 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); -} diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index 53809c3c2f..1915957f3d 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -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); +} diff --git a/libs/pbd/pbd/tokenizer.h b/libs/pbd/pbd/tokenizer.h index a976b79341..b80e3eac4a 100644 --- a/libs/pbd/pbd/tokenizer.h +++ b/libs/pbd/pbd/tokenizer.h @@ -4,18 +4,24 @@ #include #include +#include + 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 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; } -- cgit v1.2.3