From 5a81b0e272a6e456e8c29ce2e755ac4e1c8b5546 Mon Sep 17 00:00:00 2001 From: Gluzskiy Alexandr Date: Mon, 11 Feb 2013 02:12:12 +0200 Subject: started separated proto lib implementation started modules support implementation --- server/modules.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 server/modules.cpp (limited to 'server/modules.cpp') diff --git a/server/modules.cpp b/server/modules.cpp new file mode 100644 index 0000000..1f10b90 --- /dev/null +++ b/server/modules.cpp @@ -0,0 +1,50 @@ +// Copyright © 2013 sss +// +// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "headers.h" + +std::list installed_services; + +void load_modules(const char* path) +{ + boost::filesystem::path p (path); + typedef void (*svcs_ptr)(std::list&); + typedef void (*init_ptr)(); + std::list local_services; + for(boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator(p), end = boost::filesystem::directory_iterator(); i != end; ++i) + { + if(boost::filesystem::is_regular_file(i->path())) + { + init_ptr f = reinterpret_cast(get_function(boost::filesystem::absolute(i->path()).generic_string().c_str(), "init")); + if(f) + f(); + local_services.clear(); + svcs_ptr svcs = reinterpret_cast(get_function(boost::filesystem::absolute(i->path()).generic_string().c_str(), "get_services")); + if(svcs) + { + svcs(local_services); + if(!local_services.empty()) + installed_services.insert(installed_services.end(), local_services.begin(), local_services.end()); + } + } + } +} + +void load_modules() +{ + if(boost::filesystem::exists("./modules") && boost::filesystem::is_directory("./modules")) + load_modules("./modules"); +} -- cgit v1.2.3