diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2015-03-27 16:07:27 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2015-03-27 16:07:27 +0300 |
commit | ff44c9cd55bff146c6c47277656a967045184c7b (patch) | |
tree | b1d5d59696c8811db0badea0e6dcedca3601b183 /server/src/modules_handler.cpp | |
parent | f87e3320c499edccd545ff3bfc244ef5c7216bb5 (diff) |
working module loader
basic program options support
abitilty to print installed modules info
started config support implementation
Diffstat (limited to 'server/src/modules_handler.cpp')
-rw-r--r-- | server/src/modules_handler.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/server/src/modules_handler.cpp b/server/src/modules_handler.cpp new file mode 100644 index 0000000..a6dbcef --- /dev/null +++ b/server/src/modules_handler.cpp @@ -0,0 +1,142 @@ +/* + Copyright © 2015 Gluzskiy Alexandr (sss) + + This file is part of Unknown Download Manager (UDM). + + UDM 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. + + UDM 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 UDM. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "modules_handler.h" +#include <unistd.h> +#include <dlfcn.h> +#include <string> + +#include <boost/filesystem.hpp> + + +#include <iostream> + +extern core_api *module_api; + + +void modules_handler::load_metadata_modules(const std::string &path) +{ + if(boost::filesystem::exists(path) && boost::filesystem::is_directory(path)) + { + for(boost::filesystem::directory_iterator i(path), end = boost::filesystem::directory_iterator(); i != end; ++i) + { + void *lib = dlopen(i->path().generic_string().c_str(), RTLD_LAZY); + if(!lib) + { + printf("failed to open library \"%s\" with error: %s\n", i->path().c_str(), dlerror()); + return; + } + void *fptr = dlsym(lib, "udm_metadata_module_load"); + if(!fptr) + { + printf("failed to find symbol \"udm_metadata_module_load\" in library %s with error %s\n", i->path().c_str(), dlerror()); + dlclose(lib); + return; + } + void *(*f)(void); + f = (void* (*)())fptr; + //TODO: aditional sanity checks + module_metadata_storage *m = static_cast<module_metadata_storage*>(f()); + m->load(module_api); + metadata_modules.push_back(m); + } + } +} + +void modules_handler::load_downloader_modules(const std::string &path) +{ + if(boost::filesystem::exists(path) && boost::filesystem::is_directory(path)) + { + for(boost::filesystem::directory_iterator i(path), end = boost::filesystem::directory_iterator(); i != end; ++i) + { + void *lib = dlopen(i->path().generic_string().c_str(), RTLD_LAZY); + if(!lib) + { + printf("failed to open library \"%s\" with error: %s\n", i->path().c_str(), dlerror()); + return; + } + void *fptr = dlsym(lib, "udm_downloader_module_load"); + if(!fptr) + { + printf("failed to find symbol \"udm_downloader_module_load\" in library %s with error %s\n", i->path().c_str(), dlerror()); + dlclose(lib); + return; + } + void *(*f)(void); + f = (void* (*)())fptr; + //TODO: aditional sanity checks + module_metadata_storage *m = static_cast<module_metadata_storage*>(f()); + m->load(module_api); + metadata_modules.push_back(m); + } + } +} + +std::string modules_handler::get_self_path() +{ + //TODO: dynamic buffer + char buf[1024]; + readlink("/proc/self/exe", buf, 1023); + std::string s (buf); + return s; +} + +std::string modules_handler::list_modules() +{ + std::string buf; + buf += "Installed metadata modules:\n"; + for(auto i = metadata_modules.begin(), end = metadata_modules.end(); i != end; ++i) + { + buf += "\t"; + buf += (*i)->get_module_info().name; + buf += " (" + (*i)->get_module_info().description + ") "; + buf += "v" + (*i)->get_module_info().version; + buf += "\n"; + } + buf += "Installed downloader modules:\n"; + for(auto i = downloader_modules.begin(), end = downloader_modules.end(); i != end; ++i) + { + buf += "\t"; + buf += (*i)->get_module_info().name; + buf += " (" + (*i)->get_module_info().description + ") "; + buf += "v" + (*i)->get_module_info().version; + buf += "\n"; + } + return buf; +} + + +modules_handler::modules_handler() +{ + self_path = get_self_path(); + boost::filesystem::path p(self_path); + std::string self_dir = p.parent_path().generic_string(); + load_metadata_modules(self_dir + "/modules/metadata"); + load_metadata_modules("~/.share/udm/modules/metadata"); + load_metadata_modules("/usr/lib/udm/modules/metadata"); + load_downloader_modules(self_dir + "/modules/downloader"); + load_downloader_modules("~/.share/udm/modules/downloader"); + load_downloader_modules("/usr/lib/udm/modules/downloader"); +} + +modules_handler::~modules_handler() +{ + //dtor +} |