void datasource_cache::register_datasources(std::string const& str) { #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache, mapnik::CreateStatic>::mutex_); #endif boost::filesystem::path path(str); // TODO - only push unique paths plugin_directories_.push_back(str); boost::filesystem::directory_iterator end_itr; if (exists(path) && is_directory(path)) { for (boost::filesystem::directory_iterator itr(path);itr!=end_itr;++itr ) { #if (BOOST_FILESYSTEM_VERSION == 3) if (!is_directory( *itr ) && is_input_plugin(itr->path().filename().string())) #else // v2 if (!is_directory( *itr ) && is_input_plugin(itr->path().leaf())) #endif { #if (BOOST_FILESYSTEM_VERSION == 3) if (register_datasource(itr->path().string().c_str())) #else // v2 if (register_datasource(itr->string().c_str())) #endif { registered_ = true; } } } } }
void datasource_cache::register_datasources(std::string const& str) { #ifdef MAPNIK_THREADSAFE mapnik::scoped_lock lock(mutex_); #endif plugin_directories_.insert(str); if (mapnik::util::exists(str) && mapnik::util::is_directory(str)) { boost::filesystem::directory_iterator end_itr; for (boost::filesystem::directory_iterator itr(str); itr != end_itr; ++itr ) { #if (BOOST_FILESYSTEM_VERSION == 3) if (!boost::filesystem::is_directory(*itr) && is_input_plugin(itr->path().filename().string())) #else // v2 if (!boost::filesystem::is_directory(*itr) && is_input_plugin(itr->path().leaf())) #endif { #if (BOOST_FILESYSTEM_VERSION == 3) if (register_datasource(itr->path().string())) #else // v2 if (register_datasource(itr->string())) #endif { registered_ = true; } } } } }
bool datasource_cache::register_datasources(std::string const& dir, bool recurse) { #ifdef MAPNIK_THREADSAFE mapnik::scoped_lock lock(mutex_); #endif if (!mapnik::util::exists(dir)) { return false; } plugin_directories_.insert(dir); if (!mapnik::util::is_directory(dir)) { return register_datasource(dir); } bool success = false; try { boost::filesystem::directory_iterator end_itr; #ifdef _WINDOWS std::wstring wide_dir(mapnik::utf8_to_utf16(dir)); for (boost::filesystem::directory_iterator itr(wide_dir); itr != end_itr; ++itr) { std::string file_name = mapnik::utf16_to_utf8(itr->path().wstring()); #else for (boost::filesystem::directory_iterator itr(dir); itr != end_itr; ++itr) { std::string file_name = itr->path().string(); #endif if (boost::filesystem::is_directory(*itr) && recurse) { if (register_datasources(file_name, true)) { success = true; } } else { std::string base_name = itr->path().filename().string(); if (!boost::algorithm::starts_with(base_name,".") && mapnik::util::is_regular_file(file_name) && is_input_plugin(file_name)) { if (register_datasource(file_name)) { success = true; } } } } } catch (std::exception const& ex) { MAPNIK_LOG_ERROR(datasource_cache) << "register_datasources: " << ex.what(); } return success; }
bool datasource_cache::register_datasources(std::string const& dir, bool recurse) { #ifdef MAPNIK_THREADSAFE std::lock_guard<std::recursive_mutex> lock(instance_mutex_); #endif if (!mapnik::util::exists(dir)) { return false; } plugin_directories_.insert(dir); if (!mapnik::util::is_directory(dir)) { return register_datasource(dir); } bool success = false; try { for (std::string const& file_name : mapnik::util::list_directory(dir)) { if (mapnik::util::is_directory(file_name) && recurse) { if (register_datasources(file_name, true)) { success = true; } } else { std::string base_name = mapnik::util::basename(file_name); if (!boost::algorithm::starts_with(base_name,".") && mapnik::util::is_regular_file(file_name) && is_input_plugin(file_name)) { if (register_datasource(file_name)) { success = true; } } } } } catch (std::exception const& ex) { MAPNIK_LOG_ERROR(datasource_cache) << "register_datasources: " << ex.what(); } return success; }
void datasource_cache::register_datasources(const std::string& str) { #ifdef MAPNIK_THREADSAFE mutex::scoped_lock lock(mapnik::singleton<mapnik::datasource_cache, mapnik::CreateStatic>::mutex_); #endif boost::filesystem::path path(str); plugin_directories_.push_back(str); boost::filesystem::directory_iterator end_itr; if (exists(path) && is_directory(path)) { for (boost::filesystem::directory_iterator itr(path);itr!=end_itr;++itr ) { #if BOOST_VERSION < 103400 if (!is_directory( *itr ) && is_input_plugin(itr->leaf())) #else #if (BOOST_FILESYSTEM_VERSION == 3) if (!is_directory( *itr ) && is_input_plugin(itr->path().filename().string())) #else // v2 if (!is_directory( *itr ) && is_input_plugin(itr->path().leaf())) #endif #endif { try { #ifdef LIBTOOL_SUPPORTS_ADVISE /* Note: the below was added as a workaround pre http://trac.mapnik.org/ticket/790 It could now be removed, but also is not doing any harm AFAICT. */ // with ltdl >=2.2 we can actually pass RTDL_GLOBAL to dlopen via the // ltdl advise trick which is required on linux unless plugins are directly // linked to libmapnik (and deps) at build time. The only other approach is to // set the dlopen flags in the calling process (like in the python bindings) // clear errors lt_dlerror(); lt_dlhandle module = 0; lt_dladvise advise; int ret; ret = lt_dlinit(); if (ret != 0) { std::clog << "Datasource loader: could not intialize dynamic loading: " << lt_dlerror() << "\n"; } ret = lt_dladvise_init(&advise); if (ret != 0) { std::clog << "Datasource loader: could not intialize dynamic loading: " << lt_dlerror() << "\n"; } ret = lt_dladvise_global(&advise); if (ret != 0) { std::clog << "Datasource loader: could not intialize dynamic loading of global symbols: " << lt_dlerror() << "\n"; } #if (BOOST_FILESYSTEM_VERSION == 3) module = lt_dlopenadvise (itr->path().string().c_str(), advise); #else // v2 module = lt_dlopenadvise (itr->string().c_str(), advise); #endif lt_dladvise_destroy(&advise); #else #if (BOOST_FILESYSTEM_VERSION == 3) lt_dlhandle module = lt_dlopen(itr->path().string().c_str()); #else // v2 lt_dlhandle module = lt_dlopen(itr->string().c_str()); #endif #endif if (module) { // http://www.mr-edd.co.uk/blog/supressing_gcc_warnings #ifdef __GNUC__ __extension__ #endif datasource_name* ds_name = reinterpret_cast<datasource_name*>(lt_dlsym(module, "datasource_name")); if (ds_name && insert(ds_name(),module)) { #ifdef MAPNIK_DEBUG std::clog << "Datasource loader: registered: " << ds_name() << std::endl; #endif registered_=true; } } else { #if (BOOST_FILESYSTEM_VERSION == 3) std::clog << "Problem loading plugin library: " << itr->path().string() << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)" << std::endl; #else // v2 std::clog << "Problem loading plugin library: " << itr->string() << " (dlopen failed - plugin likely has an unsatisfied dependency or incompatible ABI)" << std::endl; #endif } } catch (...) {} } } } }