Merge branch 'pathscanner-refactor' of https://github.com/mojofunk/ardour into cairocanvas
This commit is contained in:
@@ -1416,7 +1416,7 @@ ARDOUR_UI::redisplay_recent_sessions ()
|
||||
|
||||
get_state_files_in_directory (*i, state_file_paths);
|
||||
|
||||
vector<string*>* states;
|
||||
vector<string> states;
|
||||
vector<const gchar*> item;
|
||||
string fullpath = *i;
|
||||
|
||||
@@ -1433,13 +1433,12 @@ ARDOUR_UI::redisplay_recent_sessions ()
|
||||
}
|
||||
|
||||
/* now get available states for this session */
|
||||
states = Session::possible_states (fullpath);
|
||||
|
||||
if ((states = Session::possible_states (fullpath)) == 0) {
|
||||
if (states.empty()) {
|
||||
/* no state file? */
|
||||
continue;
|
||||
}
|
||||
vector_delete(states);
|
||||
delete(states);
|
||||
|
||||
std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
|
||||
|
||||
|
||||
@@ -621,7 +621,7 @@ SessionDialog::redisplay_recent_sessions ()
|
||||
|
||||
get_state_files_in_directory (*i, state_file_paths);
|
||||
|
||||
vector<string*>* states;
|
||||
vector<string> states;
|
||||
vector<const gchar*> item;
|
||||
string dirname = *i;
|
||||
|
||||
@@ -639,12 +639,12 @@ SessionDialog::redisplay_recent_sessions ()
|
||||
|
||||
/* now get available states for this session */
|
||||
|
||||
if ((states = Session::possible_states (dirname)) == 0) {
|
||||
states = Session::possible_states (dirname);
|
||||
|
||||
if (states.empty()) {
|
||||
/* no state file? */
|
||||
continue;
|
||||
}
|
||||
vector_delete (states);
|
||||
delete (states);
|
||||
|
||||
std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
|
||||
|
||||
|
||||
@@ -402,8 +402,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
|
||||
PBD::Signal0<void> StateReady;
|
||||
PBD::Signal0<void> SaveSession;
|
||||
|
||||
std::vector<std::string*>* possible_states() const;
|
||||
static std::vector<std::string*>* possible_states (std::string path);
|
||||
std::vector<std::string> possible_states() const;
|
||||
static std::vector<std::string> possible_states (std::string path);
|
||||
|
||||
XMLNode& get_state();
|
||||
int set_state(const XMLNode& node, int version); // not idempotent
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "pbd/xml++.h"
|
||||
#include "pbd/convert.h"
|
||||
#include "pbd/whitespace.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/locale_guard.h"
|
||||
|
||||
#include <glibmm/threads.h>
|
||||
@@ -2049,20 +2049,19 @@ AUPlugin::current_preset() const
|
||||
void
|
||||
AUPlugin::find_presets ()
|
||||
{
|
||||
vector<string*>* preset_files;
|
||||
PathScanner scanner;
|
||||
vector<string> preset_files;
|
||||
|
||||
user_preset_map.clear ();
|
||||
|
||||
preset_files = scanner (preset_search_path, au_preset_filter, this, true, true, -1, true);
|
||||
find_files_matching_filter (preset_files, preset_search_path, au_preset_filter, this, true, true, -1, true);
|
||||
|
||||
if (!preset_files) {
|
||||
if (preset_files.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (vector<string*>::iterator x = preset_files->begin(); x != preset_files->end(); ++x) {
|
||||
for (vector<string>::iterator x = preset_files.begin(); x != preset_files.end(); ++x) {
|
||||
|
||||
string path = *(*x);
|
||||
string path = *x;
|
||||
string preset_name;
|
||||
|
||||
/* make an initial guess at the preset name using the path */
|
||||
@@ -2079,12 +2078,8 @@ AUPlugin::find_presets ()
|
||||
user_preset_map[preset_name] = path;
|
||||
}
|
||||
|
||||
delete *x;
|
||||
}
|
||||
|
||||
vector_delete (preset_files);
|
||||
delete preset_files;
|
||||
|
||||
/* now fill the vector<string> with the names we have */
|
||||
|
||||
for (UserPresetMap::iterator i = user_preset_map.begin(); i != user_preset_map.end(); ++i) {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#include <boost/utility.hpp>
|
||||
|
||||
#include "pbd/clear_dir.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
#include "pbd/compose.h"
|
||||
#include "pbd/error.h"
|
||||
@@ -2014,22 +2014,19 @@ LV2World::load_bundled_plugins()
|
||||
{
|
||||
if (!_bundle_checked) {
|
||||
cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
|
||||
PathScanner scanner;
|
||||
vector<string *> *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
|
||||
if (plugin_objects) {
|
||||
for ( vector<string *>::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
|
||||
|
||||
vector<string> plugin_objects;
|
||||
find_files_matching_filter (plugin_objects, ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
|
||||
for ( vector<string>::iterator x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
string uri = "file:///" + **x + "/";
|
||||
string uri = "file:///" + *x + "/";
|
||||
#else
|
||||
string uri = "file://" + **x + "/";
|
||||
string uri = "file://" + *x + "/";
|
||||
#endif
|
||||
LilvNode *node = lilv_new_uri(world, uri.c_str());
|
||||
lilv_world_load_bundle(world, node);
|
||||
lilv_node_free(node);
|
||||
}
|
||||
LilvNode *node = lilv_new_uri(world, uri.c_str());
|
||||
lilv_world_load_bundle(world, node);
|
||||
lilv_node_free(node);
|
||||
}
|
||||
vector_delete (plugin_objects);
|
||||
delete (plugin_objects);
|
||||
|
||||
_bundle_checked = true;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/compose.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
|
||||
#include "ardour/debug.h"
|
||||
@@ -90,20 +90,16 @@ static bool panner_filter (const string& str, void */*arg*/)
|
||||
void
|
||||
PannerManager::discover_panners ()
|
||||
{
|
||||
PathScanner scanner;
|
||||
std::vector<std::string *> *panner_modules;
|
||||
std::vector<std::string> panner_modules;
|
||||
std::string search_path = panner_search_path().to_string();
|
||||
|
||||
DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), search_path));
|
||||
|
||||
panner_modules = scanner (search_path, panner_filter, 0, false, true, 1, true);
|
||||
find_files_matching_filter (panner_modules, search_path, panner_filter, 0, false, true, 1, true);
|
||||
|
||||
for (vector<std::string *>::iterator i = panner_modules->begin(); i != panner_modules->end(); ++i) {
|
||||
panner_discover (**i);
|
||||
for (vector<std::string>::iterator i = panner_modules.begin(); i != panner_modules.end(); ++i) {
|
||||
panner_discover (*i);
|
||||
}
|
||||
|
||||
vector_delete (panner_modules);
|
||||
delete (panner_modules);
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
#include <glibmm/miscutils.h>
|
||||
#include <glibmm/pattern.h>
|
||||
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/whitespace.h"
|
||||
#include "pbd/file_utils.h"
|
||||
|
||||
@@ -242,48 +241,32 @@ PluginManager::clear_vst_cache ()
|
||||
// see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
|
||||
#ifdef WINDOWS_VST_SUPPORT
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string *> *fsi_files;
|
||||
|
||||
fsi_files = scanner (Config->get_plugin_path_vst(), "\\.fsi$", true, true, -1, false);
|
||||
if (fsi_files) {
|
||||
for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
|
||||
::g_unlink((*i)->c_str());
|
||||
}
|
||||
vector<string> fsi_files;
|
||||
find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsi$", true, true, -1, false);
|
||||
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
|
||||
::g_unlink(i->c_str());
|
||||
}
|
||||
vector_delete(fsi_files);
|
||||
delete(fsi_files);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LXVST_SUPPORT
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string *> *fsi_files;
|
||||
fsi_files = scanner (Config->get_plugin_path_lxvst(), "\\.fsi$", true, true, -1, false);
|
||||
if (fsi_files) {
|
||||
for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
|
||||
::g_unlink((*i)->c_str());
|
||||
}
|
||||
vector<string> fsi_files;
|
||||
find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsi$", true, true, -1, false);
|
||||
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
|
||||
::g_unlink(i->c_str());
|
||||
}
|
||||
vector_delete(fsi_files);
|
||||
delete(fsi_files);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
|
||||
{
|
||||
string personal = get_personal_vst_info_cache_dir();
|
||||
PathScanner scanner;
|
||||
vector<string *> *fsi_files;
|
||||
fsi_files = scanner (personal, "\\.fsi$", true, true, -1, false);
|
||||
if (fsi_files) {
|
||||
for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
|
||||
::g_unlink((*i)->c_str());
|
||||
}
|
||||
vector<string> fsi_files;
|
||||
find_files_matching_regex (fsi_files, personal, "\\.fsi$", true, true, -1, false);
|
||||
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
|
||||
::g_unlink(i->c_str());
|
||||
}
|
||||
vector_delete(fsi_files);
|
||||
delete(fsi_files);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -293,32 +276,21 @@ PluginManager::clear_vst_blacklist ()
|
||||
{
|
||||
#ifdef WINDOWS_VST_SUPPORT
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string *> *fsi_files;
|
||||
|
||||
fsi_files = scanner (Config->get_plugin_path_vst(), "\\.fsb$", true, true, -1, false);
|
||||
if (fsi_files) {
|
||||
for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
|
||||
::g_unlink((*i)->c_str());
|
||||
}
|
||||
vector<string> fsi_files;
|
||||
find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsb$", true, true, -1, false);
|
||||
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
|
||||
::g_unlink(i->c_str());
|
||||
}
|
||||
vector_delete(fsi_files);
|
||||
delete(fsi_files);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LXVST_SUPPORT
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string *> *fsi_files;
|
||||
fsi_files = scanner (Config->get_plugin_path_lxvst(), "\\.fsb$", true, true, -1, false);
|
||||
if (fsi_files) {
|
||||
for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
|
||||
::g_unlink((*i)->c_str());
|
||||
}
|
||||
vector<string> fsi_files;
|
||||
find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsb$", true, true, -1, false);
|
||||
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
|
||||
::g_unlink(i->c_str());
|
||||
}
|
||||
vector_delete(fsi_files);
|
||||
delete(fsi_files);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -326,16 +298,11 @@ PluginManager::clear_vst_blacklist ()
|
||||
{
|
||||
string personal = get_personal_vst_blacklist_dir();
|
||||
|
||||
PathScanner scanner;
|
||||
vector<string *> *fsi_files;
|
||||
fsi_files = scanner (personal, "\\.fsb$", true, true, -1, false);
|
||||
if (fsi_files) {
|
||||
for (vector<string *>::iterator i = fsi_files->begin(); i != fsi_files->end (); ++i) {
|
||||
::g_unlink((*i)->c_str());
|
||||
}
|
||||
vector<string> fsi_files;
|
||||
find_files_matching_regex (fsi_files, personal, "\\.fsb$", true, true, -1, false);
|
||||
for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
|
||||
::g_unlink(i->c_str());
|
||||
}
|
||||
vector_delete(fsi_files);
|
||||
delete(fsi_files);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -409,9 +376,8 @@ void
|
||||
PluginManager::add_presets(string domain)
|
||||
{
|
||||
#ifdef HAVE_LRDF
|
||||
PathScanner scanner;
|
||||
vector<string *> *presets;
|
||||
vector<string *>::iterator x;
|
||||
vector<string> presets;
|
||||
vector<string>::iterator x;
|
||||
|
||||
char* envvar;
|
||||
if ((envvar = getenv ("HOME")) == 0) {
|
||||
@@ -419,19 +385,15 @@ PluginManager::add_presets(string domain)
|
||||
}
|
||||
|
||||
string path = string_compose("%1/.%2/rdf", envvar, domain);
|
||||
presets = scanner (path, rdf_filter, 0, false, true);
|
||||
find_files_matching_filter (presets, path, rdf_filter, 0, false, true);
|
||||
|
||||
if (presets) {
|
||||
for (x = presets->begin(); x != presets->end (); ++x) {
|
||||
string file = "file:" + **x;
|
||||
if (lrdf_read_file(file.c_str())) {
|
||||
warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
|
||||
}
|
||||
for (x = presets.begin(); x != presets.end (); ++x) {
|
||||
string file = "file:" + *x;
|
||||
if (lrdf_read_file(file.c_str())) {
|
||||
warning << string_compose(_("Could not parse rdf file: %1"), *x) << endmsg;
|
||||
}
|
||||
|
||||
vector_delete (presets);
|
||||
delete (presets);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -439,23 +401,17 @@ void
|
||||
PluginManager::add_lrdf_data (const string &path)
|
||||
{
|
||||
#ifdef HAVE_LRDF
|
||||
PathScanner scanner;
|
||||
vector<string *>* rdf_files;
|
||||
vector<string *>::iterator x;
|
||||
vector<string> rdf_files;
|
||||
vector<string>::iterator x;
|
||||
|
||||
rdf_files = scanner (path, rdf_filter, 0, false, true);
|
||||
find_files_matching_filter (rdf_files, path, rdf_filter, 0, false, true);
|
||||
|
||||
if (rdf_files) {
|
||||
for (x = rdf_files->begin(); x != rdf_files->end (); ++x) {
|
||||
const string uri(string("file://") + **x);
|
||||
for (x = rdf_files.begin(); x != rdf_files.end (); ++x) {
|
||||
const string uri(string("file://") + *x);
|
||||
|
||||
if (lrdf_read_file(uri.c_str())) {
|
||||
warning << "Could not parse rdf file: " << uri << endmsg;
|
||||
}
|
||||
if (lrdf_read_file(uri.c_str())) {
|
||||
warning << "Could not parse rdf file: " << uri << endmsg;
|
||||
}
|
||||
|
||||
vector_delete (rdf_files);
|
||||
delete (rdf_files);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -661,23 +617,17 @@ static bool windows_vst_filter (const string& str, void * /*arg*/)
|
||||
int
|
||||
PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string *> *plugin_objects;
|
||||
vector<string *>::iterator x;
|
||||
vector<string> plugin_objects;
|
||||
vector<string>::iterator x;
|
||||
int ret = 0;
|
||||
|
||||
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
|
||||
|
||||
plugin_objects = scanner (Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true);
|
||||
find_files_matching_filter (plugin_objects, Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true);
|
||||
|
||||
if (plugin_objects) {
|
||||
for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
|
||||
ARDOUR::PluginScanMessage(_("VST"), **x, !cache_only && !cancelled());
|
||||
windows_vst_discover (**x, cache_only || cancelled());
|
||||
}
|
||||
|
||||
vector_delete (plugin_objects);
|
||||
delete (plugin_objects);
|
||||
for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
|
||||
ARDOUR::PluginScanMessage(_("VST"), *x, !cache_only && !cancelled());
|
||||
windows_vst_discover (*x, cache_only || cancelled());
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -782,9 +732,8 @@ static bool lxvst_filter (const string& str, void *)
|
||||
int
|
||||
PluginManager::lxvst_discover_from_path (string path, bool cache_only)
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string *> *plugin_objects;
|
||||
vector<string *>::iterator x;
|
||||
vector<string> plugin_objects;
|
||||
vector<string>::iterator x;
|
||||
int ret = 0;
|
||||
|
||||
#ifndef NDEBUG
|
||||
@@ -793,16 +742,11 @@ PluginManager::lxvst_discover_from_path (string path, bool cache_only)
|
||||
|
||||
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path));
|
||||
|
||||
plugin_objects = scanner (Config->get_plugin_path_lxvst(), lxvst_filter, 0, false, true);
|
||||
find_files_matching_filter (plugin_objects, Config->get_plugin_path_lxvst(), lxvst_filter, 0, false, true);
|
||||
|
||||
if (plugin_objects) {
|
||||
for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
|
||||
ARDOUR::PluginScanMessage(_("LXVST"), **x, !cache_only && !cancelled());
|
||||
lxvst_discover (**x, cache_only || cancelled());
|
||||
}
|
||||
|
||||
vector_delete (plugin_objects);
|
||||
delete (plugin_objects);
|
||||
for (x = plugin_objects.begin(); x != plugin_objects.end (); ++x) {
|
||||
ARDOUR::PluginScanMessage(_("LXVST"), *x, !cache_only && !cancelled());
|
||||
lxvst_discover (*x, cache_only || cancelled());
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/boost_debug.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
#include "pbd/basename.h"
|
||||
#include "pbd/stacktrace.h"
|
||||
|
||||
@@ -69,7 +69,6 @@
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/pathexpand.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/pthread_utils.h"
|
||||
#include "pbd/stacktrace.h"
|
||||
#include "pbd/convert.h"
|
||||
@@ -2299,16 +2298,10 @@ state_file_filter (const string &str, void* /*arg*/)
|
||||
str.find (statefile_suffix) == (str.length() - strlen (statefile_suffix)));
|
||||
}
|
||||
|
||||
struct string_cmp {
|
||||
bool operator()(const string* a, const string* b) {
|
||||
return *a < *b;
|
||||
}
|
||||
};
|
||||
|
||||
static string*
|
||||
remove_end(string* state)
|
||||
static string
|
||||
remove_end(string state)
|
||||
{
|
||||
string statename(*state);
|
||||
string statename(state);
|
||||
|
||||
string::size_type start,end;
|
||||
if ((start = statename.find_last_of (G_DIR_SEPARATOR)) != string::npos) {
|
||||
@@ -2319,24 +2312,23 @@ remove_end(string* state)
|
||||
end = statename.length();
|
||||
}
|
||||
|
||||
return new string(statename.substr (0, end));
|
||||
return string(statename.substr (0, end));
|
||||
}
|
||||
|
||||
vector<string *> *
|
||||
vector<string>
|
||||
Session::possible_states (string path)
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string*>* states = scanner (path, state_file_filter, 0, false, false);
|
||||
vector<string> states;
|
||||
find_files_matching_filter (states, path, state_file_filter, 0, false, false);
|
||||
|
||||
transform(states->begin(), states->end(), states->begin(), remove_end);
|
||||
transform(states.begin(), states.end(), states.begin(), remove_end);
|
||||
|
||||
string_cmp cmp;
|
||||
sort (states->begin(), states->end(), cmp);
|
||||
sort (states.begin(), states.end());
|
||||
|
||||
return states;
|
||||
}
|
||||
|
||||
vector<string *> *
|
||||
vector<string>
|
||||
Session::possible_states () const
|
||||
{
|
||||
return possible_states(_path);
|
||||
@@ -2560,8 +2552,7 @@ Session::find_all_sources (string path, set<string>& result)
|
||||
int
|
||||
Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot)
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string*>* state_files;
|
||||
vector<string> state_files;
|
||||
string ripped;
|
||||
string this_snapshot_path;
|
||||
|
||||
@@ -2573,9 +2564,9 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
|
||||
ripped = ripped.substr (0, ripped.length() - 1);
|
||||
}
|
||||
|
||||
state_files = scanner (ripped, accept_all_state_files, (void *) 0, true, true);
|
||||
find_files_matching_filter (state_files, ripped, accept_all_state_files, (void *) 0, true, true);
|
||||
|
||||
if (state_files == 0) {
|
||||
if (state_files.empty()) {
|
||||
/* impossible! */
|
||||
return 0;
|
||||
}
|
||||
@@ -2584,13 +2575,13 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
|
||||
this_snapshot_path += legalize_for_path (_current_snapshot_name);
|
||||
this_snapshot_path += statefile_suffix;
|
||||
|
||||
for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) {
|
||||
for (vector<string>::iterator i = state_files.begin(); i != state_files.end(); ++i) {
|
||||
|
||||
if (exclude_this_snapshot && **i == this_snapshot_path) {
|
||||
if (exclude_this_snapshot && *i == this_snapshot_path) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (find_all_sources (**i, result) < 0) {
|
||||
if (find_all_sources (*i, result) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -2640,13 +2631,11 @@ Session::cleanup_sources (CleanupReport& rep)
|
||||
// FIXME: needs adaptation to midi
|
||||
|
||||
vector<boost::shared_ptr<Source> > dead_sources;
|
||||
PathScanner scanner;
|
||||
string audio_path;
|
||||
string midi_path;
|
||||
vector<space_and_path>::iterator i;
|
||||
vector<space_and_path>::iterator nexti;
|
||||
vector<string*>* candidates;
|
||||
vector<string*>* candidates2;
|
||||
vector<string> candidates;
|
||||
vector<string> unused;
|
||||
set<string> all_sources;
|
||||
bool used;
|
||||
@@ -2728,21 +2717,8 @@ Session::cleanup_sources (CleanupReport& rep)
|
||||
i = nexti;
|
||||
}
|
||||
|
||||
candidates = scanner (audio_path, accept_all_audio_files, (void *) 0, true, true);
|
||||
candidates2 = scanner (midi_path, accept_all_midi_files, (void *) 0, true, true);
|
||||
|
||||
/* merge them */
|
||||
|
||||
if (candidates) {
|
||||
if (candidates2) {
|
||||
for (vector<string*>::iterator i = candidates2->begin(); i != candidates2->end(); ++i) {
|
||||
candidates->push_back (*i);
|
||||
}
|
||||
delete candidates2;
|
||||
}
|
||||
} else {
|
||||
candidates = candidates2; // might still be null
|
||||
}
|
||||
find_files_matching_filter (candidates, audio_path, accept_all_audio_files, (void *) 0, true, true);
|
||||
find_files_matching_filter (candidates, midi_path, accept_all_midi_files, (void *) 0, true, true);
|
||||
|
||||
/* find all sources, but don't use this snapshot because the
|
||||
state file on disk still references sources we may have already
|
||||
@@ -2782,32 +2758,26 @@ Session::cleanup_sources (CleanupReport& rep)
|
||||
i = tmp;
|
||||
}
|
||||
|
||||
if (candidates) {
|
||||
for (vector<string*>::iterator x = candidates->begin(); x != candidates->end(); ++x) {
|
||||
for (vector<string>::iterator x = candidates.begin(); x != candidates.end(); ++x) {
|
||||
|
||||
used = false;
|
||||
spath = **x;
|
||||
used = false;
|
||||
spath = *x;
|
||||
|
||||
for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
|
||||
for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
|
||||
|
||||
tmppath1 = canonical_path (spath);
|
||||
tmppath2 = canonical_path ((*i));
|
||||
tmppath1 = canonical_path (spath);
|
||||
tmppath2 = canonical_path ((*i));
|
||||
|
||||
if (tmppath1 == tmppath2) {
|
||||
used = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tmppath1 == tmppath2) {
|
||||
used = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!used) {
|
||||
unused.push_back (spath);
|
||||
}
|
||||
|
||||
delete *x;
|
||||
}
|
||||
|
||||
delete candidates;
|
||||
}
|
||||
if (!used) {
|
||||
unused.push_back (spath);
|
||||
}
|
||||
}
|
||||
|
||||
/* now try to move all unused files into the "dead" directory(ies) */
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
#include "pbd/strsplit.h"
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include <glibmm/miscutils.h>
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/error.h"
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <glibmm.h>
|
||||
|
||||
#include "pbd/basename.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
#include "pbd/xml++.h"
|
||||
|
||||
@@ -81,21 +81,20 @@ session_template_dir_to_file (string const & dir)
|
||||
void
|
||||
find_session_templates (vector<TemplateInfo>& template_names)
|
||||
{
|
||||
vector<string *> *templates;
|
||||
PathScanner scanner;
|
||||
vector<string> templates;
|
||||
Searchpath spath (template_search_path());
|
||||
|
||||
templates = scanner (spath.to_string(), template_filter, 0, true, true);
|
||||
find_files_matching_filter (templates, spath.to_string(), template_filter, 0, true, true);
|
||||
|
||||
if (!templates) {
|
||||
if (templates.empty()) {
|
||||
cerr << "Found nothing along " << spath.to_string() << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
cerr << "Found " << templates->size() << " along " << spath.to_string() << endl;
|
||||
cerr << "Found " << templates.size() << " along " << spath.to_string() << endl;
|
||||
|
||||
for (vector<string*>::iterator i = templates->begin(); i != templates->end(); ++i) {
|
||||
string file = session_template_dir_to_file (**i);
|
||||
for (vector<string>::iterator i = templates.begin(); i != templates.end(); ++i) {
|
||||
string file = session_template_dir_to_file (*i);
|
||||
|
||||
XMLTree tree;
|
||||
|
||||
@@ -105,31 +104,27 @@ find_session_templates (vector<TemplateInfo>& template_names)
|
||||
|
||||
TemplateInfo rti;
|
||||
|
||||
rti.name = basename_nosuffix (**i);
|
||||
rti.path = **i;
|
||||
rti.name = basename_nosuffix (*i);
|
||||
rti.path = *i;
|
||||
|
||||
template_names.push_back (rti);
|
||||
}
|
||||
|
||||
vector_delete (templates);
|
||||
delete templates;
|
||||
}
|
||||
|
||||
void
|
||||
find_route_templates (vector<TemplateInfo>& template_names)
|
||||
{
|
||||
vector<string *> *templates;
|
||||
PathScanner scanner;
|
||||
vector<string> templates;
|
||||
Searchpath spath (route_template_search_path());
|
||||
|
||||
templates = scanner (spath.to_string(), route_template_filter, 0, false, true);
|
||||
find_files_matching_filter (templates, spath.to_string(), route_template_filter, 0, false, true);
|
||||
|
||||
if (!templates) {
|
||||
if (templates.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (vector<string*>::iterator i = templates->begin(); i != templates->end(); ++i) {
|
||||
string fullpath = *(*i);
|
||||
for (vector<string>::iterator i = templates.begin(); i != templates.end(); ++i) {
|
||||
string fullpath = *i;
|
||||
|
||||
XMLTree tree;
|
||||
|
||||
@@ -146,9 +141,6 @@ find_route_templates (vector<TemplateInfo>& template_names)
|
||||
|
||||
template_names.push_back (rti);
|
||||
}
|
||||
|
||||
vector_delete (templates);
|
||||
delete templates;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#include "pbd/floating.h"
|
||||
#include "pbd/locale_guard.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
|
||||
#include "ardour/vst_plugin.h"
|
||||
#include "ardour/vestige/aeffectx.h"
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
#include <glibmm.h>
|
||||
#include <gdkmm.h>
|
||||
|
||||
#include "pbd/pathscanner.h"
|
||||
|
||||
#include "gtkmm2ext/keyboard.h"
|
||||
#include "gtkmm2ext/selector.h"
|
||||
#include "gtkmm2ext/utils.h"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
Copyright (C) 2007 Tim Mayberry
|
||||
Copyright (C) 2007-2014 Tim Mayberry
|
||||
Copyright (C) 1998-2014 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -42,15 +43,22 @@
|
||||
/* close(), read(), write() */
|
||||
#ifdef COMPILER_MSVC
|
||||
#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
|
||||
#include <ardourext/misc.h>
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#include <regex.h>
|
||||
#endif
|
||||
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
#define strtok_r strtok_s
|
||||
#endif
|
||||
|
||||
#include "pbd/compose.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/debug.h"
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/pathexpand.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
|
||||
#include "i18n.h"
|
||||
@@ -161,6 +169,123 @@ find_file_in_search_path(const Searchpath& search_path,
|
||||
return true;
|
||||
}
|
||||
|
||||
static
|
||||
bool
|
||||
regexp_filter (const string& str, void *arg)
|
||||
{
|
||||
regex_t* pattern = (regex_t*)arg;
|
||||
return regexec (pattern, str.c_str(), 0, 0, 0) == 0;
|
||||
}
|
||||
|
||||
void
|
||||
find_files_matching_regex (vector<string>& result,
|
||||
const std::string& dirpath,
|
||||
const std::string& regexp,
|
||||
bool match_fullpath, bool return_fullpath,
|
||||
long limit,
|
||||
bool recurse)
|
||||
{
|
||||
int err;
|
||||
char msg[256];
|
||||
regex_t compiled_pattern;
|
||||
|
||||
if ((err = regcomp (&compiled_pattern, regexp.c_str(),
|
||||
REG_EXTENDED|REG_NOSUB))) {
|
||||
|
||||
regerror (err, &compiled_pattern,
|
||||
msg, sizeof (msg));
|
||||
|
||||
error << "Cannot compile soundfile regexp for use ("
|
||||
<< msg
|
||||
<< ")"
|
||||
<< endmsg;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
find_files_matching_filter (result, dirpath,
|
||||
regexp_filter, &compiled_pattern,
|
||||
match_fullpath, return_fullpath,
|
||||
limit, recurse);
|
||||
|
||||
regfree (&compiled_pattern);
|
||||
}
|
||||
|
||||
void
|
||||
find_files_matching_filter (vector<string>& result,
|
||||
const string &dirpath,
|
||||
bool (*filter)(const string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath, bool return_fullpath,
|
||||
long limit,
|
||||
bool recurse)
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *finfo;
|
||||
char *pathcopy = strdup (search_path_expand (dirpath).c_str());
|
||||
char *thisdir;
|
||||
string fullpath;
|
||||
string search_str;
|
||||
long nfound = 0;
|
||||
char *saveptr;
|
||||
|
||||
if ((thisdir = strtok_r (pathcopy, G_SEARCHPATH_SEPARATOR_S, &saveptr)) == 0 ||
|
||||
strlen (thisdir) == 0) {
|
||||
free (pathcopy);
|
||||
return;
|
||||
}
|
||||
|
||||
do {
|
||||
|
||||
if ((dir = opendir (thisdir)) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while ((finfo = readdir (dir)) != 0) {
|
||||
|
||||
if ((finfo->d_name[0] == '.' && finfo->d_name[1] == '\0') ||
|
||||
(finfo->d_name[0] == '.' && finfo->d_name[1] == '.' && finfo->d_name[2] == '\0')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fullpath = Glib::build_filename (thisdir, finfo->d_name);
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat (fullpath.c_str(), &statbuf) < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (statbuf.st_mode & S_IFDIR && recurse) {
|
||||
find_files_matching_filter (result, fullpath, filter, arg, match_fullpath, return_fullpath, limit, recurse);
|
||||
} else {
|
||||
|
||||
if (match_fullpath) {
|
||||
search_str = fullpath;
|
||||
} else {
|
||||
search_str = finfo->d_name;
|
||||
}
|
||||
|
||||
if (!filter(search_str, arg)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (return_fullpath) {
|
||||
result.push_back(fullpath);
|
||||
} else {
|
||||
result.push_back(finfo->d_name);
|
||||
}
|
||||
|
||||
nfound++;
|
||||
}
|
||||
}
|
||||
closedir (dir);
|
||||
|
||||
} while ((limit < 0 || (nfound < limit)) && (thisdir = strtok_r (0, G_SEARCHPATH_SEPARATOR_S, &saveptr)));
|
||||
|
||||
free (pathcopy);
|
||||
return;
|
||||
}
|
||||
|
||||
bool
|
||||
copy_file(const std::string & from_path, const std::string & to_path)
|
||||
{
|
||||
@@ -228,17 +353,13 @@ bool accept_all_files (string const &, void *)
|
||||
void
|
||||
copy_files(const std::string & from_path, const std::string & to_dir)
|
||||
{
|
||||
PathScanner scanner;
|
||||
vector<string*>* files = scanner (from_path, accept_all_files, 0, true, false);
|
||||
vector<string> files;
|
||||
find_files_matching_filter (files, from_path, accept_all_files, 0, true, false);
|
||||
|
||||
if (files) {
|
||||
for (vector<string*>::iterator i = files->begin(); i != files->end(); ++i) {
|
||||
std::string from = Glib::build_filename (from_path, **i);
|
||||
std::string to = Glib::build_filename (to_dir, **i);
|
||||
copy_file (from, to);
|
||||
}
|
||||
vector_delete (files);
|
||||
delete (files);
|
||||
for (vector<string>::iterator i = files.begin(); i != files.end(); ++i) {
|
||||
std::string from = Glib::build_filename (from_path, *i);
|
||||
std::string to = Glib::build_filename (to_dir, *i);
|
||||
copy_file (from, to);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,247 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 1998-99 Paul Barton-Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#ifdef COMPILER_MSVC
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
using PBD::readdir;
|
||||
using PBD::opendir;
|
||||
using PBD::closedir;
|
||||
#define strtok_r strtok_s // @john: this should probably go to msvc_extra_headers/ardourext/misc.h.input instead of the current define there
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#endif
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <glibmm/miscutils.h>
|
||||
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/pathexpand.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace PBD;
|
||||
|
||||
vector<string *> *
|
||||
PathScanner::operator() (const string &dirpath, const string ®exp,
|
||||
bool match_fullpath, bool return_fullpath,
|
||||
long limit, bool recurse)
|
||||
|
||||
{
|
||||
int err;
|
||||
char msg[256];
|
||||
|
||||
if ((err = regcomp (&compiled_pattern, regexp.c_str(),
|
||||
REG_EXTENDED|REG_NOSUB))) {
|
||||
|
||||
regerror (err, &compiled_pattern,
|
||||
msg, sizeof (msg));
|
||||
|
||||
error << "Cannot compile soundfile regexp for use ("
|
||||
<< msg
|
||||
<< ")"
|
||||
<< endmsg;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return run_scan (dirpath, &PathScanner::regexp_filter,
|
||||
(bool (*)(const string &, void *)) 0,
|
||||
0,
|
||||
match_fullpath,
|
||||
return_fullpath,
|
||||
limit, recurse);
|
||||
}
|
||||
|
||||
vector<string *> *
|
||||
PathScanner::run_scan (const string &dirpath,
|
||||
bool (PathScanner::*memberfilter)(const string &),
|
||||
bool (*filter)(const string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath, bool return_fullpath,
|
||||
long limit,
|
||||
bool recurse)
|
||||
{
|
||||
return run_scan_internal ((vector<string*>*) 0, dirpath, memberfilter, filter, arg, match_fullpath, return_fullpath, limit, recurse);
|
||||
}
|
||||
|
||||
vector<string *> *
|
||||
PathScanner::run_scan_internal (vector<string *> *result,
|
||||
const string &dirpath,
|
||||
bool (PathScanner::*memberfilter)(const string &),
|
||||
bool (*filter)(const string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath, bool return_fullpath,
|
||||
long limit,
|
||||
bool recurse)
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *finfo;
|
||||
char *pathcopy = strdup (search_path_expand (dirpath).c_str());
|
||||
char *thisdir;
|
||||
string fullpath;
|
||||
string search_str;
|
||||
string *newstr;
|
||||
long nfound = 0;
|
||||
char *saveptr;
|
||||
|
||||
if ((thisdir = strtok_r (pathcopy, G_SEARCHPATH_SEPARATOR_S, &saveptr)) == 0 ||
|
||||
strlen (thisdir) == 0) {
|
||||
free (pathcopy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (result == 0) {
|
||||
result = new vector<string *>;
|
||||
}
|
||||
|
||||
do {
|
||||
|
||||
if ((dir = opendir (thisdir)) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while ((finfo = readdir (dir)) != 0) {
|
||||
|
||||
if ((finfo->d_name[0] == '.' && finfo->d_name[1] == '\0') ||
|
||||
(finfo->d_name[0] == '.' && finfo->d_name[1] == '.' && finfo->d_name[2] == '\0')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fullpath = Glib::build_filename (thisdir, finfo->d_name);
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat (fullpath.c_str(), &statbuf) < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (statbuf.st_mode & S_IFDIR && recurse) {
|
||||
run_scan_internal (result, fullpath, memberfilter, filter, arg, match_fullpath, return_fullpath, limit, recurse);
|
||||
} else {
|
||||
|
||||
if (match_fullpath) {
|
||||
search_str = fullpath;
|
||||
} else {
|
||||
search_str = finfo->d_name;
|
||||
}
|
||||
|
||||
/* handle either type of function ptr */
|
||||
|
||||
if (memberfilter) {
|
||||
if (!(this->*memberfilter)(search_str)) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (!filter(search_str, arg)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (return_fullpath) {
|
||||
newstr = new string (fullpath);
|
||||
} else {
|
||||
newstr = new string (finfo->d_name);
|
||||
}
|
||||
|
||||
result->push_back (newstr);
|
||||
nfound++;
|
||||
}
|
||||
}
|
||||
closedir (dir);
|
||||
|
||||
} while ((limit < 0 || (nfound < limit)) && (thisdir = strtok_r (0, G_SEARCHPATH_SEPARATOR_S, &saveptr)));
|
||||
|
||||
free (pathcopy);
|
||||
return result;
|
||||
}
|
||||
|
||||
string *
|
||||
PathScanner::find_first (const string &dirpath,
|
||||
const string ®exp,
|
||||
bool match_fullpath,
|
||||
bool return_fullpath)
|
||||
{
|
||||
vector<string *> *res;
|
||||
string *ret;
|
||||
int err;
|
||||
char msg[256];
|
||||
|
||||
if ((err = regcomp (&compiled_pattern, regexp.c_str(),
|
||||
REG_EXTENDED|REG_NOSUB))) {
|
||||
|
||||
regerror (err, &compiled_pattern,
|
||||
msg, sizeof (msg));
|
||||
|
||||
error << "Cannot compile soundfile regexp for use (" << msg << ")" << endmsg;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
res = run_scan (dirpath,
|
||||
&PathScanner::regexp_filter,
|
||||
(bool (*)(const string &, void *)) 0,
|
||||
0,
|
||||
match_fullpath,
|
||||
return_fullpath,
|
||||
1);
|
||||
|
||||
if (res->size() == 0) {
|
||||
ret = 0;
|
||||
} else {
|
||||
ret = res->front();
|
||||
}
|
||||
vector_delete (res);
|
||||
delete res;
|
||||
return ret;
|
||||
}
|
||||
|
||||
string *
|
||||
PathScanner::find_first (const string &dirpath,
|
||||
bool (*filter)(const string &, void *),
|
||||
void * /*arg*/,
|
||||
bool match_fullpath,
|
||||
bool return_fullpath)
|
||||
{
|
||||
vector<string *> *res;
|
||||
string *ret;
|
||||
|
||||
res = run_scan (dirpath,
|
||||
(bool (PathScanner::*)(const string &)) 0,
|
||||
filter,
|
||||
0,
|
||||
match_fullpath,
|
||||
return_fullpath, 1);
|
||||
|
||||
if (res->size() == 0) {
|
||||
ret = 0;
|
||||
} else {
|
||||
ret = res->front();
|
||||
}
|
||||
vector_delete (res);
|
||||
delete res;
|
||||
return ret;
|
||||
}
|
||||
@@ -92,6 +92,32 @@ find_file_in_search_path (const Searchpath& search_path,
|
||||
const std::string& filename,
|
||||
std::string& result);
|
||||
|
||||
|
||||
/**
|
||||
* @return files in dirpath that match a regular expression
|
||||
*/
|
||||
LIBPBD_API void
|
||||
find_files_matching_regex (std::vector<std::string>& results,
|
||||
const std::string& dirpath,
|
||||
const std::string& regexp,
|
||||
bool match_fullpath,
|
||||
bool return_fullpath,
|
||||
long limit = -1,
|
||||
bool recurse = false);
|
||||
|
||||
/**
|
||||
* @return files in dirpath that match a supplied filter(functor)
|
||||
*/
|
||||
LIBPBD_API void
|
||||
find_files_matching_filter (std::vector<std::string>&,
|
||||
const std::string &dirpath,
|
||||
bool (*filter)(const std::string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath,
|
||||
bool return_fullpath,
|
||||
long limit = -1,
|
||||
bool recurse = false);
|
||||
|
||||
/**
|
||||
* Attempt to copy the contents of the file from_path to a new file
|
||||
* at path to_path. If to_path exists it is overwritten.
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2000-2007 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __libmisc_pathscanner_h__
|
||||
#define __libmisc_pathscanner_h__
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#ifdef COMPILER_MSVC
|
||||
#include <ardourext/misc.h>
|
||||
#else
|
||||
#include <regex.h>
|
||||
#endif
|
||||
|
||||
#include "pbd/libpbd_visibility.h"
|
||||
|
||||
class LIBPBD_API PathScanner
|
||||
|
||||
{
|
||||
public:
|
||||
std::vector<std::string *> *operator() (const std::string &dirpath,
|
||||
bool (*filter)(const std::string &, void *arg),
|
||||
void *arg,
|
||||
bool match_fullpath = true,
|
||||
bool return_fullpath = true,
|
||||
long limit = -1,
|
||||
bool recurse = false) {
|
||||
return run_scan (dirpath,
|
||||
(bool (PathScanner::*)(const std::string &)) 0,
|
||||
filter,
|
||||
arg,
|
||||
match_fullpath,
|
||||
return_fullpath,
|
||||
limit, recurse);
|
||||
}
|
||||
|
||||
std::vector<std::string *> *operator() (const std::string &dirpath,
|
||||
const std::string ®exp,
|
||||
bool match_fullpath = true,
|
||||
bool return_fullpath = true,
|
||||
long limit = -1,
|
||||
bool recurse = false);
|
||||
|
||||
std::string *find_first (const std::string &dirpath,
|
||||
const std::string ®exp,
|
||||
bool match_fullpath = true,
|
||||
bool return_fullpath = true);
|
||||
|
||||
std::string *find_first (const std::string &dirpath,
|
||||
bool (*filter)(const std::string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath = true,
|
||||
bool return_fullpath = true);
|
||||
|
||||
private:
|
||||
regex_t compiled_pattern;
|
||||
|
||||
bool regexp_filter (const std::string &str) {
|
||||
return regexec (&compiled_pattern, str.c_str(), 0, 0, 0) == 0;
|
||||
}
|
||||
|
||||
std::vector<std::string *> *run_scan (const std::string &dirpath,
|
||||
bool (PathScanner::*mfilter) (const std::string &),
|
||||
bool (*filter)(const std::string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath,
|
||||
bool return_fullpath,
|
||||
long limit,
|
||||
bool recurse = false);
|
||||
|
||||
std::vector<std::string *> *run_scan_internal (std::vector<std::string*>*,
|
||||
const std::string &dirpath,
|
||||
bool (PathScanner::*mfilter) (const std::string &),
|
||||
bool (*filter)(const std::string &, void *),
|
||||
void *arg,
|
||||
bool match_fullpath,
|
||||
bool return_fullpath,
|
||||
long limit,
|
||||
bool recurse = false);
|
||||
};
|
||||
|
||||
#endif // __libmisc_pathscanner_h__
|
||||
@@ -57,7 +57,6 @@ libpbd_sources = [
|
||||
'mountpoint.cc',
|
||||
'openuri.cc',
|
||||
'pathexpand.cc',
|
||||
'pathscanner.cc',
|
||||
'pbd.cc',
|
||||
'pool.cc',
|
||||
'property_list.cc',
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "pbd/controllable_descriptor.h"
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/failed_constructor.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/xml++.h"
|
||||
|
||||
#include "midi++/port.h"
|
||||
@@ -136,20 +136,19 @@ midi_map_filter (const string &str, void* /*arg*/)
|
||||
void
|
||||
GenericMidiControlProtocol::reload_maps ()
|
||||
{
|
||||
vector<string *> *midi_maps;
|
||||
PathScanner scanner;
|
||||
vector<string> midi_maps;
|
||||
Searchpath spath (system_midi_map_search_path());
|
||||
spath += user_midi_map_directory ();
|
||||
|
||||
midi_maps = scanner (spath.to_string(), midi_map_filter, 0, false, true);
|
||||
find_files_matching_filter (midi_maps, spath.to_string(), midi_map_filter, 0, false, true);
|
||||
|
||||
if (!midi_maps) {
|
||||
if (midi_maps.empty()) {
|
||||
cerr << "No MIDI maps found using " << spath.to_string() << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
for (vector<string*>::iterator i = midi_maps->begin(); i != midi_maps->end(); ++i) {
|
||||
string fullpath = *(*i);
|
||||
for (vector<string>::iterator i = midi_maps.begin(); i != midi_maps.end(); ++i) {
|
||||
string fullpath = *i;
|
||||
|
||||
XMLTree tree;
|
||||
|
||||
@@ -170,8 +169,6 @@ GenericMidiControlProtocol::reload_maps ()
|
||||
|
||||
map_info.push_back (mi);
|
||||
}
|
||||
|
||||
delete midi_maps;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "pbd/xml++.h"
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/convert.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
|
||||
@@ -471,31 +471,23 @@ DeviceInfo::reload_device_info ()
|
||||
{
|
||||
DeviceInfo di;
|
||||
vector<string> s;
|
||||
vector<string *> *devinfos;
|
||||
PathScanner scanner;
|
||||
vector<string> devinfos;
|
||||
Searchpath spath (devinfo_search_path());
|
||||
|
||||
devinfos = scanner (spath.to_string(), devinfo_filter, 0, false, true);
|
||||
find_files_matching_filter (devinfos, spath.to_string(), devinfo_filter, 0, false, true);
|
||||
device_info.clear ();
|
||||
|
||||
if (!devinfos) {
|
||||
if (devinfos.empty()) {
|
||||
error << "No MCP device info files found using " << spath.to_string() << endmsg;
|
||||
std::cerr << "No MCP device info files found using " << spath.to_string() << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
if (devinfos->empty()) {
|
||||
error << "No MCP device info files found using " << spath.to_string() << endmsg;
|
||||
std::cerr << "No MCP device info files found using " << spath.to_string() << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
for (vector<string*>::iterator i = devinfos->begin(); i != devinfos->end(); ++i) {
|
||||
string fullpath = *(*i);
|
||||
for (vector<string>::iterator i = devinfos.begin(); i != devinfos.end(); ++i) {
|
||||
string fullpath = *i;
|
||||
|
||||
XMLTree tree;
|
||||
|
||||
|
||||
if (!tree.read (fullpath.c_str())) {
|
||||
continue;
|
||||
}
|
||||
@@ -509,9 +501,6 @@ DeviceInfo::reload_device_info ()
|
||||
device_info[di.name()] = di;
|
||||
}
|
||||
}
|
||||
|
||||
vector_delete (devinfos);
|
||||
delete devinfos;
|
||||
}
|
||||
|
||||
std::ostream& operator<< (std::ostream& os, const Mackie::DeviceInfo& di)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#include "pbd/xml++.h"
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/pathscanner.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/stl_delete.h"
|
||||
#include "pbd/replace_all.h"
|
||||
|
||||
@@ -90,25 +90,19 @@ DeviceProfile::reload_device_profiles ()
|
||||
{
|
||||
DeviceProfile dp;
|
||||
vector<string> s;
|
||||
vector<string *> *devprofiles;
|
||||
PathScanner scanner;
|
||||
vector<string> devprofiles;
|
||||
Searchpath spath (devprofile_search_path());
|
||||
|
||||
devprofiles = scanner (spath.to_string(), devprofile_filter, 0, false, true);
|
||||
find_files_matching_filter (devprofiles, spath.to_string(), devprofile_filter, 0, false, true);
|
||||
device_profiles.clear ();
|
||||
|
||||
if (!devprofiles) {
|
||||
if (devprofiles.empty()) {
|
||||
error << "No MCP device info files found using " << spath.to_string() << endmsg;
|
||||
return;
|
||||
}
|
||||
|
||||
if (devprofiles->empty()) {
|
||||
error << "No MCP device info files found using " << spath.to_string() << endmsg;
|
||||
return;
|
||||
}
|
||||
|
||||
for (vector<string*>::iterator i = devprofiles->begin(); i != devprofiles->end(); ++i) {
|
||||
string fullpath = *(*i);
|
||||
for (vector<string>::iterator i = devprofiles.begin(); i != devprofiles.end(); ++i) {
|
||||
string fullpath = *i;
|
||||
|
||||
XMLTree tree;
|
||||
|
||||
@@ -126,9 +120,6 @@ DeviceProfile::reload_device_profiles ()
|
||||
device_profiles[dp.name()] = dp;
|
||||
}
|
||||
}
|
||||
|
||||
vector_delete (devprofiles);
|
||||
delete devprofiles;
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
Reference in New Issue
Block a user