diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 4e12dca5..ca06b68b 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1528,7 +1528,9 @@ static void gotAttention(PurpleAccount *account, const char *who, PurpleConversa static bool initPurple() { bool ret; - if (!resolvePurpleFunctions()) { + std::string libPurpleDllPath = CONFIG_STRING_DEFAULTED(config, "purple.libpurple_dll_path", ""); + + if (!resolvePurpleFunctions(libPurpleDllPath)) { LOG4CXX_ERROR(logger, "Unable to load libpurple.dll or some of the needed methods"); return false; } @@ -1538,7 +1540,7 @@ static bool initPurple() { purple_plugins_add_search_path_wrapped(pluginsDir.c_str()); std::string cacertsDir = CONFIG_STRING_DEFAULTED(config, "purple.cacerts_dir", "./ca-certs"); - LOG4CXX_INFO(logger, "Setting libpurple plugins directory to: " << cacertsDir); + LOG4CXX_INFO(logger, "Setting libpurple cacerts directory to: " << cacertsDir); purple_certificate_add_ca_search_path_wrapped(cacertsDir.c_str()); std::string userDir = CONFIG_STRING_DEFAULTED(config, "service.working_dir", "./"); diff --git a/backends/libpurple/purple_defs.cpp b/backends/libpurple/purple_defs.cpp index 4546ff07..98f88412 100644 --- a/backends/libpurple/purple_defs.cpp +++ b/backends/libpurple/purple_defs.cpp @@ -138,9 +138,19 @@ purple_account_option_get_type_wrapped_fnc purple_account_option_get_type_wrappe purple_account_option_get_setting_wrapped_fnc purple_account_option_get_setting_wrapped = NULL; wpurple_g_io_channel_win32_new_socket_wrapped_fnc wpurple_g_io_channel_win32_new_socket_wrapped = NULL; #endif -bool resolvePurpleFunctions() { +bool resolvePurpleFunctions(const std::string& libPurpleDllPath) { #if PURPLE_RUNTIME - f_hPurple = LoadLibrary(L"libpurple.dll"); + wstring dllPath; + if (!libPurpleDllPath.empty()) + { + dllPath = utf8ToUtf16(libPurpleDllPath); + } + else + { + // No path was specified, so try loading libpurple from the current working directory + dllPath = L"libpurple.dll"; + } + f_hPurple = LoadLibrary(dllPath.c_str()); if (!f_hPurple) return false; purple_debug_set_ui_ops_wrapped = (purple_debug_set_ui_ops_wrapped_fnc)GetProcAddress(f_hPurple, "purple_debug_set_ui_ops"); diff --git a/backends/libpurple/purple_defs.h b/backends/libpurple/purple_defs.h index ba1745a3..4d740d8c 100644 --- a/backends/libpurple/purple_defs.h +++ b/backends/libpurple/purple_defs.h @@ -1,4 +1,6 @@ #pragma once +#include + #if PURPLE_RUNTIME #include @@ -570,5 +572,5 @@ extern wpurple_g_io_channel_win32_new_socket_wrapped_fnc wpurple_g_io_channel_wi #define wpurple_g_io_channel_win32_new_socket_wrapped wpurple_g_io_channel_win32_new_socket #endif -bool resolvePurpleFunctions(); +bool resolvePurpleFunctions(const std::string& libPurpleDllPath); diff --git a/src/config.cpp b/src/config.cpp index 234ed5cf..23c3656d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -138,6 +138,11 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description if (m_argc != 0 && m_argv) { basic_command_line_parser parser = command_line_parser(m_argc, m_argv).options(opts).allow_unregistered(); parsed_options parsed = parser.run(); + BOOST_FOREACH(option &opt, parsed.options) { + if (opt.unregistered && !opt.value.empty()) { + m_unregistered[opt.string_key] = variable_value(opt.value[0], false); + } + } store(parsed, m_variables); }