summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-08-18 14:04:21 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-08-18 15:10:55 +1000
commit36e4c11a2ac8e1a2310d948b6f039d28be4cf521 (patch)
tree1c7ec787a5766217c0cf39f41a2ad3b79d4c4520
parent1d05b5d25de1dad9ca6474a4b714d940d43206c0 (diff)
Add utility function to get windows packaging directory to avoid memory leaks
There were a few other small leaks in pbd and evoral test code but I didn't bother changing them. Perhaps this function would be better off in PBD:: so it can be used everywhere.
-rw-r--r--libs/ardour/ardour/filesystem_paths.h7
-rw-r--r--libs/ardour/filesystem_paths.cc21
-rw-r--r--libs/ardour/plugin_manager.cc2
-rw-r--r--libs/ardour/test/test_util.cc3
4 files changed, 29 insertions, 4 deletions
diff --git a/libs/ardour/ardour/filesystem_paths.h b/libs/ardour/ardour/filesystem_paths.h
index afa66453eb..cc1a21c45e 100644
--- a/libs/ardour/ardour/filesystem_paths.h
+++ b/libs/ardour/ardour/filesystem_paths.h
@@ -78,6 +78,13 @@ namespace ARDOUR {
* @return our 'Windows' search path ( corresponds to <install_dir>/share/ardour3 )
*/
LIBARDOUR_API PBD::Searchpath windows_search_path ();
+
+ /**
+ * @return Convenience function that calls
+ * g_win32_get_package_installation_directory_of_module but returns a
+ * std::string
+ */
+ LIBARDOUR_API std::string windows_package_directory_path ();
#endif
} // namespace ARDOUR
diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc
index fe1afd85d8..7e9b4e1857 100644
--- a/libs/ardour/filesystem_paths.cc
+++ b/libs/ardour/filesystem_paths.cc
@@ -200,7 +200,7 @@ std::string
ardour_dll_directory ()
{
#ifdef PLATFORM_WINDOWS
- std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL));
+ std::string dll_dir_path(windows_package_directory_path());
dll_dir_path = Glib::build_filename (dll_dir_path, "lib");
return Glib::build_filename (dll_dir_path, LIBARDOUR);
#else
@@ -217,10 +217,27 @@ ardour_dll_directory ()
Searchpath
windows_search_path ()
{
- std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL));
+ std::string dll_dir_path(windows_package_directory_path());
dll_dir_path = Glib::build_filename (dll_dir_path, "share");
return Glib::build_filename (dll_dir_path, LIBARDOUR);
}
+
+std::string
+windows_package_directory_path ()
+{
+ char* package_dir =
+ g_win32_get_package_installation_directory_of_module (NULL);
+
+ if (package_dir == NULL) {
+ fatal << string_compose (_("Cannot determine %1 package directory"),
+ PROGRAM_NAME) << endmsg;
+ // not reached
+ }
+
+ std::string package_dir_path(package_dir);
+ g_free(package_dir);
+ return package_dir_path;
+}
#endif
Searchpath
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index 4eb67db48d..7a14154d3c 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -123,7 +123,7 @@ PluginManager::PluginManager ()
#ifdef PLATFORM_WINDOWS
// on windows the .exe needs to be in the same folder with libardour.dll
- vstsp += Glib::build_filename(g_win32_get_package_installation_directory_of_module (0), "bin");
+ vstsp += Glib::build_filename(windows_package_directory_path(), "bin");
#else
// on Unices additional internal-use binaries are deployed to $libdir
vstsp += ARDOUR::ardour_dll_directory();
diff --git a/libs/ardour/test/test_util.cc b/libs/ardour/test/test_util.cc
index 3e9566c0e4..f717290ce9 100644
--- a/libs/ardour/test/test_util.cc
+++ b/libs/ardour/test/test_util.cc
@@ -27,6 +27,7 @@
#include "ardour/session.h"
#include "ardour/audioengine.h"
+#include "ardour/filesystem_paths.h"
#include "test_util.h"
@@ -133,7 +134,7 @@ PBD::Searchpath
test_search_path ()
{
#ifdef PLATFORM_WINDOWS
- std::string wsp(g_win32_get_package_installation_directory_of_module(NULL));
+ std::string wsp(windows_package_directory_path());
return Glib::build_filename (wsp, "ardour_testdata");
#else
return Glib::getenv("ARDOUR_TEST_PATH");