From fd7d0e4167a51c79ead11983aede83d567423929 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 17:10:50 +0200 Subject: [PATCH 1/9] set PURPLE_RUNTIME before trying to detect libpurple --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07aaf651..114f8877 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,10 +49,6 @@ endif() set(mysql_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") find_package(mysql) -# FIND LIBPURPLE -set(purple_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") -find_package(purple) - if (WIN32) if (PURPLE_NOT_RUNTIME) add_definitions(-DPURPLE_RUNTIME=0) @@ -63,6 +59,10 @@ else() add_definitions(-DPURPLE_RUNTIME=0) endif() +# FIND LIBPURPLE +set(purple_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") +find_package(purple) + # FIND GLIB # if (GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) # set(GLIB2_FOUND TRUE) From 22e561bb728aca8b110c2e9978d5372eb4d51585 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 17:11:45 +0200 Subject: [PATCH 2/9] set PURPLE_RUNTIME before trying to detect libpurple --- CMakeLists.txt | 8 ++++---- cmake_modules/purpleConfig.cmake | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 114f8877..07aaf651 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,10 @@ endif() set(mysql_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") find_package(mysql) +# FIND LIBPURPLE +set(purple_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") +find_package(purple) + if (WIN32) if (PURPLE_NOT_RUNTIME) add_definitions(-DPURPLE_RUNTIME=0) @@ -59,10 +63,6 @@ else() add_definitions(-DPURPLE_RUNTIME=0) endif() -# FIND LIBPURPLE -set(purple_DIR "${CMAKE_SOURCE_DIR}/cmake_modules") -find_package(purple) - # FIND GLIB # if (GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) # set(GLIB2_FOUND TRUE) diff --git a/cmake_modules/purpleConfig.cmake b/cmake_modules/purpleConfig.cmake index 72ff99fd..cb2341ec 100644 --- a/cmake_modules/purpleConfig.cmake +++ b/cmake_modules/purpleConfig.cmake @@ -2,7 +2,7 @@ FIND_LIBRARY(PURPLE_LIBRARY NAMES purple) FIND_PATH(PURPLE_INCLUDE_DIR NAMES "purple.h" PATH_SUFFIXES libpurple ) if(WIN32 AND PURPLE_INCLUDE_DIR ) - if (PURPLE_NOT_RUNTIME) + if (NOT PURPLE_NOT_RUNTIME) set(PURPLE_LIBRARY "") endif(PURPLE_NOT_RUNTIME) set(PURPLE_FOUND 1) From 84b78f1333b7c749e16a0f154416d98d8c5c2f3b Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 17:12:34 +0200 Subject: [PATCH 3/9] set PURPLE_RUNTIME before trying to detect libpurple --- cmake_modules/purpleConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_modules/purpleConfig.cmake b/cmake_modules/purpleConfig.cmake index cb2341ec..96f58a19 100644 --- a/cmake_modules/purpleConfig.cmake +++ b/cmake_modules/purpleConfig.cmake @@ -4,7 +4,7 @@ FIND_PATH(PURPLE_INCLUDE_DIR NAMES "purple.h" PATH_SUFFIXES libpurple ) if(WIN32 AND PURPLE_INCLUDE_DIR ) if (NOT PURPLE_NOT_RUNTIME) set(PURPLE_LIBRARY "") - endif(PURPLE_NOT_RUNTIME) + endif(NOT PURPLE_NOT_RUNTIME) set(PURPLE_FOUND 1) message(STATUS "Using purple: ${PURPLE_INCLUDE_DIR} ${PURPLE_LIBRARY}") else() From 4a88d77154487ebae4c5fd1806a8e074148df23c Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 17:52:41 +0200 Subject: [PATCH 4/9] Allow unregistered options to be passed by command line --- backends/libpurple/main.cpp | 6 ++++-- backends/libpurple/purple_defs.cpp | 14 ++++++++++++-- backends/libpurple/purple_defs.h | 4 +++- src/config.cpp | 5 +++++ 4 files changed, 24 insertions(+), 5 deletions(-) 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); } From 89d27e6aed820a72db8bda11f4875ccfaf86e9df Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 17:56:49 +0200 Subject: [PATCH 5/9] std::wstring --- backends/libpurple/purple_defs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/libpurple/purple_defs.cpp b/backends/libpurple/purple_defs.cpp index 98f88412..206f2814 100644 --- a/backends/libpurple/purple_defs.cpp +++ b/backends/libpurple/purple_defs.cpp @@ -140,7 +140,7 @@ wpurple_g_io_channel_win32_new_socket_wrapped_fnc wpurple_g_io_channel_win32_new #endif bool resolvePurpleFunctions(const std::string& libPurpleDllPath) { #if PURPLE_RUNTIME - wstring dllPath; + std::wstring dllPath; if (!libPurpleDllPath.empty()) { dllPath = utf8ToUtf16(libPurpleDllPath); From 9273178924af07d205d67dd248a668acb3c64457 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 17:59:46 +0200 Subject: [PATCH 6/9] include utils.h --- backends/libpurple/purple_defs.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/purple_defs.cpp b/backends/libpurple/purple_defs.cpp index 206f2814..3ceb7499 100644 --- a/backends/libpurple/purple_defs.cpp +++ b/backends/libpurple/purple_defs.cpp @@ -1,6 +1,10 @@ #include "purple_defs.h" - #if PURPLE_RUNTIME +#include "utils.h" + +using std::string; +using std::wstring; + static HMODULE f_hPurple = NULL; purple_debug_set_ui_ops_wrapped_fnc purple_debug_set_ui_ops_wrapped = NULL; purple_debug_set_verbose_wrapped_fnc purple_debug_set_verbose_wrapped = NULL; From 51481c8c44c807d8cd447ff97272c28d880282c8 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 18:03:21 +0200 Subject: [PATCH 7/9] use Transport::Util in purple_defs --- backends/libpurple/purple_defs.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/purple_defs.cpp b/backends/libpurple/purple_defs.cpp index 3ceb7499..d21e3217 100644 --- a/backends/libpurple/purple_defs.cpp +++ b/backends/libpurple/purple_defs.cpp @@ -1,6 +1,9 @@ #include "purple_defs.h" +#include "transport/util.h" + +using namespace Transport::Util; + #if PURPLE_RUNTIME -#include "utils.h" using std::string; using std::wstring; From 31fb1af807d319f0dba68d2695cc1f38d3aa6fb5 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 18:06:33 +0200 Subject: [PATCH 8/9] include utils.h --- backends/libpurple/purple_defs.cpp | 4 +--- backends/libpurple/utils.cpp | 31 ++++++++++++++++++++++++++++++ backends/libpurple/utils.h | 4 ++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/purple_defs.cpp b/backends/libpurple/purple_defs.cpp index d21e3217..bca0c2ff 100644 --- a/backends/libpurple/purple_defs.cpp +++ b/backends/libpurple/purple_defs.cpp @@ -1,7 +1,5 @@ #include "purple_defs.h" -#include "transport/util.h" - -using namespace Transport::Util; +#include "utils.h" #if PURPLE_RUNTIME diff --git a/backends/libpurple/utils.cpp b/backends/libpurple/utils.cpp index 4cb02509..5269e4eb 100644 --- a/backends/libpurple/utils.cpp +++ b/backends/libpurple/utils.cpp @@ -156,3 +156,34 @@ int create_socket(const char *host, int portno) { // fcntl(main_socket, F_SETFL, flags); return main_socket; } + +#ifdef _WIN32 +std::wstring utf8ToUtf16(const std::string& str) +{ + try + { + if (str.empty()) + return L""; + + // First request the size of the required UTF-16 buffer + int numRequiredBytes = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), boost::numeric_cast(str.size()), NULL, 0); + if (!numRequiredBytes) + return L""; + + // Allocate memory for the UTF-16 string + std::vector utf16Str(numRequiredBytes); + + int numConverted = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), boost::numeric_cast(str.size()), &utf16Str[0], numRequiredBytes); + if (!numConverted) + return L""; + + std::wstring wstr(&utf16Str[0], numConverted); + return wstr; + } + catch (...) + { + // I don't believe libtransport is exception-safe so we'll just return an empty string instead + return L""; + } +} +#endif // _WIN32 diff --git a/backends/libpurple/utils.h b/backends/libpurple/utils.h index 956b86f6..8324f46a 100644 --- a/backends/libpurple/utils.h +++ b/backends/libpurple/utils.h @@ -31,3 +31,7 @@ int create_socket(const char *host, int portno); GHashTable *spectrum_ui_get_info(void); void execute_purple_plugin_action(PurpleConnection *gc, const std::string &name); + +#ifdef _WIN32 + std::wstring utf8ToUtf16(const std::string& str); +#endif From 363815c8a8ff5209a59d09f8cf99b1a5b83739fa Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 5 Sep 2012 18:11:34 +0200 Subject: [PATCH 9/9] include utils.h --- backends/libpurple/utils.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backends/libpurple/utils.cpp b/backends/libpurple/utils.cpp index 5269e4eb..7b935e35 100644 --- a/backends/libpurple/utils.cpp +++ b/backends/libpurple/utils.cpp @@ -28,6 +28,7 @@ #include "purple.h" #include #include +#include #include "errno.h" @@ -54,6 +55,10 @@ #include "purple_defs.h" +#include + +using std::vector; + static GHashTable *ui_info = NULL; void execute_purple_plugin_action(PurpleConnection *gc, const std::string &name) {