[ozulis] fixed some memory leaks
[ozulis.git] / src / ozulis / plugin-manager.cc
blob0e3006cb4dce4c5479e28edaf3c87945163058fe
1 #include <dlfcn.h>
3 #include <algorithm>
4 #include <boost/foreach.hpp>
5 #include <boost/filesystem.hpp>
6 #include <boost/format.hpp>
8 #include <ozulis/compiler.hh>
9 #include <ozulis/core/assert.hh>
10 #include "plugin-manager.hh"
12 namespace fs = boost::filesystem;
14 template class ozulis::core::Singleton<ozulis::PluginManager>;
15 template class std::vector<ozulis::LanguagePlugin *>;
17 namespace ozulis
19 PluginManager::PluginManager()
20 : core::Singleton<PluginManager>(),
21 languages_(),
22 pluginPathes_()
26 PluginManager::~PluginManager()
28 BOOST_FOREACH (Plugin * plugin, languages_)
30 void * handle = plugin->handle;
31 dlclose(handle);
35 void
36 PluginManager::addPluginPath(const fs::path & path)
38 if (!fs::is_directory(path) || pluginPathes_.count(path) > 0)
39 return;
41 pluginPathes_.insert(path);
42 loadPlugins(path);
45 void
46 PluginManager::loadPlugin(const fs::path & path)
48 if (!fs::is_regular_file(path))
49 return;
51 void * handle = dlopen(path.string().c_str(), RTLD_LAZY);
52 assert(handle);
53 Plugin * plugin = reinterpret_cast<Plugin *> (dlsym(handle, "ozulis_plugin"));
54 assert(plugin);
55 plugin->handle = handle;
57 switch (plugin->type())
59 case Plugin::Language:
60 registerPlugin(reinterpret_cast<LanguagePlugin *> (plugin));
61 break;
62 default: assert(false);
66 void
67 PluginManager::loadPlugins(const fs::path & path)
69 assert(fs::is_directory(path));
71 for (fs::directory_iterator it(path), end; it != end; ++it)
72 loadPlugin(it->path());
75 void
76 PluginManager::registerPlugin(LanguagePlugin * plugin)
78 languages_.push_back(plugin);
81 Parser *
82 PluginManager::createParserByExtension(const std::string & extension) const
84 BOOST_FOREACH(LanguagePlugin * plugin, languages_)
85 BOOST_FOREACH(const std::string & langExtension, plugin->extensions())
86 if (extension == langExtension)
87 return plugin->createParser();
88 Compiler::instance().error(
89 (boost::format(_("No plugin to handle `%1%' file extension."))
90 % extension).str());
91 return 0;