Commit 38f4aedb authored by Elizabeth's avatar Elizabeth
Browse files

Support for multiple paths in OPENMM_PLUGIN_DIR

parent 37d4b472
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
#include <sstream>
#include "openmm/internal/windowsExport.h" #include "openmm/internal/windowsExport.h"
namespace OpenMM { namespace OpenMM {
......
...@@ -261,31 +261,42 @@ void Platform::loadPluginLibrary(const string& file) { ...@@ -261,31 +261,42 @@ void Platform::loadPluginLibrary(const string& file) {
vector<string> Platform::loadPluginsFromDirectory(const string& directory) { vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
vector<string> files; vector<string> files;
char dirSeparator; char dirSeparator;
char pathSeparator;
stringstream sdirectory(directory);
#ifdef WIN32 #ifdef WIN32
dirSeparator = '\\'; dirSeparator = '\\';
pathSeparator = ';';
WIN32_FIND_DATA fileInfo; WIN32_FIND_DATA fileInfo;
string filePattern(directory + dirSeparator + "*.dll");
HANDLE findHandle = FindFirstFile(filePattern.c_str(), &fileInfo); for (string path; std::getline(sdirectory, path, pathSeparator);) {
if (findHandle != INVALID_HANDLE_VALUE) { string filePattern(path + dirSeparator + "*.dll");
do { HANDLE findHandle = FindFirstFile(filePattern.c_str(), &fileInfo);
if (fileInfo.cFileName[0] != '.') if (findHandle != INVALID_HANDLE_VALUE) {
files.push_back(string(fileInfo.cFileName)); do {
} while (FindNextFile(findHandle, &fileInfo)); if (fileInfo.cFileName[0] != '.')
FindClose(findHandle); files.push_back(path+dirSeparator+string(fileInfo.cFileName));
} while (FindNextFile(findHandle, &fileInfo));
FindClose(findHandle);
}
} }
vector<HMODULE> plugins; vector<HMODULE> plugins;
#else #else
dirSeparator = '/';
DIR* dir; DIR* dir;
dirSeparator = '/';
pathSeparator = ':';
struct dirent *entry; struct dirent *entry;
dir = opendir(directory.c_str());
if (dir != NULL) { for (string path; std::getline(sdirectory, path, pathSeparator);) {
while ((entry = readdir(dir)) != NULL) { dir = opendir(path.c_str());
if (entry->d_name[0] != '.') if (dir != NULL) {
files.push_back(string(entry->d_name)); while ((entry = readdir(dir)) != NULL) {
if (entry->d_name[0] != '.')
files.push_back(path+dirSeparator+string(entry->d_name));
}
closedir(dir);
} }
closedir(dir);
} }
vector<void*> plugins; vector<void*> plugins;
#endif #endif
vector<string> loadedLibraries; vector<string> loadedLibraries;
...@@ -294,7 +305,7 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) { ...@@ -294,7 +305,7 @@ vector<string> Platform::loadPluginsFromDirectory(const string& directory) {
for (unsigned int i = 0; i < files.size(); ++i) { for (unsigned int i = 0; i < files.size(); ++i) {
try { try {
plugins.push_back(loadOneLibrary(directory+dirSeparator+files[i])); plugins.push_back(loadOneLibrary(files[i]));
loadedLibraries.push_back(files[i]); loadedLibraries.push_back(files[i]);
} catch (OpenMMException& ex) { } catch (OpenMMException& ex) {
pluginLoadFailures.push_back(ex.what()); pluginLoadFailures.push_back(ex.what());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment