Changeset - deeafae6f037
[Not reviewed]
skypeweb_ts
0 7 0
Vitaly Takmazov - 7 years ago 2018-11-06 17:39:41
vitalyster@gmail.com
libpurple: store last_message_timestamp from skypeweb account into database
7 files changed with 126 insertions and 14 deletions:
0 comments (0 inline, 0 general)
CMakeLists.txt
Show inline comments
 
cmake_minimum_required(VERSION 2.6)
 
cmake_minimum_required(VERSION 3.0)
 
project(libtransport)
 
if(${CMAKE_MAJOR_VERSION} GREATER 2)
 
cmake_policy(SET CMP0037 OLD)
 
endif()
 
cmake_policy(SET CMP0042 NEW)
 
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
 
include(CPack)
 
message(STATUS "Variables to override default places where to find libraries:")
 
message(STATUS "|- cppunit : -DCPPUNIT_INCLUDE_DIR,  -DCPPUNIT_LIBRARY")
 
message(STATUS "|- swiften : -DSWIFTEN_INCLUDE_DIR,  -DSWIFTEN_LIBRARY")
 
message(STATUS "  |- zlib  :                         -DZLIB_LIBRARY")
 
message(STATUS "  |- expat :                         -DEXPAT_LIBRARY")
 
message(STATUS "  |-libidn :                         -DLIBIDN_LIBRARY")
 
message(STATUS "  |-libxml :                         -DLIBXML_LIBRARY")
 
message(STATUS "|- boost   : -DBOOST_INCLUDEDIR,     -DBOOST_LIBRARYDIR")
 
message(STATUS "|- protobuf: -DPROTOBUF_INCLUDE_DIR, -DPROTOBUF_LIBRARY")
 
message(STATUS "           : -DPROTOBUF_PROTOC_EXECUTABLE")
 
message(STATUS "|- log4cxx : -DLOG4CXX_INCLUDE_DIR,  -DLOG4CXX_LIBRARY")
 
message(STATUS "|- purple  : -DPURPLE_INCLUDE_DIR,   -DPURPLE_LIBRARY")
 
message(STATUS "           : -DPURPLE_NOT_RUNTIME - enables compilation with libpurple.lib")
 

	
 
option(ENABLE_SQLITE3 "Build with SQLite3 support" ON)
 
option(ENABLE_MYSQL "Build with MySQL support" ON)
 
option(ENABLE_PQXX "Build with Postgres supoort" ON)
 

	
 
option(ENABLE_FROTZ "Build Frotz plugin" ON)
 
option(ENABLE_IRC "Build IRC plugin" ON)
 
option(ENABLE_PURPLE "Build Libpurple plugin" ON)
 
option(ENABLE_SMSTOOLS3 "Build SMSTools3 plugin" ON)
 
option(ENABLE_XMPP "Build XMPP plugin" ON)
 
option(ENABLE_TWITTER "Build Twitter plugin" ON)
 

	
 
option(ENABLE_DOCS "Build Docs" ON)
 
# option(ENABLE_LOG "Build with logging using Log4cxx" ON)
 
option(ENABLE_TESTS "Build Tests using CppUnit" OFF)
 

	
 
MACRO(LIST_CONTAINS var value)
 
	SET(${var})
 
	FOREACH (value2 ${ARGN})
 
		IF (${value} STREQUAL ${value2})
 
		SET(${var} TRUE)
 
		ENDIF (${value} STREQUAL ${value2})
 
	ENDFOREACH (value2)
 
ENDMACRO(LIST_CONTAINS)
 

	
 
if(NOT LIB_INSTALL_DIR)
 
	set(LIB_INSTALL_DIR "lib")
 
endif()
 

	
 
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules")
 

	
 
###### Prerequisites ######
 

	
 

	
 
# FIND SWIFTEN
 

	
 
find_package(Swiften)
 

	
 
if(NOT SWIFTEN_FOUND)
 
	if (ZLIB_LIBRARY)
 
		set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} ${ZLIB_LIBRARY})
 
	endif()
 
	if (EXPAT_LIBRARY)
 
		set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} ${EXPAT_LIBRARY})
 
	endif()
 
	if (LIBIDN_LIBRARY)
 
		set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} ${LIBIDN_LIBRARY})
 
	endif()
 
	if (LIBXML_LIBRARY)
 
		set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} ${LIBXML_LIBRARY})
 
	endif()
 
	set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} "Dnsapi")
 
	set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} "Crypt32")
 
	set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} "Secur32")
 
	set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} "Iphlpapi")
 
	set(SWIFTEN_LIBRARY ${SWIFTEN_LIBRARY} "Winscard")
 
	message(STATUS "XXXUsing swiften: ${SWIFTEN_INCLUDE_DIR} ${SWIFTEN_LIBRARY}
 
	Version: ${SWIFTEN_VERSION}")
 
endif()
 

	
 
# FIND BOOST
 
if (WIN32)
 
	set(Boost_USE_STATIC_LIBS      OFF)
 
	set(Boost_USE_MULTITHREADED      ON)
 
	set(Boost_USE_STATIC_RUNTIME    OFF)
 
	add_definitions(-DBOOST_ALL_DYN_LINK)
 
	add_definitions(-DBOOST_ALL_NO_LIB)
 
endif(WIN32)
 
	set(Boost_FIND_QUIETLY ON)
 
	find_package(Boost COMPONENTS program_options date_time system filesystem regex thread signals locale REQUIRED)
 

	
 
message( STATUS "Found Boost: ${Boost_VERSION}, ${Boost_LIBRARIES}, ${Boost_INCLUDE_DIR}")
 

	
 
if (${Boost_VERSION} GREATER 104999)
 
	message( STATUS "Using BOOST_FILESYSTEM_VERSION=3")
 
	add_definitions(-DBOOST_FILESYSTEM_VERSION=3)
 
endif()
 

	
 
# FIND POPT
 
if (NOT WIN32)
 
	find_package(popt REQUIRED)
 
endif()
 

	
 
###### Database ######
 

	
 
# FIND SQLITE3
 
if (ENABLE_SQLITE3)
 
	find_package(sqlite3)
 
endif()
 

	
 
# FIND MYSQL
 
if(ENABLE_MYSQL)
 
	find_package(mysql)
 
endif()
 

	
 
# FIND PQXX
 
if(ENABLE_PQXX)
 
	find_package(pqxx)
 
endif()
 

	
 
###### Plugins ######
 

	
 
# FIND LIBPURPLE
 
if(ENABLE_PURPLE)
 
	find_package(purple)
 

	
 
	if (WIN32)
 
		if (PURPLE_NOT_RUNTIME)
 
			add_definitions(-DPURPLE_RUNTIME=0)
 
		else(PURPLE_NOT_RUNTIME)
 
			add_definitions(-DPURPLE_RUNTIME=1)
 
		endif(PURPLE_NOT_RUNTIME)
 
	else()
 
		add_definitions(-DPURPLE_RUNTIME=0)
 
	endif()
 

	
 
	# FIND LIBEVENT
 
	find_package(event)
 
endif()
 

	
 
# FIND GLIB
 
if(ENABLE_PURPLE)
 
#	if (GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES)
 
#		set(GLIB2_FOUND TRUE)
 
#	else()
 
		find_package(glib)
 
#	endif()
 
endif()
 

	
 
# FIND LIBXML2
 
# find_package(libxml2)
 

	
 
# FIND PROTOBUF
 
find_package(Protobuf REQUIRED)
 

	
 
if (NOT PROTOBUF_FOUND AND PROTOBUF_INCLUDE_DIR AND PROTOBUF_LIBRARY)
 
	set(PROTOBUF_FOUND 1)
 
	set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR})
 
	if (PROTOBUF_PROTOC_EXECUTABLE)
 
	else()
 
		set(PROTOBUF_PROTOC_EXECUTABLE protoc)
 
	endif()
 
	message(STATUS "Using protobuf: ${PROTOBUF_INCLUDE_DIRS} ${PROTOBUF_LIBRARY}")
 
endif()
 

	
 
find_package(jsoncpp REQUIRED)
 
include_directories(${JSONCPP_INCLUDE_DIRS})
 

	
 
if (WIN32)
 
	add_definitions(-DSWIFTEN_STATIC=1)
 
	ADD_DEFINITIONS(-D_WIN32_WINNT=0x0600)
 
	ADD_DEFINITIONS(-DWIN32_LEAN_AND_MEAN)
 
	ADD_DEFINITIONS(-DBOOST_USE_WINDOWS_H)
 
	ADD_DEFINITIONS(-D_UNICODE)
 
	ADD_DEFINITIONS(-DUNICODE)
 
endif()
 

	
 

	
 
if (CMAKE_COMPILER_IS_GNUCXX)
 
find_package(openssl)
 
endif()
 

	
 
if(ENABLE_IRC)
 
	find_package(Communi)
 

	
 
	INCLUDE(FindQt4)
 
	FIND_PACKAGE(Qt4 COMPONENTS QtCore QtNetwork)
 
	# ADD_DEFINITIONS(${SWIFTEN_CFLAGS})
 
	ADD_DEFINITIONS(-DSUPPORT_LEGACY_CAPS)
 
	# ADD_DEFINITIONS(-DBOOST_FILESYSTEM_VERSION=2)
 
endif()
 

	
 
find_package(event)
 

	
 

	
 
####### Miscallanous ######
 

	
 
if(ENABLE_DOCS)
backends/libpurple/main.cpp
Show inline comments
 
@@ -3,671 +3,675 @@
 
#include "glib.h"
 

	
 
// win32/libc_interface.h defines its own socket(), read() and so on.
 
// We don't want to use it here.
 
#define _LIBC_INTERFACE_H_ 1
 

	
 
#include "purple.h"
 
#include <algorithm>
 
#include <iostream>
 
#include <fstream>
 

	
 
#include "transport/NetworkPlugin.h"
 
#include "transport/Logging.h"
 
#include "transport/Config.h"
 
#include "transport/StorageBackend.h"
 
#include "geventloop.h"
 
#include "Swiften/SwiftenCompat.h"
 

	
 
// #include "valgrind/memcheck.h"
 
#if !defined(__FreeBSD__) && !defined(__APPLE__)
 
#include "malloc.h"
 
#endif
 
#include "errno.h"
 
#include <boost/make_shared.hpp>
 
#include <boost/locale.hpp>
 
#include <boost/locale/conversion.hpp>
 
#include <boost/thread/mutex.hpp>
 

	
 
#ifdef WITH_LIBEVENT
 
#include <event.h>
 
#endif
 

	
 
#ifdef WIN32
 
#include "win32/win32dep.h"
 
#define close closesocket
 
#define ssize_t SSIZE_T
 
#include <process.h>
 
#define getpid _getpid
 
#endif
 

	
 
#include "purple_defs.h"
 

	
 
DEFINE_LOGGER(logger_libpurple, "libpurple");
 
DEFINE_LOGGER(logger, "backend");
 

	
 
/* Additional PURPLE_MESSAGE_* flags as a hack to track the origin of the message. */
 
typedef enum {
 
    PURPLE_MESSAGE_SPECTRUM2_ORIGINATED = 0x80000000,
 
} PurpleMessageSpectrum2Flags;
 

	
 
int main_socket;
 
static int writeInput;
 
bool firstPing = true;
 

	
 
using namespace Transport;
 

	
 
template <class T> T fromString(const std::string &str) {
 
	T i;
 
	std::istringstream os(str);
 
	os >> i;
 
	return i;
 
}
 

	
 
template <class T> std::string stringOf(T object) {
 
	std::ostringstream os;
 
	os << object;
 
	return (os.str());
 
}
 

	
 
static std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
 
    std::stringstream ss(s);
 
    std::string item;
 
    while(std::getline(ss, item, delim)) {
 
        elems.push_back(item);
 
    }
 
    return elems;
 
}
 

	
 

	
 
static std::vector<std::string> split(const std::string &s, char delim) {
 
    std::vector<std::string> elems;
 
    return split(s, delim, elems);
 
}
 

	
 
static void transportDataReceived(gpointer data, gint source, PurpleInputCondition cond);
 

	
 
class SpectrumNetworkPlugin;
 

	
 
SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<Config> config;
 
SpectrumNetworkPlugin *np;
 
StorageBackend *storagebackend;
 

	
 
static std::string host;
 
static int port = 10000;
 

	
 
struct FTData {
 
	unsigned long id;
 
	unsigned long timer;
 
	bool paused;
 
};
 

	
 
struct NodeCache {
 
	PurpleAccount *account;
 
	std::map<PurpleBlistNode *, int> nodes;
 
	int timer;
 
};
 

	
 
bool caching = true;
 

	
 
static void *notify_user_info(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info);
 

	
 
static gboolean ft_ui_ready(void *data) {
 
	PurpleXfer *xfer = (PurpleXfer *) data;
 
	FTData *ftdata = (FTData *) xfer->ui_data;
 
	ftdata->timer = 0;
 
	purple_xfer_ui_ready_wrapped((PurpleXfer *) data);
 
	return FALSE;
 
}
 

	
 
struct authRequest {
 
	PurpleAccountRequestAuthorizationCb authorize_cb;
 
	PurpleAccountRequestAuthorizationCb deny_cb;
 
	void *user_data;
 
	std::string who;
 
	PurpleAccount *account;
 
	std::string mainJID;	// JID of user connected with this request
 
};
 

	
 
struct inputRequest {
 
    PurpleRequestInputCb ok_cb;
 
    void *user_data;
 
    std::string who;
 
    PurpleAccount *account;
 
    std::string mainJID;	// JID of user connected with this request
 
};
 

	
 
static void *requestAction(const char *title, const char *primary, const char *secondary, int default_action, PurpleAccount *account, const char *who,PurpleConversation *conv, void *user_data, size_t action_count, va_list actions){
 
	std::string t(title ? title : "NULL");
 
	if (t == "SSL Certificate Verification") {
 
		if (CONFIG_BOOL_DEFAULTED(config, "service.verify_certs", false)) {
 
			LOG4CXX_INFO(logger,  "rejecting SSL certificate");
 
			va_arg(actions, char *);
 
			va_arg(actions, GCallback);
 
		} else {
 
			LOG4CXX_INFO(logger,  "accepting SSL certificate");
 
		}
 
		va_arg(actions, char *);
 
		((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
 
	}
 
	else if (t == "Plaintext Authentication") {
 
		LOG4CXX_INFO(logger,  "Rejecting plaintext authentification");
 
		va_arg(actions, char *);
 
		va_arg(actions, GCallback);
 
		va_arg(actions, char *);
 
		((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
 
	}
 
	else {
 
		if (title) {
 
			std::string headerString(title);
 
			LOG4CXX_INFO(logger,  "header string: " << headerString);
 
			if (headerString == "SSL Certificate Verification") {
 
				if (CONFIG_BOOL_DEFAULTED(config, "service.verify_certs", false)) {
 
					va_arg(actions, char *);
 
					va_arg(actions, GCallback);
 
				}
 
				va_arg(actions, char *);
 
				((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
 
			}
 
		}
 
	}
 
	return NULL;
 
}
 

	
 
static std::string getAlias(PurpleBuddy *m_buddy) {
 
	std::string alias;
 
	PurpleContact *contact = PURPLE_CONTACT(PURPLE_BLIST_NODE(m_buddy)->parent);
 
	if (contact && contact->alias) {
 
		alias = contact->alias;
 
	}
 
	else if (purple_buddy_get_alias_wrapped(m_buddy)) {
 
		alias = (std::string) purple_buddy_get_alias_wrapped(m_buddy);
 
	}
 
	else {
 
		alias = (std::string) purple_buddy_get_server_alias_wrapped(m_buddy);
 
	}
 
	return alias;
 
}
 

	
 
static boost::mutex dblock;
 
static std::string OAUTH_TOKEN = "hangouts_oauth_token";
 
static std::string STEAM_ACCESS_TOKEN = "steammobile_access_token";
 
static std::string DISCORD_ACCESS_TOKEN = "discord_access_token";
 
static std::string LAST_MESSAGE_TIMESTAMP = "skypeweb_last_message_timestamp";
 

	
 
static bool getUserToken(const std::string user, const std::string token_name, std::string &token_value)
 
{
 
	boost::mutex::scoped_lock lock(dblock);
 
	UserInfo info;
 
	if(storagebackend->getUser(user, info) == false) {
 
		LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
		return false;
 
	}
 
	token_value = "";
 
	int type = TYPE_STRING;
 
	storagebackend->getUserSetting((long)info.id, token_name, type, token_value);
 
	return true;
 
}
 

	
 
static bool storeUserToken(const std::string user, const std::string token_name, const std::string token_value)
 
{
 
	boost::mutex::scoped_lock lock(dblock);
 
	UserInfo info;
 
	if(storagebackend->getUser(user, info) == false) {
 
		LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
		return false;
 
	}
 
	storagebackend->updateUserSetting((long)info.id, token_name, token_value);
 
	return true;
 
}
 

	
 
class SpectrumNetworkPlugin : public NetworkPlugin {
 
	public:
 
		SpectrumNetworkPlugin() : NetworkPlugin() {
 
			LOG4CXX_INFO(logger, "Starting libpurple backend " << SPECTRUM_VERSION);
 
		}
 

	
 
		void handleExitRequest() {
 
			LOG4CXX_INFO(logger, "Exiting...");
 
			exit(0);
 
		}
 

	
 
		void getProtocolAndName(const std::string &legacyName, std::string &name, std::string &protocol) {
 
			name = legacyName;
 
			protocol = CONFIG_STRING(config, "service.protocol");
 
			if (protocol == "any") {
 
				protocol = name.substr(0, name.find("."));
 
				name = name.substr(name.find(".") + 1);
 
			}
 
		}
 

	
 
		void setDefaultAvatar(PurpleAccount *account, const std::string &legacyName) {
 
			char* contents;
 
			gsize length;
 
			gboolean ret = false;
 
			if (!CONFIG_STRING(config, "backend.avatars_directory").empty()) {
 
				std::string f = CONFIG_STRING(config, "backend.avatars_directory") + "/" + legacyName;
 
				ret = g_file_get_contents (f.c_str(), &contents, &length, NULL);
 
			}
 

	
 
			if (!CONFIG_STRING(config, "backend.default_avatar").empty() && !ret) {
 
				ret = g_file_get_contents (CONFIG_STRING(config, "backend.default_avatar").c_str(),
 
											&contents, &length, NULL);
 
			}
 

	
 
			if (ret) {
 
				purple_buddy_icons_set_account_icon_wrapped(account, (guchar *) contents, length);
 
			}
 
		}
 

	
 
		void setDefaultAccountOptions(PurpleAccount *account) {
 
			int i = 0;
 
			Config::SectionValuesCont purpleConfigValues = config->getSectionValues("purple");
 

	
 
			BOOST_FOREACH ( const Config::SectionValuesCont::value_type & keyItem, purpleConfigValues )
 
			{
 
				std::string key = keyItem.first;
 
				std::string strippedKey = boost::erase_first_copy(key, "purple.");
 

	
 
				if (strippedKey == "fb_api_key" || strippedKey == "fb_api_secret") {
 
					purple_account_set_bool_wrapped(account, "auth_fb", TRUE);
 
 				}
 

	
 
				PurplePlugin *plugin = purple_find_prpl_wrapped(purple_account_get_protocol_id_wrapped(account));
 
				PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
 
				bool found = false;
 
				for (GList *l = prpl_info->protocol_options; l != NULL; l = l->next) {
 
					PurpleAccountOption *option = (PurpleAccountOption *) l->data;
 
					PurplePrefType type = purple_account_option_get_type_wrapped(option);
 
					std::string key2(purple_account_option_get_setting_wrapped(option));
 
					if (strippedKey != key2) {
 
						continue;
 
					}
 

	
 
					found = true;
 
					switch (type) {
 
						case PURPLE_PREF_BOOLEAN:
 
							purple_account_set_bool_wrapped(account, strippedKey.c_str(), keyItem.second.as<bool>());
 
							break;
 

	
 
						case PURPLE_PREF_INT:
 
							purple_account_set_int_wrapped(account, strippedKey.c_str(), fromString<int>(keyItem.second.as<std::string>()));
 
							break;
 

	
 
						case PURPLE_PREF_STRING:
 
						case PURPLE_PREF_STRING_LIST:
 
							purple_account_set_string_wrapped(account, strippedKey.c_str(), keyItem.second.as<std::string>().c_str());
 
							break;
 
						default:
 
							continue;
 
					}
 
					break;
 
				}
 

	
 
				if (!found) {
 
					purple_account_set_string_wrapped(account, strippedKey.c_str(), keyItem.second.as<std::string>().c_str());
 
				}
 
				i++;
 
			}
 

	
 
			char* contents;
 
			gsize length;
 
			gboolean ret = g_file_get_contents ("gfire.cfg", &contents, &length, NULL);
 
			if (ret) {
 
				purple_account_set_int_wrapped(account, "version", fromString<int>(std::string(contents, length)));
 
			}
 

	
 

	
 
			if (CONFIG_STRING(config, "service.protocol") == "prpl-novell") {
 
				std::string username(purple_account_get_username_wrapped(account));
 
				std::vector <std::string> u = split(username, '@');
 
				purple_account_set_username_wrapped(account, (const char*) u.front().c_str());
 
				std::vector <std::string> s = split(u.back(), ':');
 
				purple_account_set_string_wrapped(account, "server", s.front().c_str());
 
				purple_account_set_int_wrapped(account, "port", atoi(s.back().c_str()));
 
			}
 

	
 
			if (!CONFIG_STRING_DEFAULTED(config, "proxy.type", "").empty()) {
 
				PurpleProxyInfo *info = purple_proxy_info_new_wrapped();
 
				if (CONFIG_STRING_DEFAULTED(config, "proxy.type", "") == "http") {
 
					purple_proxy_info_set_type_wrapped(info, PURPLE_PROXY_HTTP);
 
				}
 
				else if (CONFIG_STRING_DEFAULTED(config, "proxy.type", "") == "socks4") {
 
					purple_proxy_info_set_type_wrapped(info, PURPLE_PROXY_SOCKS4);
 
				}
 
				else if (CONFIG_STRING_DEFAULTED(config, "proxy.type", "") == "socks5") {
 
					purple_proxy_info_set_type_wrapped(info, PURPLE_PROXY_SOCKS5);
 
				}
 
				else {
 
					LOG4CXX_ERROR(logger, "Unknown proxy.type " << CONFIG_STRING_DEFAULTED(config, "proxy.type", ""));
 
				}
 

	
 
				info->username = NULL;
 
				info->password = NULL;
 

	
 
				purple_proxy_info_set_type_wrapped(info, PURPLE_PROXY_SOCKS5);
 
				purple_proxy_info_set_host_wrapped(info, CONFIG_STRING_DEFAULTED(config, "proxy.host", "").c_str());
 
				if (CONFIG_INT_DEFAULTED(config, "proxy.port", 0)) {
 
					purple_proxy_info_set_port_wrapped(info, CONFIG_INT_DEFAULTED(config, "proxy.port", 0));
 
				}
 
				if (!CONFIG_STRING_DEFAULTED(config, "proxy.username", "").empty()) {
 
					purple_proxy_info_set_username_wrapped(info, CONFIG_STRING_DEFAULTED(config, "proxy.username", "").c_str());
 
				}
 

	
 
				if (!CONFIG_STRING_DEFAULTED(config, "proxy.password", "").empty()) {
 
					purple_proxy_info_set_password_wrapped(info, CONFIG_STRING_DEFAULTED(config, "proxy.password", "").c_str());
 
				}
 

	
 
				purple_account_set_proxy_info_wrapped(account, info);
 
			}
 
		}
 

	
 
		void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) {
 
			PurpleAccount *account = NULL;
 

	
 
			std::string name;
 
			std::string protocol;
 
			getProtocolAndName(legacyName, name, protocol);
 

	
 
			if (password.empty() && protocol != "prpl-telegram" && protocol != "prpl-hangouts") {
 
				LOG4CXX_INFO(logger,  name.c_str() << ": Empty password");
 
				np->handleDisconnected(user, 1, "Empty password.");
 
				return;
 
			}
 
			if (protocol == "prpl-hangouts") {
 
				adminLegacyName = "hangouts";
 
				adminAlias = "hangouts";
 
			}
 
			else if (protocol == "prpl-steam-mobile") {
 
				adminLegacyName = "steam-mobile";
 
				adminAlias = "steam-mobile";
 
			}
 
            else if (protocol == "prpl-eionrobb-discord") {
 
                adminLegacyName = "discord";
 
                adminAlias = "discord";
 
            }
 

	
 
			if (!purple_find_prpl_wrapped(protocol.c_str())) {
 
				LOG4CXX_INFO(logger,  name.c_str() << ": Invalid protocol '" << protocol << "'");
 
				np->handleDisconnected(user, 1, "Invalid protocol " + protocol);
 
				return;
 
			}
 

	
 
			if (purple_accounts_find_wrapped(name.c_str(), protocol.c_str()) != NULL) {
 
				account = purple_accounts_find_wrapped(name.c_str(), protocol.c_str());
 
				if (m_accounts.find(account) != m_accounts.end() && m_accounts[account] != user) {
 
					LOG4CXX_INFO(logger, "Account '" << name << "' is already used by '" << m_accounts[account] << "'");
 
					np->handleDisconnected(user, 1, "Account '" + name + "' is already used by '" + m_accounts[account] + "'");
 
					return;
 
				}
 
				LOG4CXX_INFO(logger, "Using previously created account with name '" << name.c_str() << "' and protocol '" << protocol << "'");
 
			}
 
			else {
 
				LOG4CXX_INFO(logger, "Creating account with name '" << name.c_str() << "' and protocol '" << protocol << "'");
 
				account = purple_account_new_wrapped(name.c_str(), protocol.c_str());
 
				purple_accounts_add_wrapped(account);
 
			}
 

	
 
			m_sessions[user] = account;
 
			m_accounts[account] = user;
 

	
 
			// Default avatar
 
			setDefaultAvatar(account, legacyName);
 

	
 
			purple_account_set_password_wrapped(account, password.c_str());
 
			purple_account_set_bool_wrapped(account, "custom_smileys", FALSE);
 
			purple_account_set_bool_wrapped(account, "direct_connect", FALSE);
 
			purple_account_set_bool_wrapped(account, "compat-verification", TRUE);
 
			if (protocol == "prpl-hangouts") {
 
				std::string token;
 
				if (getUserToken(user, OAUTH_TOKEN, token)) {
 
					purple_account_set_password_wrapped(account, token.c_str());
 
				}
 
			}
 
			else if (protocol == "prpl-steam-mobile") {
 
				std::string token;
 
				if (getUserToken(user, STEAM_ACCESS_TOKEN, token)) {
 
					purple_account_set_string_wrapped(account, "access_token", token.c_str());
 
				}
 
			}
 
            else if (protocol == "prpl-eionrobb-discord") {
 
                std::string token;
 
                if (getUserToken(user, DISCORD_ACCESS_TOKEN, token)) {
 
                    purple_account_set_string_wrapped(account, "token", token.c_str());
 
                }
 
            }
 
            if (protocol == "prpl-skypeweb") {
 
                int ts = 0;
 
                if (getLastMessageTimestamp(user, ts)) {
 
                    purple_account_set_int_wrapped(account, "last_message_timestamp", ts);
 
                }
 
            }
 

	
 
			setDefaultAccountOptions(account);
 

	
 
			// Enable account + privacy lists
 
			purple_account_set_enabled_wrapped(account, "spectrum", TRUE);
 

	
 
#if PURPLE_MAJOR_VERSION >= 2 && PURPLE_MINOR_VERSION >= 7
 
			if (CONFIG_BOOL(config, "service.enable_privacy_lists")) {
 
				purple_account_set_privacy_type_wrapped(account, PURPLE_PRIVACY_DENY_USERS);
 
			}
 
#endif
 

	
 
			// Set the status
 
			const PurpleStatusType *status_type = purple_account_get_status_type_with_primitive_wrapped(account, PURPLE_STATUS_AVAILABLE);
 
			if (status_type != NULL) {
 
				purple_account_set_status_wrapped(account, purple_status_type_get_id_wrapped(status_type), TRUE, NULL);
 
			}
 
			// OAuth helper
 
			if (protocol == "prpl-hangouts" || protocol == "prpl-steam-mobile" || protocol == "prpl-eionrobb-discord") {
 
				LOG4CXX_INFO(logger, user << ": Adding Buddy " << adminLegacyName << " " << adminAlias);
 
				handleBuddyChanged(user, adminLegacyName, adminAlias, std::vector<std::string>(), pbnetwork::STATUS_ONLINE);
 
			}
 
		}
 

	
 
		void handleLogoutRequest(const std::string &user, const std::string &legacyName) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				if (account->ui_data) {
 
					NodeCache *cache = (NodeCache *) account->ui_data;
 
					purple_timeout_remove_wrapped(cache->timer);
 
					delete cache;
 
					account->ui_data = NULL;
 
				}
 
				if (purple_account_get_int_wrapped(account, "version", 0) != 0) {
 
					std::string data = stringOf(purple_account_get_int_wrapped(account, "version", 0));
 
					g_file_set_contents ("gfire.cfg", data.c_str(), data.size(), NULL);
 
				}
 
// 				VALGRIND_DO_LEAK_CHECK;
 
				m_sessions.erase(user);
 
				purple_account_disconnect_wrapped(account);
 
				purple_account_set_enabled_wrapped(account, "spectrum", FALSE);
 

	
 
				m_accounts.erase(account);
 

	
 
				purple_accounts_delete_wrapped(account);
 
#ifndef WIN32
 
#if !defined(__FreeBSD__) && !defined(__APPLE__)
 
				malloc_trim(0);
 
#endif
 
#endif
 
// 				VALGRIND_DO_LEAK_CHECK;
 
			}
 
		}
 

	
 
		void handleStatusChangeRequest(const std::string &user, int status, const std::string &statusMessage) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				int st;
 
				switch(status) {
 
					case pbnetwork::STATUS_AWAY: {
 
						st = PURPLE_STATUS_AWAY;
 
						if (!purple_account_get_status_type_with_primitive_wrapped(account, PURPLE_STATUS_AWAY))
 
							st = PURPLE_STATUS_EXTENDED_AWAY;
 
						else
 
							st = PURPLE_STATUS_AWAY;
 
						break;
 
					}
 
					case pbnetwork::STATUS_DND: {
 
						st = PURPLE_STATUS_UNAVAILABLE;
 
						break;
 
					}
 
					case pbnetwork::STATUS_XA: {
 
						if (!purple_account_get_status_type_with_primitive_wrapped(account, PURPLE_STATUS_EXTENDED_AWAY))
 
							st = PURPLE_STATUS_AWAY;
 
						else
 
							st = PURPLE_STATUS_EXTENDED_AWAY;
 
						break;
 
					}
 
					case pbnetwork::STATUS_NONE: {
 
						st = PURPLE_STATUS_OFFLINE;
 
						break;
 
					}
 
					case pbnetwork::STATUS_INVISIBLE:
 
						st = PURPLE_STATUS_INVISIBLE;
 
						break;
 
					default:
 
						st = PURPLE_STATUS_AVAILABLE;
 
						break;
 
				}
 
				gchar *_markup = purple_markup_escape_text_wrapped(statusMessage.c_str(), -1);
 
				std::string markup(_markup);
 
				g_free(_markup);
 

	
 
				// we are already connected so we have to change status
 
				const PurpleStatusType *status_type = purple_account_get_status_type_with_primitive_wrapped(account, (PurpleStatusPrimitive) st);
 
				if (status_type != NULL) {
 
					// send presence to legacy network
 
					if (!markup.empty()) {
 
						purple_account_set_status_wrapped(account, purple_status_type_get_id_wrapped(status_type), TRUE, "message", markup.c_str(), NULL);
 
					}
 
					else {
 
						purple_account_set_status_wrapped(account, purple_status_type_get_id_wrapped(status_type), TRUE, NULL);
 
					}
 
				}
 
			}
 
		}
 

	
 
		void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml, const std::string &id) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				LOG4CXX_INFO(logger, "Sending message to '" << legacyName << "'");
 
				PurpleConversation *conv = purple_find_conversation_with_account_wrapped(PURPLE_CONV_TYPE_CHAT, LegacyNameToName(account, legacyName).c_str(), account);
 
				if (legacyName == adminLegacyName) {
 
					// expect OAuth code
 
					if (m_inputRequests.find(user) != m_inputRequests.end()) {
 
						LOG4CXX_INFO(logger, "Updating token for '" << user << "'");
 
						m_inputRequests[user]->ok_cb(m_inputRequests[user]->user_data, message.c_str());
 
						m_inputRequests.erase(user);
 
					}
 
					return;
 
				}
 

	
 
				if (!conv) {
 
					conv = purple_find_conversation_with_account_wrapped(PURPLE_CONV_TYPE_IM, LegacyNameToName(account, legacyName).c_str(), account);
 
					if (!conv) {
 
						conv = purple_conversation_new_wrapped(PURPLE_CONV_TYPE_IM, account, LegacyNameToName(account, legacyName).c_str());
 
					}
 
				}
 
				if (xhtml.empty()) {
 
					gchar *_markup = purple_markup_escape_text_wrapped(message.c_str(), -1);
 
					if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_IM) {
 
						purple_conv_im_send_with_flags_wrapped(PURPLE_CONV_IM_WRAPPED(conv), _markup, static_cast<PurpleMessageFlags>(PURPLE_MESSAGE_SPECTRUM2_ORIGINATED));
 
					}
 
					else if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_CHAT) {
 
						purple_conv_chat_send_with_flags_wrapped(PURPLE_CONV_CHAT_WRAPPED(conv), _markup, static_cast<PurpleMessageFlags>(PURPLE_MESSAGE_SPECTRUM2_ORIGINATED));
 
					}
 
					g_free(_markup);
 
				}
 
				else {
 
					if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_IM) {
 
						purple_conv_im_send_with_flags_wrapped(PURPLE_CONV_IM_WRAPPED(conv), xhtml.c_str(), static_cast<PurpleMessageFlags>(PURPLE_MESSAGE_SPECTRUM2_ORIGINATED));
 
					}
 
					else if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_CHAT) {
 
						purple_conv_chat_send_with_flags_wrapped(PURPLE_CONV_CHAT_WRAPPED(conv), xhtml.c_str(), static_cast<PurpleMessageFlags>(PURPLE_MESSAGE_SPECTRUM2_ORIGINATED));
 
					}
 
				}
 
			}
 
		}
 

	
 
		void handleRoomSubjectChangedRequest(const std::string &user, const std::string &legacyName, const std::string &message) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				PurpleConversation *conv = purple_find_conversation_with_account_wrapped(PURPLE_CONV_TYPE_CHAT, LegacyNameToName(account, legacyName).c_str(), account);
 
				if (!conv) {
 
					LOG4CXX_ERROR(logger, user << ": Cannot set room subject. There is now conversation " << legacyName);
 
					return;
 
				}
 

	
 
				PurplePlugin *prpl = purple_find_prpl_wrapped(purple_account_get_protocol_id_wrapped(account));
 
				PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
				bool support_set_chat_topic = prpl_info && prpl_info->set_chat_topic;
 
				if (support_set_chat_topic) {
 
					LOG4CXX_INFO(logger, user << ": Setting room subject for room " << legacyName);
 
					prpl_info->set_chat_topic(purple_account_get_connection_wrapped(account),
 
											  purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)),
 
											  message.c_str());
 
				}
 
			}
 
		}
 

	
 
		void handleVCardRequest(const std::string &user, const std::string &legacyName, unsigned int id) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				std::string name = legacyName;
 
				if (CONFIG_STRING(config, "service.protocol") == "any" && legacyName.find("prpl-") == 0) {
 
					name = name.substr(name.find(".") + 1);
 
				}
 
				m_vcards[user + name] = id;
 

	
 
				PurplePlugin *prpl = purple_find_prpl_wrapped(purple_account_get_protocol_id_wrapped(account));
 
				PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
				bool support_get_info = prpl_info && prpl_info->get_info;
 

	
 
				if (!support_get_info || (CONFIG_BOOL(config, "backend.no_vcard_fetch") && name != purple_account_get_username_wrapped(account))) {
 
					PurpleNotifyUserInfo *user_info = purple_notify_user_info_new_wrapped();
 
					notify_user_info(purple_account_get_connection_wrapped(account), name.c_str(), user_info);
 
					purple_notify_user_info_destroy_wrapped(user_info);
 
				}
 
				else {
 
					serv_get_info_wrapped(purple_account_get_connection_wrapped(account), name.c_str());
 
				}
 
			}
 
		}
 

	
 
		void handleVCardUpdatedRequest(const std::string &user, const std::string &image, const std::string &nickname) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				purple_account_set_alias_wrapped(account, nickname.c_str());
 
#if PURPLE_MAJOR_VERSION >= 2 && PURPLE_MINOR_VERSION >= 7
 
				purple_account_set_public_alias_wrapped(account, nickname.c_str(), NULL, NULL);
 
#endif
 
				gssize size = image.size();
 
				// this will be freed by libpurple
 
				guchar *photo = (guchar *) g_malloc(size * sizeof(guchar));
 
				memcpy(photo, image.c_str(), size);
 

	
 
				if (!photo)
 
					return;
 
				purple_buddy_icons_set_account_icon_wrapped(account, photo, size);
 
			}
 
		}
 

	
 
		void handleBuddyRemovedRequest(const std::string &user, const std::string &buddyName, const std::vector<std::string> &groups) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				if (m_authRequests.find(user + buddyName) != m_authRequests.end()) {
 
					m_authRequests[user + buddyName]->deny_cb(m_authRequests[user + buddyName]->user_data);
 
					m_authRequests.erase(user + buddyName);
 
				}
 
				PurpleBuddy *buddy = purple_find_buddy_wrapped(account, buddyName.c_str());
 
				if (buddy) {
 
					purple_account_remove_buddy_wrapped(account, buddy, purple_buddy_get_group_wrapped(buddy));
 
					purple_blist_remove_buddy_wrapped(buddy);
 
				}
 
			}
 
		}
 

	
 
		void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector<std::string> &groups_) {
 
			PurpleAccount *account = m_sessions[user];
 
			if (account) {
 
				std::string groups = groups_.empty() ? "" : groups_[0];
 

	
 
				if (m_authRequests.find(user + buddyName) != m_authRequests.end()) {
 
					m_authRequests[user + buddyName]->authorize_cb(m_authRequests[user + buddyName]->user_data);
 
					m_authRequests.erase(user + buddyName);
 
				}
 

	
 
@@ -1328,389 +1332,395 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char
 
			}
 
			purple_imgstore_unref_wrapped(image);
 

	
 
			std::string src = CONFIG_STRING(config, "service.web_url") + "/" + name + "." + ext;
 
			std::string img = "<img src=\"" + src + "\"/>";
 
			boost::replace_all(body, "<img id=\"" + id + "\">", img);
 
			boost::replace_all(plain, "<img id=\"" + id + "\">", src);
 
		}
 
		LOG4CXX_INFO(logger, "New image body='" << body << "'");
 
		char *strip, *xhtml;
 
		purple_markup_html_to_xhtml_wrapped(body.c_str(), &xhtml, &strip);
 
		message_ = strip;
 
		if (message_.empty()) {
 
			message_ = plain;
 
		}
 
		xhtml_ = xhtml;
 
		g_free(xhtml);
 
		g_free(strip);
 
	}
 
	else {
 
		// Escape HTML characters.
 
		char *newline = purple_strdup_withhtml_wrapped(msg);
 
		char *strip, *xhtml;
 
		purple_markup_html_to_xhtml_wrapped(newline, &xhtml, &strip);
 
		message_ = strip;
 
		xhtml_ = xhtml;
 
		g_free(newline);
 
		g_free(xhtml);
 
		g_free(strip);
 
	}
 

	
 
	// AIM and XMPP adds <body>...</body> here...
 
	if (xhtml_.find("<body>") == 0) {
 
		xhtml_ = xhtml_.substr(6);
 
		if (xhtml_.find("</body>") != std::string::npos) {
 
			xhtml_ = xhtml_.substr(0, xhtml_.find("</body>"));
 
		}
 
	}
 

	
 
	if (xhtml_ == message_) {
 
		xhtml_ = "";
 
	}
 

	
 
	std::string timestamp;
 
	if (mtime && (unsigned long) time(NULL)-10 > (unsigned long) mtime/* && (unsigned long) time(NULL) - 31536000 < (unsigned long) mtime*/) {
 
		char buf[80];
 
		strftime(buf, sizeof(buf), "%Y%m%dT%H%M%S", gmtime(&mtime));
 
		timestamp = buf;
 
	}
 

	
 
	if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_IM) {
 
		std::string w = purple_normalize_wrapped(account, who);
 
		std::string n;
 
		size_t pos = w.find("/");
 
		if (pos != std::string::npos) {
 
			n = w.substr((int) pos + 1, w.length() - (int) pos);
 
			w.erase((int) pos, w.length() - (int) pos);
 
		}
 
		LOG4CXX_INFO(logger, "Received message body='" << message_ << "' xhtml='" << xhtml_ << "' name='" << w << "'");
 
		np->handleMessage(np->m_accounts[account], w, message_, n, xhtml_, timestamp, false, false, isCarbon);
 
	}
 
	else {
 
		std::string conversationName = purple_conversation_get_name_wrapped(conv);
 
		LOG4CXX_INFO(logger, "Received message body='" << message_ << "' xhtml='" << xhtml_ << "' name='" << conversationName << "' " << who);
 
		np->handleMessage(np->m_accounts[account], np->NameToLegacyName(account, conversationName), message_, who, xhtml_, timestamp, false, false, isCarbon);
 
	}
 
}
 

	
 
static void conv_chat_add_users(PurpleConversation *conv, GList *cbuddies, gboolean new_arrivals) {
 
	PurpleAccount *account = purple_conversation_get_account_wrapped(conv);
 

	
 
	GList *l = cbuddies;
 
	while (l != NULL) {
 
		PurpleConvChatBuddy *cb = (PurpleConvChatBuddy *)l->data;
 
		std::string name(cb->name);
 
		std::string alias = cb->alias ? cb->alias : cb->name;
 
		int flags = GPOINTER_TO_INT(cb->flags);
 
		if (flags & PURPLE_CBFLAGS_OP || flags & PURPLE_CBFLAGS_HALFOP) {
 
// 			item->addAttribute("affiliation", "admin");
 
// 			item->addAttribute("role", "moderator");
 
			flags = 1;
 
		}
 
		else if (flags & PURPLE_CBFLAGS_FOUNDER) {
 
// 			item->addAttribute("affiliation", "owner");
 
// 			item->addAttribute("role", "moderator");
 
			flags = 1;
 
		}
 
		else {
 
			flags = 0;
 
// 			item->addAttribute("affiliation", "member");
 
// 			item->addAttribute("role", "participant");
 
		}
 
		std::string conversationName = purple_conversation_get_name_wrapped(conv);
 
		np->handleParticipantChanged(np->m_accounts[account], name, np->NameToLegacyName(account, conversationName), (int) flags, pbnetwork::STATUS_ONLINE, "", "", alias);
 

	
 
		l = l->next;
 
	}
 
}
 

	
 
static void conv_chat_remove_users(PurpleConversation *conv, GList *users) {
 
	PurpleAccount *account = purple_conversation_get_account_wrapped(conv);
 

	
 
	GList *l = users;
 
	while (l != NULL) {
 
		std::string name((char *) l->data);
 
		std::string conversationName = purple_conversation_get_name_wrapped(conv);
 
		np->handleParticipantChanged(np->m_accounts[account], name, np->NameToLegacyName(account, conversationName), 0, pbnetwork::STATUS_NONE);
 

	
 
		l = l->next;
 
	}
 
}
 

	
 
static gboolean conv_has_focus(PurpleConversation *conv) {
 
	return TRUE;
 
}
 

	
 
static void conv_chat_topic_changed(PurpleConversation *conv, const char *who, const char *topic) {
 
	LOG4CXX_INFO(logger, "Conversation topic changed");
 
	PurpleAccount *account = purple_conversation_get_account_wrapped(conv);
 
	np->handleSubject(np->m_accounts[account], np->NameToLegacyName(account, purple_conversation_get_name_wrapped(conv)), topic ? topic : "", who ? who : "Spectrum 2");
 
}
 

	
 
static void conv_present(PurpleConversation *conv) {
 
	if (purple_conversation_get_type_wrapped(conv) == PURPLE_CONV_TYPE_CHAT) {
 
		LOG4CXX_INFO(logger, "Conversation presented");
 
		conv_chat_add_users(conv, PURPLE_CONV_CHAT_WRAPPED(conv)->in_room, TRUE);
 
		const char *topic = purple_conv_chat_get_topic(PURPLE_CONV_CHAT_WRAPPED(conv));
 
		if (topic && *topic != '\0') {
 
			conv_chat_topic_changed(conv, topic, PURPLE_CONV_CHAT_WRAPPED(conv)->who);
 
		}
 
		else {
 
			LOG4CXX_INFO(logger, "Conversation created with an empty topic");
 
		}
 
	}
 
}
 

	
 
static PurpleConversationUiOps conversation_ui_ops =
 
{
 
	NULL,
 
	NULL,
 
	conv_write_im,//conv_write_chat,                              /* write_chat           */
 
	conv_write_im,             /* write_im             */
 
	conv_write,//conv_write_conv,           /* write_conv           */
 
	conv_chat_add_users,       /* chat_add_users       */
 
	NULL,//conv_chat_rename_user,     /* chat_rename_user     */
 
	conv_chat_remove_users,    /* chat_remove_users    */
 
	NULL,//pidgin_conv_chat_update_user,     /* chat_update_user     */
 
	conv_present,//pidgin_conv_present_conversation, /* present              */
 
	conv_has_focus,//pidgin_conv_has_focus,            /* has_focus            */
 
	NULL,//pidgin_conv_custom_smiley_add,    /* custom_smiley_add    */
 
	NULL,//pidgin_conv_custom_smiley_write,  /* custom_smiley_write  */
 
	NULL,//pidgin_conv_custom_smiley_close,  /* custom_smiley_close  */
 
	NULL,//pidgin_conv_send_confirm,         /* send_confirm         */
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL
 
};
 

	
 
struct Dis {
 
	std::string name;
 
	std::string protocol;
 
};
 

	
 
// currently unused
 
#if 0
 
static gboolean disconnectMe(void *data) {
 
	Dis *d = (Dis *) data;
 
	PurpleAccount *account = purple_accounts_find_wrapped(d->name.c_str(), d->protocol.c_str());
 
	delete d;
 

	
 
	if (account) {
 
		np->handleLogoutRequest(np->m_accounts[account], purple_account_get_username_wrapped(account));
 
	}
 
	return FALSE;
 
}
 
#endif
 

	
 
static gboolean pingTimeout(void *data) {
 
	np->checkPing();
 
	return TRUE;
 
}
 

	
 
static void connection_report_disconnect(PurpleConnection *gc, PurpleConnectionError reason, const char *text){
 
	PurpleAccount *account = purple_connection_get_account_wrapped(gc);
 
	np->handleDisconnected(np->m_accounts[account], (int) reason, text ? text : "");
 
// 	Dis *d = new Dis;
 
// 	d->name = purple_account_get_username_wrapped(account);
 
// 	d->protocol = purple_account_get_protocol_id_wrapped(account);
 
// 	purple_timeout_add_seconds_wrapped(10, disconnectMe, d);
 
}
 

	
 
static void connection_disconnected(PurpleConnection *gc) {
 
	PurpleAccount *account = purple_connection_get_account_wrapped(gc);
 
	purple_accounts_delete_wrapped(account);
 
	np->m_accounts.erase(account);
 
}
 

	
 
static PurpleConnectionUiOps conn_ui_ops =
 
{
 
	NULL,
 
	NULL,
 
	NULL,//connection_disconnected,
 
	connection_disconnected,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	connection_report_disconnect,
 
	NULL,
 
	NULL,
 
	NULL
 
};
 

	
 
static void *notify_user_info(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) {
 
	PurpleAccount *account = purple_connection_get_account_wrapped(gc);
 
	std::string name(purple_normalize_wrapped(account, who));
 

	
 
	size_t pos = name.find("/");
 
	if (pos != std::string::npos)
 
		name.erase((int) pos, name.length() - (int) pos);
 

	
 

	
 
	GList *vcardEntries = purple_notify_user_info_get_entries_wrapped(user_info);
 
	PurpleNotifyUserInfoEntry *vcardEntry;
 
	std::string firstName;
 
	std::string lastName;
 
	std::string fullName;
 
	std::string nickname;
 
	std::string header;
 
	std::string label;
 
	std::string photo;
 

	
 
	while (vcardEntries) {
 
		vcardEntry = (PurpleNotifyUserInfoEntry *)(vcardEntries->data);
 
		if (purple_notify_user_info_entry_get_label_wrapped(vcardEntry) && purple_notify_user_info_entry_get_value_wrapped(vcardEntry)){
 
			label = boost::locale::to_lower(purple_notify_user_info_entry_get_label_wrapped(vcardEntry));
 
			if (label == "given name" || label == "first name") {
 
				firstName = purple_notify_user_info_entry_get_value_wrapped(vcardEntry);
 
			}
 
			else if (label == "family name" || label == "last name") {
 
				lastName = purple_notify_user_info_entry_get_value_wrapped(vcardEntry);
 
			}
 
			else if (label=="nickname" || label == "nick") {
 
				nickname = purple_notify_user_info_entry_get_value_wrapped(vcardEntry);
 
			}
 
			else if (label=="full name" || label == "display name") {
 
				fullName = purple_notify_user_info_entry_get_value_wrapped(vcardEntry);
 
			}
 
			else {
 
				LOG4CXX_WARN(logger, "Unhandled VCard Label '" << purple_notify_user_info_entry_get_label_wrapped(vcardEntry) << "' " << purple_notify_user_info_entry_get_value_wrapped(vcardEntry));
 
			}
 
		}
 
		vcardEntries = vcardEntries->next;
 
	}
 

	
 
	if ((!firstName.empty() || !lastName.empty()) && fullName.empty())
 
		fullName = firstName + " " + lastName;
 

	
 
	if (nickname.empty() && !fullName.empty()) {
 
		nickname = fullName;
 
	}
 

	
 
	bool ownInfo = name == purple_account_get_username_wrapped(account);
 

	
 
	if (ownInfo) {
 
		const gchar *displayname = purple_connection_get_display_name_wrapped(gc);
 
#if PURPLE_MAJOR_VERSION >= 2 && PURPLE_MINOR_VERSION >= 7
 
		if (!displayname) {
 
			displayname = purple_account_get_name_for_display_wrapped(account);
 
		}
 
#endif
 

	
 
		if (displayname && nickname.empty()) {
 
			nickname = displayname;
 
		}
 

	
 
		// avatar
 
		PurpleStoredImage *avatar = purple_buddy_icons_find_account_icon_wrapped(account);
 
		if (avatar) {
 
			const gchar * data = (const gchar *) purple_imgstore_get_data_wrapped(avatar);
 
			size_t len = purple_imgstore_get_size_wrapped(avatar);
 
			if (len < 300000 && data) {
 
				photo = std::string(data, len);
 
			}
 
			purple_imgstore_unref_wrapped(avatar);
 
		}
 
	}
 

	
 
	PurpleBuddy *buddy = purple_find_buddy_wrapped(purple_connection_get_account_wrapped(gc), who);
 
	if (buddy && photo.size() == 0) {
 
		gsize len;
 
		PurpleBuddyIcon *icon = NULL;
 
		icon = purple_buddy_icons_find_wrapped(purple_connection_get_account_wrapped(gc), name.c_str());
 
		if (icon) {
 
			if (true) {
 
				gchar *data;
 
				gchar *path = purple_buddy_icon_get_full_path_wrapped(icon);
 
				if (path) {
 
					if (g_file_get_contents(path, &data, &len, NULL)) {
 
						photo = std::string(data, len);
 
						g_free(data);
 
					}
 
					g_free(path);
 
				}
 
			}
 
			else {
 
				const gchar * data = (gchar*)purple_buddy_icon_get_data_wrapped(icon, &len);
 
				if (len < 300000 && data) {
 
					photo = std::string(data, len);
 
				}
 
			}
 
			purple_buddy_icon_unref_wrapped(icon);
 
		}
 
	}
 

	
 
	np->handleVCard(np->m_accounts[account], np->m_vcards[np->m_accounts[account] + name], name, fullName, nickname, photo);
 
	np->m_vcards.erase(np->m_accounts[account] + name);
 

	
 
	return NULL;
 
}
 

	
 
void * requestInput(const char *title, const char *primary,const char *secondary, const char *default_value, gboolean multiline, gboolean masked, gchar *hint,const char *ok_text, GCallback ok_cb,const char *cancel_text, GCallback cancel_cb, PurpleAccount *account, const char *who,PurpleConversation *conv, void *user_data) {
 
	if (primary) {
 
		std::string primaryString(primary);
 
		if (primaryString == "Authorization Request Message:") {
 
			LOG4CXX_INFO(logger, "Authorization Request Message: calling ok_cb(...)");
 
			((PurpleRequestInputCb) ok_cb)(user_data, "Please authorize me.");
 
			return NULL;
 
		}
 
		else if (primaryString == "Authorization Request Message:") {
 
			LOG4CXX_INFO(logger, "Authorization Request Message: calling ok_cb(...)");
 
			((PurpleRequestInputCb) ok_cb)(user_data, "Please authorize me.");
 
			return NULL;
 
		}
 
		else if (primaryString == "Authorization Denied Message:") {
 
			LOG4CXX_INFO(logger, "Authorization Deined Message: calling ok_cb(...)");
 
			((PurpleRequestInputCb) ok_cb)(user_data, "Authorization denied.");
 
			return NULL;
 
		}
 
		else if (boost::starts_with(primaryString, "https://accounts.google.com/o/oauth2/auth") ||
 
                                boost::starts_with(primaryString, "https://www.youtube.com/watch?v=hlDhp-eNLMU")) {
 
			LOG4CXX_INFO(logger, "prpl-hangouts oauth request");
 
			np->handleMessage(np->m_accounts[account], np->adminLegacyName, std::string("Please visit the following link and authorize this application: ") + primaryString, "");
 
			np->handleMessage(np->m_accounts[account], np->adminLegacyName, std::string("Reply with code provided by Google: "));
 
			inputRequest *req = new inputRequest;
 
			req->ok_cb = (PurpleRequestInputCb)ok_cb;
 
			req->user_data = user_data;
 
			req->account = account;
 
			req->mainJID = np->m_accounts[account];
 
			np->m_inputRequests[req->mainJID] = req;
 
			return NULL;
 
		}
 
		else if (primaryString == "Set your Steam Guard Code") {
 
			LOG4CXX_INFO(logger, "prpl-steam-mobile steam guard request");
 
			np->handleMessage(np->m_accounts[account], np->adminLegacyName, std::string("Steam Guard code: "));
 
			inputRequest *req = new inputRequest;
 
			req->ok_cb = (PurpleRequestInputCb)ok_cb;
 
			req->user_data = user_data;
 
			req->account = account;
 
			req->mainJID = np->m_accounts[account];
 
			np->m_inputRequests[req->mainJID] = req;
 
			return NULL;
 
		}
 
        else if (primaryString == "Enter Discord auth code") {
 
            LOG4CXX_INFO(logger, "prpl-discord 2FA request");
 
            np->handleMessage(np->m_accounts[account], np->adminLegacyName, std::string("2FA code: "));
 
            inputRequest *req = new inputRequest;
 
            req->ok_cb = (PurpleRequestInputCb)ok_cb;
 
            req->user_data = user_data;
 
            req->account = account;
 
            req->mainJID = np->m_accounts[account];
 
            np->m_inputRequests[req->mainJID] = req;
 
            return NULL;
 
        }
 
		else {
 
			LOG4CXX_WARN(logger, "Unhandled request input. primary=" << primaryString);
 
		}
 
	}
 
    else if (title) {
 
        std::string titleString(title);
 
        if (titleString == "Xfire Invitation Message") {
 
            LOG4CXX_INFO(logger, "Authorization Request Message: calling ok_cb(...)");
 
            ((PurpleRequestInputCb) ok_cb)(user_data, "Please authorize me.");
 
            return NULL;
 
        }
 
        else {
 
            LOG4CXX_WARN(logger, "Unhandled request input. title=" << titleString);
 
        }
 
    }
 
    else {
 
        LOG4CXX_WARN(logger, "Request input without primary string");
 
    }
 
    return NULL;
 
}
 

	
 
@@ -1818,584 +1828,652 @@ static void xferCanceled(PurpleXfer *xfer) {
 
	purple_xfer_unref_wrapped(xfer);
 
}
 

	
 
static void fileSendStart(PurpleXfer *xfer) {
 
// 	FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
 
// 	repeater->fileSendStart();
 
}
 

	
 
static void fileRecvStart(PurpleXfer *xfer) {
 
// 	FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
 
// 	repeater->fileRecvStart();
 
	FTData *ftData = (FTData *) xfer->ui_data;
 
	if (ftData->timer == 0) {
 
		ftData->timer = purple_timeout_add_wrapped(1, ft_ui_ready, xfer);
 
	}
 
}
 

	
 
static void newXfer(PurpleXfer *xfer) {
 
	PurpleAccount *account = purple_xfer_get_account_wrapped(xfer);
 
	std::string filename(xfer ? purple_xfer_get_filename_wrapped(xfer) : "");
 
	purple_xfer_ref_wrapped(xfer);
 
	std::string w = xfer->who;
 
	size_t pos = w.find("/");
 
	if (pos != std::string::npos)
 
		w.erase((int) pos, w.length() - (int) pos);
 

	
 
	FTData *ftdata = new FTData;
 
	ftdata->paused = false;
 
	ftdata->id = 0;
 
	ftdata->timer = 0;
 
	xfer->ui_data = (void *) ftdata;
 

	
 
	np->m_unhandledXfers[np->m_accounts[account] + filename + w] = xfer;
 

	
 
	np->handleFTStart(np->m_accounts[account], w, filename, purple_xfer_get_size_wrapped(xfer));
 
}
 

	
 
static void XferReceiveComplete(PurpleXfer *xfer) {
 
// 	FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
 
// 	repeater->_tryToDeleteMe();
 
// 	GlooxMessageHandler::instance()->ftManager->handleXferFileReceiveComplete(xfer);
 
	std::remove(np->m_waitingXfers.begin(), np->m_waitingXfers.end(), xfer);
 
	FTData *ftdata = (FTData *) xfer->ui_data;
 
	if (ftdata && ftdata->timer) {
 
		purple_timeout_remove_wrapped(ftdata->timer);
 
	}
 
	purple_xfer_unref_wrapped(xfer);
 
}
 

	
 
static void XferSendComplete(PurpleXfer *xfer) {
 
// 	FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
 
// 	repeater->_tryToDeleteMe();
 
	std::remove(np->m_waitingXfers.begin(), np->m_waitingXfers.end(), xfer);
 
	FTData *ftdata = (FTData *) xfer->ui_data;
 
	if (ftdata && ftdata->timer) {
 
		purple_timeout_remove_wrapped(ftdata->timer);
 
	}
 
	purple_xfer_unref_wrapped(xfer);
 
}
 

	
 
static gssize XferWrite(PurpleXfer *xfer, const guchar *buffer, gssize size) {
 
	FTData *ftData = (FTData *) xfer->ui_data;
 
	std::string data((const char *) buffer, (size_t) size);
 
// 	std::cout << "xferwrite\n";
 
	if (!ftData->paused) {
 
// 		std::cout << "adding xfer to waitingXfers queue\n";
 
		np->m_waitingXfers.push_back(xfer);
 
	}
 
	np->handleFTData(ftData->id, data);
 
	return size;
 
}
 

	
 
static void XferNotSent(PurpleXfer *xfer, const guchar *buffer, gsize size) {
 
// 	FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
 
// 	repeater->handleDataNotSent(buffer, size);
 
}
 

	
 
static gssize XferRead(PurpleXfer *xfer, guchar **buffer, gssize size) {
 
// 	FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
 
// 	int data_size = repeater->getDataToSend(buffer, size);
 
// 	if (data_size == 0)
 
// 		return 0;
 
//
 
// 	return data_size;
 
	return 0;
 
}
 

	
 
static PurpleXferUiOps xferUiOps =
 
{
 
	XferCreated,
 
	XferDestroyed,
 
	NULL,
 
	NULL,
 
	xferCanceled,
 
	xferCanceled,
 
	XferWrite,
 
	XferRead,
 
	XferNotSent,
 
	NULL
 
};
 

	
 
static void RoomlistProgress(PurpleRoomlist *list, gboolean in_progress)
 
{
 
	if (!in_progress) {
 
		GList *fields = purple_roomlist_get_fields(list);
 
		GList *field;
 
		int topicId = -1;
 
		int usersId = -1;
 
		int id = 0;
 
		for (field = fields; field != NULL; field = field->next, id++) {
 
			PurpleRoomlistField *f = (PurpleRoomlistField *) field->data;
 
			if (!f || !f->name) {
 
				continue;
 
			}
 
			std::string fstring = f->name;
 
			if (fstring == "topic") {
 
				topicId = id;
 
			}
 
			else if (fstring == "users") {
 
				usersId = id;
 
			}
 
			else {
 
				LOG4CXX_INFO(logger, "Uknown RoomList field " << fstring);
 
			}
 
		}
 

	
 
		GList *rooms;
 
		std::list<std::string> m_topics;
 
		PurplePlugin *plugin = purple_find_prpl_wrapped(purple_account_get_protocol_id_wrapped(list->account));
 
		PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
 
		for (rooms = list->rooms; rooms != NULL; rooms = rooms->next) {
 
			PurpleRoomlistRoom *room = (PurpleRoomlistRoom *)rooms->data;
 
			if (room->type == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY) continue;
 
			std::string roomId = prpl_info && prpl_info->roomlist_room_serialize ?
 
				prpl_info->roomlist_room_serialize(room)
 
				: room->name;
 
			np->m_rooms[np->m_accounts[list->account]].push_back(roomId);
 

	
 
			if (topicId == -1) {
 
				m_topics.push_back(room->name);
 
			}
 
			else {
 
				char *topic = (char *) g_list_nth_data(purple_roomlist_room_get_fields(room), topicId);
 
				if (topic) {
 
					m_topics.push_back(topic);
 
				}
 
				else {
 
					if (usersId) {
 
						char *users = (char *) g_list_nth_data(purple_roomlist_room_get_fields(room), usersId);
 
						if (users) {
 
							m_topics.push_back(users);
 
						}
 
						else {
 
							LOG4CXX_WARN(logger, "RoomList topic and users is NULL");
 
							m_topics.push_back(room->name);
 
						}
 
					}
 
					else {
 
						LOG4CXX_WARN(logger, "RoomList topic is NULL");
 
						m_topics.push_back(room->name);
 
					}
 
				}
 
			}
 
		}
 

	
 
		std::string user = "";
 
		if (list->account) {
 
			user = np->m_accounts[list->account];
 
		}
 

	
 
		LOG4CXX_INFO(logger, "RoomList is fetched for user " << user);
 
		np->handleRoomList(user, np->m_rooms[user], m_topics);
 
	}
 
	else {
 
		LOG4CXX_INFO(logger, "RoomList is still in progress");
 
	}
 
}
 

	
 
static PurpleRoomlistUiOps roomlist_ui_ops =
 
{
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	RoomlistProgress,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL
 
};
 

	
 
#if PURPLE_MAJOR_VERSION >=2 && PURPLE_MINOR_VERSION >=11
 

	
 
static void preferencesIntChanged(PurpleAccount *account, const char *name, int value) {
 
	boost::mutex::scoped_lock lock(dblock);
 
        UserInfo info;
 
	std::string user = np->m_accounts[account];
 
	LOG4CXX_INFO(logger, "asking for " << user << " settings");
 
        if(storagebackend->getUser(user, info) == false) {
 
                LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
                return;
 
        }
 
        LOG4CXX_INFO(logger, "storing " << value << "as " << name << " for " << user);
 
        std::string defaultValue = "0";
 
        int type = TYPE_INT;
 
        storagebackend->getUserSetting((long)info.id, std::string(name), type, defaultValue);
 
        storagebackend->updateUserSetting((long)info.id, std::string(name), stringOf(value));
 
};
 

	
 
static void preferencesStringChanged(PurpleAccount *account, const char *name, const char *value) {
 
	boost::mutex::scoped_lock lock(dblock);
 
        UserInfo info;
 
	std::string user = np->m_accounts[account];
 
	LOG4CXX_INFO(logger, "asking for " << user << " settings");
 
        if(storagebackend->getUser(user, info) == false) {
 
                LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
                return;
 
        }
 
	LOG4CXX_INFO(logger, "storing " << value << "as " << name << " for " << user);
 
	std::string defaultValue = "";
 
	int type = TYPE_STRING;
 
	storagebackend->getUserSetting((long)info.id, std::string(name), type, defaultValue);
 
        storagebackend->updateUserSetting((long)info.id, std::string(name), std::string(value));
 
};
 

	
 
static void preferencesBoolChanged(PurpleAccount *account, const char *name, gboolean value) {
 
	boost::mutex::scoped_lock lock(dblock);
 
        UserInfo info;
 
	std::string user = np->m_accounts[account];
 
	LOG4CXX_INFO(logger, "asking for " << user << " settings");
 
        if(storagebackend->getUser(user, info) == false) {
 
                LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
                return;
 
        }
 
        LOG4CXX_INFO(logger, "storing " << value << "as " << name << " for " << user);
 
        std::string defaultValue = "false";
 
        int type = TYPE_BOOLEAN;
 
        storagebackend->getUserSetting((long)info.id, std::string(name), type, defaultValue);
 
        storagebackend->updateUserSetting((long)info.id, std::string(name), stringOf(value));
 
};
 

	
 
static PurpleAccountPrefsUiOps account_prefs_ui_ops =
 
{
 
	preferencesIntChanged,
 
	preferencesStringChanged,
 
	preferencesBoolChanged,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL
 
};
 

	
 
#endif
 

	
 
static void transport_core_ui_init(void)
 
{
 
	purple_blist_set_ui_ops_wrapped(&blistUiOps);
 
	purple_accounts_set_ui_ops_wrapped(&accountUiOps);
 
	purple_notify_set_ui_ops_wrapped(&notifyUiOps);
 
	purple_request_set_ui_ops_wrapped(&requestUiOps);
 
	purple_xfers_set_ui_ops_wrapped(&xferUiOps);
 
	purple_connections_set_ui_ops_wrapped(&conn_ui_ops);
 
	purple_conversations_set_ui_ops_wrapped(&conversation_ui_ops);
 
	purple_roomlist_set_ui_ops_wrapped(&roomlist_ui_ops);
 

	
 
#if PURPLE_MAJOR_VERSION >=2 && PURPLE_MINOR_VERSION >= 11
 
	purple_account_prefs_set_ui_ops_wrapped(&account_prefs_ui_ops);
 
#endif
 
// #ifndef WIN32
 
// 	purple_dnsquery_set_ui_ops_wrapped(getDNSUiOps());
 
// #endif
 
}
 

	
 
/***** Core Ui Ops *****/
 
static void
 
spectrum_glib_log_handler(const gchar *domain,
 
						  GLogLevelFlags flags,
 
						  const gchar *message,
 
						  gpointer user_data)
 
{
 
	const char *level;
 
	char *new_msg = NULL;
 
	char *new_domain = NULL;
 

	
 
	if ((flags & G_LOG_LEVEL_ERROR) == G_LOG_LEVEL_ERROR)
 
		level = "ERROR";
 
	else if ((flags & G_LOG_LEVEL_CRITICAL) == G_LOG_LEVEL_CRITICAL)
 
		level = "CRITICAL";
 
	else if ((flags & G_LOG_LEVEL_WARNING) == G_LOG_LEVEL_WARNING)
 
		level = "WARNING";
 
	else if ((flags & G_LOG_LEVEL_MESSAGE) == G_LOG_LEVEL_MESSAGE)
 
		level = "MESSAGE";
 
	else if ((flags & G_LOG_LEVEL_INFO) == G_LOG_LEVEL_INFO)
 
		level = "INFO";
 
	else if ((flags & G_LOG_LEVEL_DEBUG) == G_LOG_LEVEL_DEBUG)
 
		level = "DEBUG";
 
	else {
 
		LOG4CXX_ERROR(logger, "Unknown glib logging level in " << (guint)flags);
 
		level = "UNKNOWN"; /* This will never happen. */
 
	}
 

	
 
	if (message != NULL)
 
		new_msg = purple_utf8_try_convert_wrapped(message);
 

	
 
	if (domain != NULL)
 
		new_domain = purple_utf8_try_convert_wrapped(domain);
 

	
 
	if (new_msg != NULL) {
 
		std::string area("glib");
 
		area.push_back('/');
 
		area.append(level);
 

	
 
		std::string message(new_domain ? new_domain : "g_log");
 
		message.push_back(' ');
 
		message.append(new_msg);
 

	
 
		LOG4CXX_ERROR(logger, message);
 
		g_free(new_msg);
 
	}
 

	
 
	g_free(new_domain);
 
}
 

	
 
static void
 
debug_init(void)
 
{
 
#define REGISTER_G_LOG_HANDLER(name) \
 
	g_log_set_handler((name), \
 
		(GLogLevelFlags)(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL \
 
										  | G_LOG_FLAG_RECURSION), \
 
					  spectrum_glib_log_handler, NULL)
 

	
 
	REGISTER_G_LOG_HANDLER(NULL);
 
	REGISTER_G_LOG_HANDLER("GLib");
 
	REGISTER_G_LOG_HANDLER("GModule");
 
	REGISTER_G_LOG_HANDLER("GLib-GObject");
 
	REGISTER_G_LOG_HANDLER("GThread");
 
	REGISTER_G_LOG_HANDLER("GConf");
 

	
 

	
 
#undef REGISTER_G_LOD_HANDLER
 
}
 

	
 
static PurpleCoreUiOps coreUiOps =
 
{
 
	NULL,
 
	debug_init,
 
	transport_core_ui_init,
 
	NULL,
 
	spectrum_ui_get_info,
 
	NULL,
 
	NULL,
 
	NULL
 
};
 

	
 
static void signed_on(PurpleConnection *gc, gpointer unused) {
 
	PurpleAccount *account = purple_connection_get_account_wrapped(gc);
 
	np->handleConnected(np->m_accounts[account]);
 
#ifndef WIN32
 
#if !defined(__FreeBSD__) && !defined(__APPLE__)
 
	// force returning of memory chunks allocated by libxml2 to kernel
 
	malloc_trim(0);
 
#endif
 
#endif
 
	purple_roomlist_get_list_wrapped(gc);
 

	
 
	// For prpl-gg
 
	execute_purple_plugin_action(gc, "Download buddylist from Server");
 
	if (CONFIG_STRING(config, "service.protocol") == "prpl-hangouts") {
 
		storeUserToken(np->m_accounts[account], OAUTH_TOKEN, purple_account_get_password_wrapped(account));
 
	}
 
	else if (CONFIG_STRING(config, "service.protocol") == "prpl-steam-mobile") {
 
		storeUserToken(np->m_accounts[account], STEAM_ACCESS_TOKEN, purple_account_get_string_wrapped(account, "access_token", NULL));
 
	}
 
    else if (CONFIG_STRING(config, "service.protocol") == "prpl-eionrobb-discord") {
 
        storeUserToken(np->m_accounts[account], DISCORD_ACCESS_TOKEN, purple_account_get_string_wrapped(account, "token", NULL));
 
    }
 
}
 

	
 
static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) {
 
	std::string c("");
 
	std::string args(arg_s);
 
	args.erase(args.size() - 1);
 

	
 
	if (category) {
 
		c.append(category);
 
	}
 

	
 
	c.push_back(':');
 

	
 
	LOG4CXX_INFO(logger_libpurple, c << args);
 
}
 

	
 
/*
 
 * Ops....
 
 */
 
static PurpleDebugUiOps debugUiOps =
 
{
 
	printDebug,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL,
 
	NULL
 
};
 

	
 
static void buddyTyping(PurpleAccount *account, const char *who, gpointer null) {
 
	std::string w = purple_normalize_wrapped(account, who);
 
	size_t pos = w.find("/");
 
	if (pos != std::string::npos)
 
		w.erase((int) pos, w.length() - (int) pos);
 
	np->handleBuddyTyping(np->m_accounts[account], w);
 
}
 

	
 
static void buddyTyped(PurpleAccount *account, const char *who, gpointer null) {
 
	std::string w = purple_normalize_wrapped(account, who);
 
	size_t pos = w.find("/");
 
	if (pos != std::string::npos)
 
		w.erase((int) pos, w.length() - (int) pos);
 
	np->handleBuddyTyped(np->m_accounts[account], w);
 
}
 

	
 
static void buddyTypingStopped(PurpleAccount *account, const char *who, gpointer null){
 
	std::string w = purple_normalize_wrapped(account, who);
 
	size_t pos = w.find("/");
 
	if (pos != std::string::npos)
 
		w.erase((int) pos, w.length() - (int) pos);
 
	np->handleBuddyStoppedTyping(np->m_accounts[account], w);
 
}
 

	
 
static void gotAttention(PurpleAccount *account, const char *who, PurpleConversation *conv, guint type) {
 
	std::string w = purple_normalize_wrapped(account, who);
 
	size_t pos = w.find("/");
 
	if (pos != std::string::npos)
 
		w.erase((int) pos, w.length() - (int) pos);
 
	np->handleAttention(np->m_accounts[account], w, "");
 
}
 

	
 
static bool initPurple() {
 
	bool ret;
 

	
 
	std::string libPurpleDllPath = CONFIG_STRING_DEFAULTED(config, "purple.libpurple_dll_path", "");
 

	
 
	if (!resolvePurpleFunctions()) {
 
		LOG4CXX_ERROR(logger, "Unable to load libpurple.dll or some of the needed methods");
 
		return false;
 
	}
 

	
 
	std::string pluginsDir = CONFIG_STRING_DEFAULTED(config, "purple.plugins_dir", "./plugins");
 
	LOG4CXX_INFO(logger, "Setting libpurple plugins directory to: " << pluginsDir);
 
	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 cacerts directory to: " << cacertsDir);
 
	purple_certificate_add_ca_search_path_wrapped(cacertsDir.c_str());
 

	
 
	std::string userDir = CONFIG_STRING_DEFAULTED(config, "service.working_dir", "./");
 
	LOG4CXX_INFO(logger, "Setting libpurple user directory to: " << userDir);
 

	
 
	purple_util_set_user_dir_wrapped(userDir.c_str());
 
	remove("./accounts.xml");
 
	remove("./blist.xml");
 

	
 
	purple_debug_set_ui_ops_wrapped(&debugUiOps);
 
// 	purple_debug_set_verbose_wrapped(true);
 

	
 
	purple_core_set_ui_ops_wrapped(&coreUiOps);
 
	if (CONFIG_STRING_DEFAULTED(config, "service.eventloop", "") == "libev") {
 
		LOG4CXX_INFO(logger, "Will use libev based event loop");
 
	}
 
	else {
 
		LOG4CXX_INFO(logger, "Will use glib based event loop");
 
	}
 
	purple_eventloop_set_ui_ops_wrapped(getEventLoopUiOps(CONFIG_STRING_DEFAULTED(config, "service.eventloop", "") == "libev"));
 

	
 
	ret = purple_core_init_wrapped("spectrum");
 
	if (ret) {
 
		static int blist_handle;
 
		static int conversation_handle;
 

	
 
		purple_set_blist_wrapped(purple_blist_new_wrapped());
 
		purple_blist_load_wrapped();
 

	
 
		purple_prefs_load_wrapped();
 

	
 
		/* Good default preferences */
 
		/* The combination of these two settings mean that libpurple will never
 
		 * (of its own accord) set all the user accounts idle.
 
		 */
 
		purple_prefs_set_bool_wrapped("/purple/away/away_when_idle", false);
 
		/*
 
		 * This must be set to something not "none" for idle reporting to work
 
		 * for, e.g., the OSCAR prpl. We don't implement the UI ops, so this is
 
		 * okay for now.
 
		 */
 
		purple_prefs_set_string_wrapped("/purple/away/idle_reporting", "system");
 

	
 
		/* Disable all logging */
 
		purple_prefs_set_bool_wrapped("/purple/logging/log_ims", false);
 
		purple_prefs_set_bool_wrapped("/purple/logging/log_chats", false);
 
		purple_prefs_set_bool_wrapped("/purple/logging/log_system", false);
 

	
 
        purple_plugins_load_saved_wrapped("/spectrum/plugins/loaded");
 

	
 
// 		purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "received-im-msg", &conversation_handle, PURPLE_CALLBACK(newMessageReceived), NULL);
 
		purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "buddy-typing", &conversation_handle, PURPLE_CALLBACK(buddyTyping), NULL);
 
		purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "buddy-typed", &conversation_handle, PURPLE_CALLBACK(buddyTyped), NULL);
 
		purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL);
 
		purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-privacy-changed", &conversation_handle, PURPLE_CALLBACK(buddyPrivacyChanged), NULL);
 
		purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "got-attention", &conversation_handle, PURPLE_CALLBACK(gotAttention), NULL);
 
		purple_signal_connect_wrapped(purple_connections_get_handle_wrapped(), "signed-on", &blist_handle,PURPLE_CALLBACK(signed_on), NULL);
 
// 		purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-removed", &blist_handle,PURPLE_CALLBACK(buddyRemoved), NULL);
 
// 		purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL);
 
// 		purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-signed-off", &blist_handle,PURPLE_CALLBACK(buddySignedOff), NULL);
 
// 		purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "buddy-status-changed", &blist_handle,PURPLE_CALLBACK(buddyStatusChanged), NULL);
 
		purple_signal_connect_wrapped(purple_blist_get_handle_wrapped(), "blist-node-removed", &blist_handle,PURPLE_CALLBACK(NodeRemoved), NULL);
 
		purple_signal_connect_wrapped(purple_conversations_get_handle_wrapped(), "chat-topic-changed", &conversation_handle, PURPLE_CALLBACK(conv_chat_topic_changed), NULL);
 
		static int xfer_handle;
 
		purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-send-start", &xfer_handle, PURPLE_CALLBACK(fileSendStart), NULL);
 
		purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-recv-start", &xfer_handle, PURPLE_CALLBACK(fileRecvStart), NULL);
 
		purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-recv-request", &xfer_handle, PURPLE_CALLBACK(newXfer), NULL);
 
		purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-recv-complete", &xfer_handle, PURPLE_CALLBACK(XferReceiveComplete), NULL);
 
		purple_signal_connect_wrapped(purple_xfers_get_handle_wrapped(), "file-send-complete", &xfer_handle, PURPLE_CALLBACK(XferSendComplete), NULL);
 
//
 
// 		purple_commands_init();
 

	
 
	}
 
	return ret;
 
}
 

	
 

	
 
static void transportDataReceived(gpointer data, gint source, PurpleInputCondition cond) {
 
	if (cond & PURPLE_INPUT_READ) {
 
		char buffer[65535];
 
		char *ptr = buffer;
 
#ifdef WIN32
 
		ssize_t n = recv(source, ptr, sizeof(buffer), 0);
 
#else
 
		ssize_t n = read(source, ptr, sizeof(buffer));
 
#endif
 
		if (n <= 0) {
 
			if (errno == EAGAIN) {
 
				return;
 
			}
 
			LOG4CXX_INFO(logger, "Diconnecting from spectrum2 server");
 
			exit(errno);
 
		}
 
		std::string d = std::string(buffer, n);
 

	
 
		if (firstPing) {
 
			firstPing = false;
 
			NetworkPlugin::PluginConfig cfg;
 
			cfg.setSupportMUC(true);
 
			if (CONFIG_STRING(config, "service.protocol") == "prpl-telegram") {
 
				cfg.setNeedPassword(false);
 
			}
 
			if (CONFIG_STRING(config, "service.protocol") == "prpl-hangouts") {
 
				cfg.setNeedPassword(false);
 
			}
 
			if (CONFIG_BOOL(config, "service.server_mode") || CONFIG_STRING(config, "service.protocol") == "prpl-irc") {
 
				cfg.setNeedRegistration(false);
 
			}
 
			else {
 
				cfg.setNeedRegistration(true);
 
			}
 
			np->sendConfig(cfg);
 
		}
 

	
 
		np->handleDataRead(d);
 
	}
 
	else {
 
		if (writeInput != 0) {
 
			purple_input_remove_wrapped(writeInput);
 
			writeInput = 0;
 
		}
 
		np->readyForData();
 
	}
 
}
 

	
 
int main(int argc, char **argv) {
 
	boost::locale::generator gen;
 
	std::locale::global(gen(""));
 
#ifndef WIN32
 
#if !defined(__FreeBSD__) && !defined(__APPLE__)
 
		mallopt(M_CHECK_ACTION, 2);
 
		mallopt(M_PERTURB, 0xb);
 
#endif
 

	
 
		signal(SIGPIPE, SIG_IGN);
 

	
 
		if (signal(SIGCHLD, spectrum_sigchld_handler) == SIG_ERR) {
 
			std::cout << "SIGCHLD handler can't be set\n";
 
			return -1;
 
		}
 
#endif
 

	
 
	std::string error;
 
	Config *cfg = Config::createFromArgs(argc, argv, error, host, port);
 
	if (cfg == NULL) {
 
		std::cerr << error;
 
		return 1;
 
	}
 

	
 
	config = SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<Config>(cfg);
 

	
 
	Logging::initBackendLogging(config.get());
 
	if (CONFIG_STRING(config, "service.protocol") == "prpl-hangouts" || CONFIG_STRING(config, "service.protocol") == "prpl-steam-mobile") {
 
	if (CONFIG_STRING(config, "service.protocol") == "prpl-hangouts" || CONFIG_STRING(config, "service.protocol") == "prpl-steam-mobile" || CONFIG_STRING(config, "service.protocol") == "prpl-skypeweb" || CONFIG_STRING(config, "service.protocol") == "prpl-eionrobb-discord") {
 
		storagebackend = StorageBackend::createBackend(config.get(), error);
 
		if (storagebackend == NULL) {
 
			LOG4CXX_ERROR(logger, "Error creating StorageBackend! " << error);
 
			LOG4CXX_ERROR(logger, "Hangouts and Steam backends need storage backend configured to work! " << error);
 
			LOG4CXX_ERROR(logger, "Selected libpurple protocol need storage backend configured to work! " << error);
 
			return NetworkPlugin::StorageBackendNeeded;
 
		}
 
		else if (!storagebackend->connect()) {
 
			LOG4CXX_ERROR(logger, "Can't connect to database!");
 
			return -1;
 
		}
 
	}
 

	
 
	initPurple();
 

	
 
	main_socket = create_socket(host.c_str(), port);
 
	purple_input_add_wrapped(main_socket, PURPLE_INPUT_READ, &transportDataReceived, NULL);
 
	purple_timeout_add_seconds_wrapped(30, pingTimeout, NULL);
 

	
 
	np = new SpectrumNetworkPlugin();
 

	
 
	GMainLoop *m_loop;
 
#ifdef WITH_LIBEVENT
 
	bool libev = CONFIG_STRING_DEFAULTED(config, "service.eventloop", "") == "libev";
 
	if (!libev) {
 
		m_loop = g_main_loop_new(NULL, FALSE);
 
	}
 
	else {
 
		event_init();
 
	}
 
#endif
 
	m_loop = g_main_loop_new(NULL, FALSE);
 
	if (m_loop) {
 
		g_main_loop_run(m_loop);
 
	}
 
#ifdef WITH_LIBEVENT
 
	else {
 
		event_loop(0);
 
	}
 
#endif
 

	
 
	return 0;
 
}
backends/libpurple/purple_defs.cpp
Show inline comments
 
#include "purple_defs.h"
 

	
 
#if PURPLE_RUNTIME
 
static HMODULE f_hPurple = NULL;
 
purple_account_set_bool_wrapped_fnc purple_account_set_bool_wrapped = NULL;
 
purple_account_get_protocol_id_wrapped_fnc purple_account_get_protocol_id_wrapped = NULL;
 
purple_account_set_int_wrapped_fnc purple_account_set_int_wrapped = NULL;
 
purple_account_set_string_wrapped_fnc purple_account_set_string_wrapped = NULL;
 
purple_account_get_username_wrapped_fnc purple_account_get_username_wrapped = NULL;
 
purple_account_set_username_wrapped_fnc purple_account_set_username_wrapped = NULL;
 
purple_account_set_proxy_info_wrapped_fnc purple_account_set_proxy_info_wrapped = NULL;
 
purple_accounts_find_wrapped_fnc purple_accounts_find_wrapped = NULL;
 
purple_account_new_wrapped_fnc purple_account_new_wrapped = NULL;
 
purple_accounts_add_wrapped_fnc purple_accounts_add_wrapped = NULL;
 
purple_account_get_password_wrapped_fnc purple_account_get_password_wrapped = NULL;
 
purple_account_set_password_wrapped_fnc purple_account_set_password_wrapped = NULL;
 
purple_account_set_enabled_wrapped_fnc purple_account_set_enabled_wrapped = NULL;
 
purple_account_set_privacy_type_wrapped_fnc purple_account_set_privacy_type_wrapped = NULL;
 
purple_account_get_status_type_with_primitive_wrapped_fnc purple_account_get_status_type_with_primitive_wrapped = NULL;
 
purple_account_set_status_wrapped_fnc purple_account_set_status_wrapped = NULL;
 
purple_account_get_int_wrapped_fnc purple_account_get_int_wrapped = NULL;
 
purple_account_disconnect_wrapped_fnc purple_account_disconnect_wrapped = NULL;
 
purple_accounts_delete_wrapped_fnc purple_accounts_delete_wrapped = NULL;
 
purple_account_get_connection_wrapped_fnc purple_account_get_connection_wrapped = NULL;
 
purple_account_set_alias_wrapped_fnc purple_account_set_alias_wrapped = NULL;
 
purple_account_set_public_alias_wrapped_fnc purple_account_set_public_alias_wrapped = NULL;
 
purple_account_remove_buddy_wrapped_fnc purple_account_remove_buddy_wrapped = NULL;
 
purple_account_add_buddy_wrapped_fnc purple_account_add_buddy_wrapped = NULL;
 
purple_account_get_name_for_display_wrapped_fnc purple_account_get_name_for_display_wrapped = NULL;
 
purple_accounts_set_ui_ops_wrapped_fnc purple_accounts_set_ui_ops_wrapped = NULL;
 
purple_account_prefs_set_ui_ops_wrapped_fnc purple_account_prefs_set_ui_ops_wrapped = NULL;
 
purple_account_option_get_type_wrapped_fnc purple_account_option_get_type_wrapped = NULL;
 
purple_account_option_get_setting_wrapped_fnc purple_account_option_get_setting_wrapped = NULL;
 
purple_blist_node_get_type_wrapped_fnc purple_blist_node_get_type_wrapped = NULL;
 
purple_buddy_get_alias_wrapped_fnc purple_buddy_get_alias_wrapped = NULL;
 
purple_buddy_get_server_alias_wrapped_fnc purple_buddy_get_server_alias_wrapped = NULL;
 
purple_find_buddy_wrapped_fnc purple_find_buddy_wrapped = NULL;
 
purple_buddy_get_group_wrapped_fnc purple_buddy_get_group_wrapped = NULL;
 
purple_blist_remove_buddy_wrapped_fnc purple_blist_remove_buddy_wrapped = NULL;
 
purple_blist_alias_buddy_wrapped_fnc purple_blist_alias_buddy_wrapped = NULL;
 
purple_blist_server_alias_buddy_wrapped_fnc purple_blist_server_alias_buddy_wrapped = NULL;
 
purple_find_group_wrapped_fnc purple_find_group_wrapped = NULL;
 
purple_group_new_wrapped_fnc purple_group_new_wrapped = NULL;
 
purple_blist_add_contact_wrapped_fnc purple_blist_add_contact_wrapped = NULL;
 
purple_buddy_get_contact_wrapped_fnc purple_buddy_get_contact_wrapped = NULL;
 
purple_buddy_new_wrapped_fnc purple_buddy_new_wrapped = NULL;
 
purple_blist_add_buddy_wrapped_fnc purple_blist_add_buddy_wrapped = NULL;
 
purple_blist_find_chat_wrapped_fnc purple_blist_find_chat_wrapped = NULL;
 
purple_chat_get_components_wrapped_fnc purple_chat_get_components_wrapped = NULL;
 
purple_buddy_get_presence_wrapped_fnc purple_buddy_get_presence_wrapped = NULL;
 
purple_buddy_get_account_wrapped_fnc purple_buddy_get_account_wrapped = NULL;
 
purple_buddy_get_name_wrapped_fnc purple_buddy_get_name_wrapped = NULL;
 
purple_find_buddies_wrapped_fnc purple_find_buddies_wrapped = NULL;
 
purple_group_get_name_wrapped_fnc purple_group_get_name_wrapped = NULL;
 
purple_blist_set_ui_ops_wrapped_fnc purple_blist_set_ui_ops_wrapped = NULL;
 
purple_set_blist_wrapped_fnc purple_set_blist_wrapped = NULL;
 
purple_blist_new_wrapped_fnc purple_blist_new_wrapped = NULL;
 
purple_blist_load_wrapped_fnc purple_blist_load_wrapped = NULL;
 
purple_blist_get_handle_wrapped_fnc purple_blist_get_handle_wrapped = NULL;
 
purple_buddy_icons_set_account_icon_wrapped_fnc purple_buddy_icons_set_account_icon_wrapped = NULL;
 
purple_buddy_icons_find_wrapped_fnc purple_buddy_icons_find_wrapped = NULL;
 
purple_buddy_icon_get_full_path_wrapped_fnc purple_buddy_icon_get_full_path_wrapped = NULL;
 
purple_buddy_icon_unref_wrapped_fnc purple_buddy_icon_unref_wrapped = NULL;
 
purple_buddy_icons_find_account_icon_wrapped_fnc purple_buddy_icons_find_account_icon_wrapped = NULL;
 
purple_buddy_icon_get_data_wrapped_fnc purple_buddy_icon_get_data_wrapped = NULL;
 
purple_certificate_add_ca_search_path_wrapped_fnc purple_certificate_add_ca_search_path_wrapped = NULL;
 
purple_connection_get_state_wrapped_fnc purple_connection_get_state_wrapped = NULL;
 
purple_connection_get_account_wrapped_fnc purple_connection_get_account_wrapped = NULL;
 
purple_connection_get_display_name_wrapped_fnc purple_connection_get_display_name_wrapped = NULL;
 
purple_connections_set_ui_ops_wrapped_fnc purple_connections_set_ui_ops_wrapped = NULL;
 
purple_connections_get_handle_wrapped_fnc purple_connections_get_handle_wrapped = NULL;
 
purple_conversation_get_im_data_wrapped_fnc purple_conversation_get_im_data_wrapped = NULL;
 
purple_conversation_get_chat_data_wrapped_fnc purple_conversation_get_chat_data_wrapped = NULL;
 
purple_find_conversation_with_account_wrapped_fnc purple_find_conversation_with_account_wrapped = NULL;
 
purple_conversation_new_wrapped_fnc purple_conversation_new_wrapped = NULL;
 
purple_conversation_get_type_wrapped_fnc purple_conversation_get_type_wrapped = NULL;
 
purple_conv_im_send_wrapped_fnc purple_conv_im_send_wrapped = NULL;
 
purple_conv_im_send_with_flags_wrapped_fnc purple_conv_im_send_with_flags_wrapped = NULL;
 
purple_conv_chat_send_wrapped_fnc purple_conv_chat_send_wrapped = NULL;
 
purple_conv_chat_send_with_flags_wrapped_fnc purple_conv_chat_send_with_flags_wrapped = NULL;
 
purple_conversation_destroy_wrapped_fnc purple_conversation_destroy_wrapped = NULL;
 
purple_conversation_get_account_wrapped_fnc purple_conversation_get_account_wrapped = NULL;
 
purple_conversation_get_name_wrapped_fnc purple_conversation_get_name_wrapped = NULL;
 
purple_conversations_set_ui_ops_wrapped_fnc purple_conversations_set_ui_ops_wrapped = NULL;
 
purple_conversations_get_handle_wrapped_fnc purple_conversations_get_handle_wrapped = NULL;
 
purple_core_set_ui_ops_wrapped_fnc purple_core_set_ui_ops_wrapped = NULL;
 
purple_core_init_wrapped_fnc purple_core_init_wrapped = 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;
 
purple_dnsquery_set_ui_ops_wrapped_fnc purple_dnsquery_set_ui_ops_wrapped = NULL;
 
purple_timeout_remove_wrapped_fnc purple_timeout_remove_wrapped = NULL;
 
purple_input_add_wrapped_fnc purple_input_add_wrapped = NULL;
 
purple_timeout_add_wrapped_fnc purple_timeout_add_wrapped = NULL;
 
purple_timeout_add_seconds_wrapped_fnc purple_timeout_add_seconds_wrapped = NULL;
 
purple_eventloop_set_ui_ops_wrapped_fnc purple_eventloop_set_ui_ops_wrapped = NULL;
 
purple_input_remove_wrapped_fnc purple_input_remove_wrapped = NULL;
 
purple_xfer_ui_ready_wrapped_fnc purple_xfer_ui_ready_wrapped = NULL;
 
purple_xfer_request_accepted_wrapped_fnc purple_xfer_request_accepted_wrapped = NULL;
 
purple_xfer_request_denied_wrapped_fnc purple_xfer_request_denied_wrapped = NULL;
 
purple_xfer_get_account_wrapped_fnc purple_xfer_get_account_wrapped = NULL;
 
purple_xfer_get_filename_wrapped_fnc purple_xfer_get_filename_wrapped = NULL;
 
purple_xfer_get_size_wrapped_fnc purple_xfer_get_size_wrapped = NULL;
 
purple_xfer_unref_wrapped_fnc purple_xfer_unref_wrapped = NULL;
 
purple_xfer_ref_wrapped_fnc purple_xfer_ref_wrapped = NULL;
 
purple_xfers_set_ui_ops_wrapped_fnc purple_xfers_set_ui_ops_wrapped = NULL;
 
purple_xfers_get_handle_wrapped_fnc purple_xfers_get_handle_wrapped = NULL;
 
purple_roomlist_set_ui_ops_wrapped_fnc purple_roomlist_set_ui_ops_wrapped = NULL;
 
purple_roomlist_get_list_wrapped_fnc purple_roomlist_get_list_wrapped = NULL;
 
purple_imgstore_get_data_wrapped_fnc purple_imgstore_get_data_wrapped = NULL;
 
purple_imgstore_get_size_wrapped_fnc purple_imgstore_get_size_wrapped = NULL;
 
purple_imgstore_unref_wrapped_fnc purple_imgstore_unref_wrapped = NULL;
 
purple_notify_user_info_new_wrapped_fnc purple_notify_user_info_new_wrapped = NULL;
 
purple_notify_user_info_destroy_wrapped_fnc purple_notify_user_info_destroy_wrapped = NULL;
 
purple_notify_user_info_get_entries_wrapped_fnc purple_notify_user_info_get_entries_wrapped = NULL;
 
purple_notify_user_info_entry_get_label_wrapped_fnc purple_notify_user_info_entry_get_label_wrapped = NULL;
 
purple_notify_user_info_entry_get_value_wrapped_fnc purple_notify_user_info_entry_get_value_wrapped = NULL;
 
purple_notify_set_ui_ops_wrapped_fnc purple_notify_set_ui_ops_wrapped = NULL;
 
purple_plugins_add_search_path_wrapped_fnc purple_plugins_add_search_path_wrapped = NULL;
 
purple_plugins_load_saved_wrapped_fnc purple_plugins_load_saved_wrapped = NULL;
 
purple_plugin_action_free_wrapped_fnc purple_plugin_action_free_wrapped = NULL;
 
purple_prefs_load_wrapped_fnc purple_prefs_load_wrapped = NULL;
 
purple_prefs_set_bool_wrapped_fnc purple_prefs_set_bool_wrapped = NULL;
 
purple_prefs_set_string_wrapped_fnc purple_prefs_set_string_wrapped = NULL;
 
purple_privacy_deny_wrapped_fnc purple_privacy_deny_wrapped = NULL;
 
purple_privacy_allow_wrapped_fnc purple_privacy_allow_wrapped = NULL;
 
purple_privacy_check_wrapped_fnc purple_privacy_check_wrapped = NULL;
 
purple_proxy_info_new_wrapped_fnc purple_proxy_info_new_wrapped = NULL;
 
purple_proxy_info_set_type_wrapped_fnc purple_proxy_info_set_type_wrapped = NULL;
 
purple_proxy_info_set_host_wrapped_fnc purple_proxy_info_set_host_wrapped = NULL;
 
purple_proxy_info_set_port_wrapped_fnc purple_proxy_info_set_port_wrapped = NULL;
 
purple_proxy_info_set_username_wrapped_fnc purple_proxy_info_set_username_wrapped = NULL;
 
purple_proxy_info_set_password_wrapped_fnc purple_proxy_info_set_password_wrapped = NULL;
 
purple_find_prpl_wrapped_fnc purple_find_prpl_wrapped = NULL;
 
purple_prpl_send_attention_wrapped_fnc purple_prpl_send_attention_wrapped = NULL;
 
purple_request_set_ui_ops_wrapped_fnc purple_request_set_ui_ops_wrapped = NULL;
 
serv_get_info_wrapped_fnc serv_get_info_wrapped = NULL;
 
serv_alias_buddy_wrapped_fnc serv_alias_buddy_wrapped = NULL;
 
serv_send_typing_wrapped_fnc serv_send_typing_wrapped = NULL;
 
serv_join_chat_wrapped_fnc serv_join_chat_wrapped = NULL;
 
purple_signal_connect_wrapped_fnc purple_signal_connect_wrapped = NULL;
 
purple_status_type_get_id_wrapped_fnc purple_status_type_get_id_wrapped = NULL;
 
purple_presence_get_active_status_wrapped_fnc purple_presence_get_active_status_wrapped = NULL;
 
purple_status_type_get_primitive_wrapped_fnc purple_status_type_get_primitive_wrapped = NULL;
 
purple_status_get_type_wrapped_fnc purple_status_get_type_wrapped = NULL;
 
purple_status_get_attr_string_wrapped_fnc purple_status_get_attr_string_wrapped = NULL;
 
purple_markup_escape_text_wrapped_fnc purple_markup_escape_text_wrapped = NULL;
 
purple_markup_strip_html_wrapped_fnc purple_markup_strip_html_wrapped = NULL;
 
purple_strdup_withhtml_wrapped_fnc purple_strdup_withhtml_wrapped = NULL;
 
purple_markup_html_to_xhtml_wrapped_fnc purple_markup_html_to_xhtml_wrapped = NULL;
 
purple_normalize_wrapped_fnc purple_normalize_wrapped = NULL;
 
purple_utf8_try_convert_wrapped_fnc purple_utf8_try_convert_wrapped = NULL;
 
purple_util_set_user_dir_wrapped_fnc purple_util_set_user_dir_wrapped = NULL;
 
wpurple_g_io_channel_win32_new_socket_wrapped_fnc wpurple_g_io_channel_win32_new_socket_wrapped = NULL;
 
#endif
 
bool resolvePurpleFunctions() {
 
#if PURPLE_RUNTIME
 
	f_hPurple = LoadLibrary(L"libpurple.dll");
 
	if (!f_hPurple)
 
			return false;
 
	purple_account_set_bool_wrapped = (purple_account_set_bool_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_bool");
 
	if (!purple_account_set_bool_wrapped)
 
		return false;
 

	
 
	purple_account_get_protocol_id_wrapped = (purple_account_get_protocol_id_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_protocol_id");
 
	if (!purple_account_get_protocol_id_wrapped)
 
		return false;
 

	
 
	purple_account_set_int_wrapped = (purple_account_set_int_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_int");
 
	if (!purple_account_set_int_wrapped)
 
		return false;
 

	
 
	purple_account_set_string_wrapped = (purple_account_set_string_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_string");
 
	if (!purple_account_set_string_wrapped)
 
		return false;
 

	
 
	purple_account_get_username_wrapped = (purple_account_get_username_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_username");
 
	if (!purple_account_get_username_wrapped)
 
		return false;
 

	
 
	purple_account_set_username_wrapped = (purple_account_set_username_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_username");
 
	if (!purple_account_set_username_wrapped)
 
		return false;
 

	
 
	purple_account_set_proxy_info_wrapped = (purple_account_set_proxy_info_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_proxy_info");
 
	if (!purple_account_set_proxy_info_wrapped)
 
		return false;
 

	
 
	purple_accounts_find_wrapped = (purple_accounts_find_wrapped_fnc)GetProcAddress(f_hPurple, "purple_accounts_find");
 
	if (!purple_accounts_find_wrapped)
 
		return false;
 

	
 
	purple_account_new_wrapped = (purple_account_new_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_new");
 
	if (!purple_account_new_wrapped)
 
		return false;
 

	
 
	purple_accounts_add_wrapped = (purple_accounts_add_wrapped_fnc)GetProcAddress(f_hPurple, "purple_accounts_add");
 
	if (!purple_accounts_add_wrapped)
 
		return false;
 

	
 
	purple_account_get_password_wrapped = (purple_account_get_password_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_password");
 
	        if (!purple_account_get_password_wrapped)
 
			                return false;
 

	
 
	purple_account_set_password_wrapped = (purple_account_set_password_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_password");
 
	if (!purple_account_set_password_wrapped)
 
		return false;
 

	
 
	purple_account_set_enabled_wrapped = (purple_account_set_enabled_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_enabled");
 
	if (!purple_account_set_enabled_wrapped)
 
		return false;
 

	
 
	purple_account_set_privacy_type_wrapped = (purple_account_set_privacy_type_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_privacy_type");
 
	if (!purple_account_set_privacy_type_wrapped)
 
		return false;
 

	
 
	purple_account_get_status_type_with_primitive_wrapped = (purple_account_get_status_type_with_primitive_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_status_type_with_primitive");
 
	if (!purple_account_get_status_type_with_primitive_wrapped)
 
		return false;
 

	
 
	purple_account_set_status_wrapped = (purple_account_set_status_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_status");
 
	if (!purple_account_set_status_wrapped)
 
		return false;
 

	
 
	purple_account_get_int_wrapped = (purple_account_get_int_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_int");
 
	if (!purple_account_get_int_wrapped)
 
		return false;
 

	
 
	purple_account_disconnect_wrapped = (purple_account_disconnect_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_disconnect");
 
	if (!purple_account_disconnect_wrapped)
 
		return false;
 

	
 
	purple_accounts_delete_wrapped = (purple_accounts_delete_wrapped_fnc)GetProcAddress(f_hPurple, "purple_accounts_delete");
 
	if (!purple_accounts_delete_wrapped)
 
		return false;
 

	
 
	purple_account_get_connection_wrapped = (purple_account_get_connection_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_connection");
 
	if (!purple_account_get_connection_wrapped)
 
		return false;
 

	
 
	purple_account_set_alias_wrapped = (purple_account_set_alias_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_alias");
 
	if (!purple_account_set_alias_wrapped)
 
		return false;
 

	
 
	purple_account_set_public_alias_wrapped = (purple_account_set_public_alias_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_set_public_alias");
 
	if (!purple_account_set_public_alias_wrapped)
 
		return false;
 

	
 
	purple_account_remove_buddy_wrapped = (purple_account_remove_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_remove_buddy");
 
	if (!purple_account_remove_buddy_wrapped)
 
		return false;
 

	
 
	purple_account_add_buddy_wrapped = (purple_account_add_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_add_buddy");
 
	if (!purple_account_add_buddy_wrapped)
 
		return false;
 

	
 
	purple_account_get_name_for_display_wrapped = (purple_account_get_name_for_display_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_get_name_for_display");
 
	if (!purple_account_get_name_for_display_wrapped)
 
		return false;
 

	
 
	purple_accounts_set_ui_ops_wrapped = (purple_accounts_set_ui_ops_wrapped_fnc)GetProcAddress(f_hPurple, "purple_accounts_set_ui_ops");
 
	if (!purple_accounts_set_ui_ops_wrapped)
 
		return false;
 
	purple_account_prefs_set_ui_ops_wrapped = (purple_account_prefs_set_ui_ops_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_prefs_set_ui_ops");
 
	if (!purple_account_prefs_set_ui_ops_wrapped)
 
		return false;
 

	
 
	purple_account_option_get_type_wrapped = (purple_account_option_get_type_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_option_get_type");
 
	if (!purple_account_option_get_type_wrapped)
 
		return false;
 

	
 
	purple_account_option_get_setting_wrapped = (purple_account_option_get_setting_wrapped_fnc)GetProcAddress(f_hPurple, "purple_account_option_get_setting");
 
	if (!purple_account_option_get_setting_wrapped)
 
		return false;
 

	
 
	purple_blist_node_get_type_wrapped = (purple_blist_node_get_type_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_node_get_type");
 
	if (!purple_blist_node_get_type_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_alias_wrapped = (purple_buddy_get_alias_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_alias");
 
	if (!purple_buddy_get_alias_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_server_alias_wrapped = (purple_buddy_get_server_alias_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_server_alias");
 
	if (!purple_buddy_get_server_alias_wrapped)
 
		return false;
 

	
 
	purple_find_buddy_wrapped = (purple_find_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_find_buddy");
 
	if (!purple_find_buddy_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_group_wrapped = (purple_buddy_get_group_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_group");
 
	if (!purple_buddy_get_group_wrapped)
 
		return false;
 

	
 
	purple_blist_remove_buddy_wrapped = (purple_blist_remove_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_remove_buddy");
 
	if (!purple_blist_remove_buddy_wrapped)
 
		return false;
 

	
 
	purple_blist_alias_buddy_wrapped = (purple_blist_alias_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_alias_buddy");
 
	if (!purple_blist_alias_buddy_wrapped)
 
		return false;
 

	
 
	purple_blist_server_alias_buddy_wrapped = (purple_blist_server_alias_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_server_alias_buddy");
 
	if (!purple_blist_server_alias_buddy_wrapped)
 
		return false;
 

	
 
	purple_find_group_wrapped = (purple_find_group_wrapped_fnc)GetProcAddress(f_hPurple, "purple_find_group");
 
	if (!purple_find_group_wrapped)
 
		return false;
 

	
 
	purple_group_new_wrapped = (purple_group_new_wrapped_fnc)GetProcAddress(f_hPurple, "purple_group_new");
 
	if (!purple_group_new_wrapped)
 
		return false;
 

	
 
	purple_blist_add_contact_wrapped = (purple_blist_add_contact_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_add_contact");
 
	if (!purple_blist_add_contact_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_contact_wrapped = (purple_buddy_get_contact_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_contact");
 
	if (!purple_buddy_get_contact_wrapped)
 
		return false;
 

	
 
	purple_buddy_new_wrapped = (purple_buddy_new_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_new");
 
	if (!purple_buddy_new_wrapped)
 
		return false;
 

	
 
	purple_blist_add_buddy_wrapped = (purple_blist_add_buddy_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_add_buddy");
 
	if (!purple_blist_add_buddy_wrapped)
 
		return false;
 

	
 
	purple_blist_find_chat_wrapped = (purple_blist_find_chat_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_find_chat");
 
	if (!purple_blist_find_chat_wrapped)
 
		return false;
 

	
 
	purple_chat_get_components_wrapped = (purple_chat_get_components_wrapped_fnc)GetProcAddress(f_hPurple, "purple_chat_get_components");
 
	if (!purple_chat_get_components_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_presence_wrapped = (purple_buddy_get_presence_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_presence");
 
	if (!purple_buddy_get_presence_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_account_wrapped = (purple_buddy_get_account_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_account");
 
	if (!purple_buddy_get_account_wrapped)
 
		return false;
 

	
 
	purple_buddy_get_name_wrapped = (purple_buddy_get_name_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_get_name");
 
	if (!purple_buddy_get_name_wrapped)
 
		return false;
 

	
 
	purple_find_buddies_wrapped = (purple_find_buddies_wrapped_fnc)GetProcAddress(f_hPurple, "purple_find_buddies");
 
	if (!purple_find_buddies_wrapped)
 
		return false;
 

	
 
	purple_group_get_name_wrapped = (purple_group_get_name_wrapped_fnc)GetProcAddress(f_hPurple, "purple_group_get_name");
 
	if (!purple_group_get_name_wrapped)
 
		return false;
 

	
 
	purple_blist_set_ui_ops_wrapped = (purple_blist_set_ui_ops_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_set_ui_ops");
 
	if (!purple_blist_set_ui_ops_wrapped)
 
		return false;
 

	
 
	purple_set_blist_wrapped = (purple_set_blist_wrapped_fnc)GetProcAddress(f_hPurple, "purple_set_blist");
 
	if (!purple_set_blist_wrapped)
 
		return false;
 

	
 
	purple_blist_new_wrapped = (purple_blist_new_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_new");
 
	if (!purple_blist_new_wrapped)
 
		return false;
 

	
 
	purple_blist_load_wrapped = (purple_blist_load_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_load");
 
	if (!purple_blist_load_wrapped)
 
		return false;
 

	
 
	purple_blist_get_handle_wrapped = (purple_blist_get_handle_wrapped_fnc)GetProcAddress(f_hPurple, "purple_blist_get_handle");
 
	if (!purple_blist_get_handle_wrapped)
 
		return false;
 

	
 
	purple_buddy_icons_set_account_icon_wrapped = (purple_buddy_icons_set_account_icon_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_icons_set_account_icon");
 
	if (!purple_buddy_icons_set_account_icon_wrapped)
 
		return false;
 

	
 
	purple_buddy_icons_find_wrapped = (purple_buddy_icons_find_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_icons_find");
 
	if (!purple_buddy_icons_find_wrapped)
 
		return false;
 

	
 
	purple_buddy_icon_get_full_path_wrapped = (purple_buddy_icon_get_full_path_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_icon_get_full_path");
 
	if (!purple_buddy_icon_get_full_path_wrapped)
 
		return false;
 

	
 
	purple_buddy_icon_unref_wrapped = (purple_buddy_icon_unref_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_icon_unref");
 
	if (!purple_buddy_icon_unref_wrapped)
 
		return false;
 

	
 
	purple_buddy_icons_find_account_icon_wrapped = (purple_buddy_icons_find_account_icon_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_icons_find_account_icon");
 
	if (!purple_buddy_icons_find_account_icon_wrapped)
 
		return false;
 

	
 
	purple_buddy_icon_get_data_wrapped = (purple_buddy_icon_get_data_wrapped_fnc)GetProcAddress(f_hPurple, "purple_buddy_icon_get_data");
 
	if (!purple_buddy_icon_get_data_wrapped)
 
		return false;
 

	
 
	purple_certificate_add_ca_search_path_wrapped = (purple_certificate_add_ca_search_path_wrapped_fnc)GetProcAddress(f_hPurple, "purple_certificate_add_ca_search_path");
 
	if (!purple_certificate_add_ca_search_path_wrapped)
 
		return false;
 

	
 
	purple_connection_get_state_wrapped = (purple_connection_get_state_wrapped_fnc)GetProcAddress(f_hPurple, "purple_connection_get_state");
 
	if (!purple_connection_get_state_wrapped)
 
		return false;
 

	
 
	purple_connection_get_account_wrapped = (purple_connection_get_account_wrapped_fnc)GetProcAddress(f_hPurple, "purple_connection_get_account");
 
	if (!purple_connection_get_account_wrapped)
 
		return false;
 

	
 
	purple_connection_get_display_name_wrapped = (purple_connection_get_display_name_wrapped_fnc)GetProcAddress(f_hPurple, "purple_connection_get_display_name");
 
	if (!purple_connection_get_display_name_wrapped)
 
		return false;
 

	
 
	purple_connections_set_ui_ops_wrapped = (purple_connections_set_ui_ops_wrapped_fnc)GetProcAddress(f_hPurple, "purple_connections_set_ui_ops");
 
	if (!purple_connections_set_ui_ops_wrapped)
 
		return false;
 

	
 
	purple_connections_get_handle_wrapped = (purple_connections_get_handle_wrapped_fnc)GetProcAddress(f_hPurple, "purple_connections_get_handle");
 
	if (!purple_connections_get_handle_wrapped)
 
		return false;
 

	
 
	purple_conversation_get_im_data_wrapped = (purple_conversation_get_im_data_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conversation_get_im_data");
 
	if (!purple_conversation_get_im_data_wrapped)
 
		return false;
 

	
 
	purple_conversation_get_chat_data_wrapped = (purple_conversation_get_chat_data_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conversation_get_chat_data");
 
	if (!purple_conversation_get_chat_data_wrapped)
 
		return false;
 

	
 
	purple_find_conversation_with_account_wrapped = (purple_find_conversation_with_account_wrapped_fnc)GetProcAddress(f_hPurple, "purple_find_conversation_with_account");
 
	if (!purple_find_conversation_with_account_wrapped)
 
		return false;
 

	
 
	purple_conversation_new_wrapped = (purple_conversation_new_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conversation_new");
 
	if (!purple_conversation_new_wrapped)
 
		return false;
 

	
 
	purple_conversation_get_type_wrapped = (purple_conversation_get_type_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conversation_get_type");
 
	if (!purple_conversation_get_type_wrapped)
 
		return false;
 

	
 
	purple_conv_im_send_wrapped = (purple_conv_im_send_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conv_im_send");
 
	if (!purple_conv_im_send_wrapped)
 
		return false;
 

	
 
	purple_conv_im_send_with_flags_wrapped = (purple_conv_im_send_with_flags_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conv_im_send_with_flags");
 
	if (!purple_conv_im_send_with_flags_wrapped)
 
		return false;
 

	
 
	purple_conv_chat_send_wrapped = (purple_conv_chat_send_wrapped_fnc)GetProcAddress(f_hPurple, "purple_conv_chat_send");
 
	if (!purple_conv_chat_send_wrapped)
 
		return false;
backends/libpurple/purple_defs.h
Show inline comments
 
#pragma once
 
#if PURPLE_RUNTIME
 

	
 
#include <Windows.h>
 
#include <purple.h>
 

	
 
#define PURPLE_BLIST_NODE_IS_CHAT_WRAPPED(n)    (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_CHAT_NODE)
 
#define PURPLE_BLIST_NODE_IS_BUDDY_WRAPPED(n)   (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_BUDDY_NODE)
 
#define PURPLE_BLIST_NODE_IS_CONTACT_WRAPPED(n) (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_CONTACT_NODE)
 
#define PURPLE_BLIST_NODE_IS_GROUP_WRAPPED(n)   (purple_blist_node_get_type_wrapped(n) == PURPLE_BLIST_GROUP_NODE)
 

	
 
#define PURPLE_CONV_IM_WRAPPED(c) (purple_conversation_get_im_data_wrapped(c))
 
#define PURPLE_CONV_CHAT_WRAPPED(c) (purple_conversation_get_chat_data_wrapped(c))
 

	
 
#define PURPLE_CONNECTION_IS_CONNECTED_WRAPPED(gc) 	(purple_connection_get_state_wrapped(gc) == PURPLE_CONNECTED)
 

	
 
typedef void  (_cdecl * purple_account_set_bool_wrapped_fnc)(PurpleAccount *account, const char *name, gboolean value);
 
extern purple_account_set_bool_wrapped_fnc purple_account_set_bool_wrapped;
 

	
 
typedef const char * (_cdecl * purple_account_get_protocol_id_wrapped_fnc)(const PurpleAccount *account);
 
extern purple_account_get_protocol_id_wrapped_fnc purple_account_get_protocol_id_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_int_wrapped_fnc)(PurpleAccount *account, const char *name, int value);
 
extern purple_account_set_int_wrapped_fnc purple_account_set_int_wrapped;
 

	
 
typedef const char * (_cdecl * purple_account_get_string_wrapped_fnc)(PurpleAccount *account, const char *name, const char *default_value);
 
extern purple_account_get_string_wrapped_fnc purple_account_get_string_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_string_wrapped_fnc)(PurpleAccount *account, const char *name, const char *value);
 
extern purple_account_set_string_wrapped_fnc purple_account_set_string_wrapped;
 

	
 
typedef const char * (_cdecl * purple_account_get_username_wrapped_fnc)(const PurpleAccount *account);
 
extern purple_account_get_username_wrapped_fnc purple_account_get_username_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_username_wrapped_fnc)(PurpleAccount *account, const char *username);
 
extern purple_account_set_username_wrapped_fnc purple_account_set_username_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_proxy_info_wrapped_fnc)(PurpleAccount *account, PurpleProxyInfo *info);
 
extern purple_account_set_proxy_info_wrapped_fnc purple_account_set_proxy_info_wrapped;
 

	
 
typedef PurpleAccount * (_cdecl * purple_accounts_find_wrapped_fnc)(const char *name, const char *protocol);
 
extern purple_accounts_find_wrapped_fnc purple_accounts_find_wrapped;
 

	
 
typedef PurpleAccount * (_cdecl * purple_account_new_wrapped_fnc)(const char *username, const char *protocol_id);
 
extern purple_account_new_wrapped_fnc purple_account_new_wrapped;
 

	
 
typedef void  (_cdecl * purple_accounts_add_wrapped_fnc)(PurpleAccount *account);
 
extern purple_accounts_add_wrapped_fnc purple_accounts_add_wrapped;
 

	
 
typedef const char *  (_cdecl * purple_account_get_password_wrapped_fnc)(const PurpleAccount *account);
 
extern purple_account_get_password_wrapped_fnc purple_account_get_password_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_password_wrapped_fnc)(PurpleAccount *account, const char *password);
 
extern purple_account_set_password_wrapped_fnc purple_account_set_password_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_enabled_wrapped_fnc)(PurpleAccount *account, const char *ui, gboolean value);
 
extern purple_account_set_enabled_wrapped_fnc purple_account_set_enabled_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_privacy_type_wrapped_fnc)(PurpleAccount *account, PurplePrivacyType privacy_type);
 
extern purple_account_set_privacy_type_wrapped_fnc purple_account_set_privacy_type_wrapped;
 

	
 
typedef PurpleStatusType * (_cdecl * purple_account_get_status_type_with_primitive_wrapped_fnc)( const PurpleAccount *account, PurpleStatusPrimitive primitive);
 
extern purple_account_get_status_type_with_primitive_wrapped_fnc purple_account_get_status_type_with_primitive_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_status_wrapped_fnc)(PurpleAccount *account, const char *status_id, gboolean active, ...);
 
extern purple_account_set_status_wrapped_fnc purple_account_set_status_wrapped;
 

	
 
typedef int  (_cdecl * purple_account_get_int_wrapped_fnc)(const PurpleAccount *account, const char *name, int default_value);
 
extern purple_account_get_int_wrapped_fnc purple_account_get_int_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_disconnect_wrapped_fnc)(PurpleAccount *account);
 
extern purple_account_disconnect_wrapped_fnc purple_account_disconnect_wrapped;
 

	
 
typedef void  (_cdecl * purple_accounts_delete_wrapped_fnc)(PurpleAccount *account);
 
extern purple_accounts_delete_wrapped_fnc purple_accounts_delete_wrapped;
 

	
 
typedef PurpleConnection * (_cdecl * purple_account_get_connection_wrapped_fnc)(const PurpleAccount *account);
 
extern purple_account_get_connection_wrapped_fnc purple_account_get_connection_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_alias_wrapped_fnc)(PurpleAccount *account, const char *alias);
 
extern purple_account_set_alias_wrapped_fnc purple_account_set_alias_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_set_public_alias_wrapped_fnc)(PurpleAccount *account, const char *alias, PurpleSetPublicAliasSuccessCallback success_cb, PurpleSetPublicAliasFailureCallback failure_cb);
 
extern purple_account_set_public_alias_wrapped_fnc purple_account_set_public_alias_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_remove_buddy_wrapped_fnc)(PurpleAccount *account, PurpleBuddy *buddy, PurpleGroup *group);
 
extern purple_account_remove_buddy_wrapped_fnc purple_account_remove_buddy_wrapped;
 

	
 
typedef void  (_cdecl * purple_account_add_buddy_wrapped_fnc)(PurpleAccount *account, PurpleBuddy *buddy);
 
extern purple_account_add_buddy_wrapped_fnc purple_account_add_buddy_wrapped;
 

	
 
typedef const gchar * (_cdecl * purple_account_get_name_for_display_wrapped_fnc)(const PurpleAccount *account);
 
extern purple_account_get_name_for_display_wrapped_fnc purple_account_get_name_for_display_wrapped;
 

	
 
typedef void  (_cdecl * purple_accounts_set_ui_ops_wrapped_fnc)(PurpleAccountUiOps *ops);
 
extern purple_accounts_set_ui_ops_wrapped_fnc purple_accounts_set_ui_ops_wrapped;
 

	
 
typedef void (_cdecl * purple_account_prefs_set_ui_ops_wrapped_fnc)(PurpleAccountPrefUiOps *ops);
 
extern purple_account_prefs_set_ui_ops_wrapped_fnc purple_account_pref_set_ui_ops_wrapped;
 

	
 
typedef PurplePrefType  (_cdecl * purple_account_option_get_type_wrapped_fnc)(const PurpleAccountOption *option);
 
extern purple_account_option_get_type_wrapped_fnc purple_account_option_get_type_wrapped;
 

	
 
typedef const char * (_cdecl * purple_account_option_get_setting_wrapped_fnc)(const PurpleAccountOption *option);
 
extern purple_account_option_get_setting_wrapped_fnc purple_account_option_get_setting_wrapped;
 

	
 
typedef PurpleBlistNodeType  (_cdecl * purple_blist_node_get_type_wrapped_fnc)(PurpleBlistNode *node);
 
extern purple_blist_node_get_type_wrapped_fnc purple_blist_node_get_type_wrapped;
 

	
 
typedef const char * (_cdecl * purple_buddy_get_alias_wrapped_fnc)(PurpleBuddy *buddy);
 
extern purple_buddy_get_alias_wrapped_fnc purple_buddy_get_alias_wrapped;
 

	
 
typedef const char * (_cdecl * purple_buddy_get_server_alias_wrapped_fnc)(PurpleBuddy *buddy);
 
extern purple_buddy_get_server_alias_wrapped_fnc purple_buddy_get_server_alias_wrapped;
 

	
 
typedef PurpleBuddy * (_cdecl * purple_find_buddy_wrapped_fnc)(PurpleAccount *account, const char *name);
 
extern purple_find_buddy_wrapped_fnc purple_find_buddy_wrapped;
 

	
 
typedef PurpleGroup * (_cdecl * purple_buddy_get_group_wrapped_fnc)(PurpleBuddy *buddy);
 
extern purple_buddy_get_group_wrapped_fnc purple_buddy_get_group_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_remove_buddy_wrapped_fnc)(PurpleBuddy *buddy);
 
extern purple_blist_remove_buddy_wrapped_fnc purple_blist_remove_buddy_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_alias_buddy_wrapped_fnc)(PurpleBuddy *buddy, const char *alias);
 
extern purple_blist_alias_buddy_wrapped_fnc purple_blist_alias_buddy_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_server_alias_buddy_wrapped_fnc)(PurpleBuddy *buddy, const char *alias);
 
extern purple_blist_server_alias_buddy_wrapped_fnc purple_blist_server_alias_buddy_wrapped;
 

	
 
typedef PurpleGroup * (_cdecl * purple_find_group_wrapped_fnc)(const char *name);
 
extern purple_find_group_wrapped_fnc purple_find_group_wrapped;
 

	
 
typedef PurpleGroup * (_cdecl * purple_group_new_wrapped_fnc)(const char *name);
 
extern purple_group_new_wrapped_fnc purple_group_new_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_add_contact_wrapped_fnc)(PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node);
 
extern purple_blist_add_contact_wrapped_fnc purple_blist_add_contact_wrapped;
 

	
 
typedef PurpleContact * (_cdecl * purple_buddy_get_contact_wrapped_fnc)(PurpleBuddy *buddy);
 
extern purple_buddy_get_contact_wrapped_fnc purple_buddy_get_contact_wrapped;
 

	
 
typedef PurpleBuddy * (_cdecl * purple_buddy_new_wrapped_fnc)(PurpleAccount *account, const char *name, const char *alias);
 
extern purple_buddy_new_wrapped_fnc purple_buddy_new_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_add_buddy_wrapped_fnc)(PurpleBuddy *buddy, PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node);
 
extern purple_blist_add_buddy_wrapped_fnc purple_blist_add_buddy_wrapped;
 

	
 
typedef PurpleChat * (_cdecl * purple_blist_find_chat_wrapped_fnc)(PurpleAccount *account, const char *name);
 
extern purple_blist_find_chat_wrapped_fnc purple_blist_find_chat_wrapped;
 

	
 
typedef GHashTable * (_cdecl * purple_chat_get_components_wrapped_fnc)(PurpleChat *chat);
 
extern purple_chat_get_components_wrapped_fnc purple_chat_get_components_wrapped;
 

	
 
typedef PurplePresence * (_cdecl * purple_buddy_get_presence_wrapped_fnc)(const PurpleBuddy *buddy);
 
extern purple_buddy_get_presence_wrapped_fnc purple_buddy_get_presence_wrapped;
 

	
 
typedef PurpleAccount * (_cdecl * purple_buddy_get_account_wrapped_fnc)(const PurpleBuddy *buddy);
 
extern purple_buddy_get_account_wrapped_fnc purple_buddy_get_account_wrapped;
 

	
 
typedef const char * (_cdecl * purple_buddy_get_name_wrapped_fnc)(const PurpleBuddy *buddy);
 
extern purple_buddy_get_name_wrapped_fnc purple_buddy_get_name_wrapped;
 

	
 
typedef GSList * (_cdecl * purple_find_buddies_wrapped_fnc)(PurpleAccount *account, const char *name);
 
extern purple_find_buddies_wrapped_fnc purple_find_buddies_wrapped;
 

	
 
typedef const char * (_cdecl * purple_group_get_name_wrapped_fnc)(PurpleGroup *group);
 
extern purple_group_get_name_wrapped_fnc purple_group_get_name_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_set_ui_ops_wrapped_fnc)(PurpleBlistUiOps *ops);
 
extern purple_blist_set_ui_ops_wrapped_fnc purple_blist_set_ui_ops_wrapped;
 

	
 
typedef void  (_cdecl * purple_set_blist_wrapped_fnc)(PurpleBuddyList *blist);
 
extern purple_set_blist_wrapped_fnc purple_set_blist_wrapped;
 

	
 
typedef PurpleBuddyList * (_cdecl * purple_blist_new_wrapped_fnc)(void);
 
extern purple_blist_new_wrapped_fnc purple_blist_new_wrapped;
 

	
 
typedef void  (_cdecl * purple_blist_load_wrapped_fnc)(void);
 
extern purple_blist_load_wrapped_fnc purple_blist_load_wrapped;
 

	
 
typedef void * (_cdecl * purple_blist_get_handle_wrapped_fnc)(void);
 
extern purple_blist_get_handle_wrapped_fnc purple_blist_get_handle_wrapped;
 

	
 
typedef PurpleStoredImage * (_cdecl * purple_buddy_icons_set_account_icon_wrapped_fnc)(PurpleAccount *account, guchar *icon_data, size_t icon_len);
 
extern purple_buddy_icons_set_account_icon_wrapped_fnc purple_buddy_icons_set_account_icon_wrapped;
 

	
 
typedef PurpleBuddyIcon * (_cdecl * purple_buddy_icons_find_wrapped_fnc)(PurpleAccount *account, const char *username);
 
extern purple_buddy_icons_find_wrapped_fnc purple_buddy_icons_find_wrapped;
 

	
 
typedef char * (_cdecl * purple_buddy_icon_get_full_path_wrapped_fnc)(PurpleBuddyIcon *icon);
 
extern purple_buddy_icon_get_full_path_wrapped_fnc purple_buddy_icon_get_full_path_wrapped;
 

	
 
typedef PurpleBuddyIcon * (_cdecl * purple_buddy_icon_unref_wrapped_fnc)(PurpleBuddyIcon *icon);
 
extern purple_buddy_icon_unref_wrapped_fnc purple_buddy_icon_unref_wrapped;
 

	
 
typedef PurpleStoredImage * (_cdecl * purple_buddy_icons_find_account_icon_wrapped_fnc)(PurpleAccount *account);
 
extern purple_buddy_icons_find_account_icon_wrapped_fnc purple_buddy_icons_find_account_icon_wrapped;
 

	
 
typedef gconstpointer  (_cdecl * purple_buddy_icon_get_data_wrapped_fnc)(const PurpleBuddyIcon *icon, size_t *len);
 
extern purple_buddy_icon_get_data_wrapped_fnc purple_buddy_icon_get_data_wrapped;
 

	
 
typedef void  (_cdecl * purple_certificate_add_ca_search_path_wrapped_fnc)(const char *path);
 
extern purple_certificate_add_ca_search_path_wrapped_fnc purple_certificate_add_ca_search_path_wrapped;
 

	
 
typedef PurpleConnectionState  (_cdecl * purple_connection_get_state_wrapped_fnc)(const PurpleConnection *gc);
 
extern purple_connection_get_state_wrapped_fnc purple_connection_get_state_wrapped;
 

	
 
typedef PurpleAccount * (_cdecl * purple_connection_get_account_wrapped_fnc)(const PurpleConnection *gc);
 
extern purple_connection_get_account_wrapped_fnc purple_connection_get_account_wrapped;
 

	
 
typedef const char * (_cdecl * purple_connection_get_display_name_wrapped_fnc)(const PurpleConnection *gc);
 
extern purple_connection_get_display_name_wrapped_fnc purple_connection_get_display_name_wrapped;
 

	
 
typedef void  (_cdecl * purple_connections_set_ui_ops_wrapped_fnc)(PurpleConnectionUiOps *ops);
 
extern purple_connections_set_ui_ops_wrapped_fnc purple_connections_set_ui_ops_wrapped;
 

	
 
typedef void * (_cdecl * purple_connections_get_handle_wrapped_fnc)(void);
 
extern purple_connections_get_handle_wrapped_fnc purple_connections_get_handle_wrapped;
 

	
 
typedef PurpleConvIm * (_cdecl * purple_conversation_get_im_data_wrapped_fnc)(const PurpleConversation *conv);
 
extern purple_conversation_get_im_data_wrapped_fnc purple_conversation_get_im_data_wrapped;
 

	
 
typedef PurpleConvChat * (_cdecl * purple_conversation_get_chat_data_wrapped_fnc)(const PurpleConversation *conv);
 
extern purple_conversation_get_chat_data_wrapped_fnc purple_conversation_get_chat_data_wrapped;
 

	
 
typedef PurpleConversation * (_cdecl * purple_find_conversation_with_account_wrapped_fnc)( PurpleConversationType type, const char *name, const PurpleAccount *account);
 
extern purple_find_conversation_with_account_wrapped_fnc purple_find_conversation_with_account_wrapped;
 

	
 
typedef PurpleConversation * (_cdecl * purple_conversation_new_wrapped_fnc)(PurpleConversationType type, PurpleAccount *account, const char *name);
 
extern purple_conversation_new_wrapped_fnc purple_conversation_new_wrapped;
 

	
 
typedef PurpleConversationType  (_cdecl * purple_conversation_get_type_wrapped_fnc)(const PurpleConversation *conv);
 
extern purple_conversation_get_type_wrapped_fnc purple_conversation_get_type_wrapped;
 

	
 
typedef void (_cdecl * purple_conversation_set_data_wrapped_func)(const PurpleConversation *conv, const char *key, gpointer data); 
 
extern purple_conversation_set_data_wrapped_func purple_conversation_set_data_wrapped;
 

	
 
typedef void (_cdecl * purple_conversation_update_wrapped_func)(const PurpleConversation *conv, PurpleConversationUpdateType type); 
 
extern purple_conversation_update_wrapped_func purple_conversation_update_wrapped;
 

	
 
typedef void  (_cdecl * purple_conv_im_send_wrapped_fnc)(PurpleConvIm *im, const char *message);
 
extern purple_conv_im_send_wrapped_fnc purple_conv_im_send_wrapped;
 

	
 
typedef void  (_cdecl * purple_conv_im_send_with_flags_wrapped_fnc)(PurpleConvIm *im, const char *message, PurpleMessageFlags flags);
 
extern purple_conv_im_send_with_flags_wrapped_fnc purple_conv_im_send_with_flags_wrapped;
 

	
 
typedef void  (_cdecl * purple_conv_chat_send_wrapped_fnc)(PurpleConvChat *chat, const char *message);
 
extern purple_conv_chat_send_wrapped_fnc purple_conv_chat_send_wrapped;
 

	
 
typedef void  (_cdecl * purple_conv_chat_send_with_flags_wrapped_fnc)(PurpleConvChat *chat, const char *message, PurpleMessageFlags flags);
 
extern purple_conv_chat_send_with_flags_wrapped_fnc purple_conv_chat_send_with_flags_wrapped;
 

	
 
typedef void  (_cdecl * purple_conversation_destroy_wrapped_fnc)(PurpleConversation *conv);
 
extern purple_conversation_destroy_wrapped_fnc purple_conversation_destroy_wrapped;
 

	
 
typedef PurpleAccount * (_cdecl * purple_conversation_get_account_wrapped_fnc)(const PurpleConversation *conv);
 
extern purple_conversation_get_account_wrapped_fnc purple_conversation_get_account_wrapped;
 

	
 
typedef const char * (_cdecl * purple_conversation_get_name_wrapped_fnc)(const PurpleConversation *conv);
 
extern purple_conversation_get_name_wrapped_fnc purple_conversation_get_name_wrapped;
 

	
 
typedef void  (_cdecl * purple_conversations_set_ui_ops_wrapped_fnc)(PurpleConversationUiOps *ops);
 
extern purple_conversations_set_ui_ops_wrapped_fnc purple_conversations_set_ui_ops_wrapped;
 

	
 
typedef void * (_cdecl * purple_conversations_get_handle_wrapped_fnc)(void);
 
extern purple_conversations_get_handle_wrapped_fnc purple_conversations_get_handle_wrapped;
 

	
 
typedef void  (_cdecl * purple_core_set_ui_ops_wrapped_fnc)(PurpleCoreUiOps *ops);
 
extern purple_core_set_ui_ops_wrapped_fnc purple_core_set_ui_ops_wrapped;
 

	
 
typedef gboolean  (_cdecl * purple_core_init_wrapped_fnc)(const char *ui);
 
extern purple_core_init_wrapped_fnc purple_core_init_wrapped;
 

	
 
typedef void  (_cdecl * purple_debug_set_ui_ops_wrapped_fnc)(PurpleDebugUiOps *ops);
 
extern purple_debug_set_ui_ops_wrapped_fnc purple_debug_set_ui_ops_wrapped;
 

	
 
typedef void  (_cdecl * purple_debug_set_verbose_wrapped_fnc)(gboolean verbose);
 
extern purple_debug_set_verbose_wrapped_fnc purple_debug_set_verbose_wrapped;
 

	
 
typedef void  (_cdecl * purple_dnsquery_set_ui_ops_wrapped_fnc)(PurpleDnsQueryUiOps *ops);
 
extern purple_dnsquery_set_ui_ops_wrapped_fnc purple_dnsquery_set_ui_ops_wrapped;
 

	
 
typedef gboolean  (_cdecl * purple_timeout_remove_wrapped_fnc)(guint handle);
 
extern purple_timeout_remove_wrapped_fnc purple_timeout_remove_wrapped;
 

	
 
typedef guint  (_cdecl * purple_input_add_wrapped_fnc)(int fd, PurpleInputCondition cond, PurpleInputFunction func, gpointer user_data);
 
extern purple_input_add_wrapped_fnc purple_input_add_wrapped;
 

	
 
typedef guint  (_cdecl * purple_timeout_add_wrapped_fnc)(guint interval, GSourceFunc function, gpointer data);
 
extern purple_timeout_add_wrapped_fnc purple_timeout_add_wrapped;
 

	
 
@@ -319,320 +322,321 @@ extern purple_xfer_unref_wrapped_fnc purple_xfer_unref_wrapped;
 

	
 
typedef void  (_cdecl * purple_xfer_ref_wrapped_fnc)(PurpleXfer *xfer);
 
extern purple_xfer_ref_wrapped_fnc purple_xfer_ref_wrapped;
 

	
 
typedef void  (_cdecl * purple_xfers_set_ui_ops_wrapped_fnc)(PurpleXferUiOps *ops);
 
extern purple_xfers_set_ui_ops_wrapped_fnc purple_xfers_set_ui_ops_wrapped;
 

	
 
typedef void * (_cdecl * purple_xfers_get_handle_wrapped_fnc)(void);
 
extern purple_xfers_get_handle_wrapped_fnc purple_xfers_get_handle_wrapped;
 

	
 
typedef void (_cdecl * purple_roomlist_set_ui_ops_wrapped_fnc)(PurpleRoomlistUiOps *ops);
 
extern purple_roomlist_set_ui_ops_wrapped_fnc purple_roomlist_set_ui_ops_wrapped;
 

	
 
typedef PurpleRoomlist * (_cdecl * purple_roomlist_get_list_wrapped_fnc)(PurpleConnection *con);
 
extern purple_roomlist_get_list_wrapped_fnc purple_roomlist_get_list_wrapped;
 

	
 
typedef gconstpointer  (_cdecl * purple_imgstore_get_data_wrapped_fnc)(PurpleStoredImage *img);
 
extern purple_imgstore_get_data_wrapped_fnc purple_imgstore_get_data_wrapped;
 

	
 
typedef size_t  (_cdecl * purple_imgstore_get_size_wrapped_fnc)(PurpleStoredImage *img);
 
extern purple_imgstore_get_size_wrapped_fnc purple_imgstore_get_size_wrapped;
 

	
 
typedef PurpleStoredImage * (_cdecl * purple_imgstore_unref_wrapped_fnc)(PurpleStoredImage *img);
 
extern purple_imgstore_unref_wrapped_fnc purple_imgstore_unref_wrapped;
 

	
 
typedef PurpleNotifyUserInfo * (_cdecl * purple_notify_user_info_new_wrapped_fnc)(void);
 
extern purple_notify_user_info_new_wrapped_fnc purple_notify_user_info_new_wrapped;
 

	
 
typedef void  (_cdecl * purple_notify_user_info_destroy_wrapped_fnc)(PurpleNotifyUserInfo *user_info);
 
extern purple_notify_user_info_destroy_wrapped_fnc purple_notify_user_info_destroy_wrapped;
 

	
 
typedef GList * (_cdecl * purple_notify_user_info_get_entries_wrapped_fnc)(PurpleNotifyUserInfo *user_info);
 
extern purple_notify_user_info_get_entries_wrapped_fnc purple_notify_user_info_get_entries_wrapped;
 

	
 
typedef const gchar * (_cdecl * purple_notify_user_info_entry_get_label_wrapped_fnc)(PurpleNotifyUserInfoEntry *user_info_entry);
 
extern purple_notify_user_info_entry_get_label_wrapped_fnc purple_notify_user_info_entry_get_label_wrapped;
 

	
 
typedef const gchar * (_cdecl * purple_notify_user_info_entry_get_value_wrapped_fnc)(PurpleNotifyUserInfoEntry *user_info_entry);
 
extern purple_notify_user_info_entry_get_value_wrapped_fnc purple_notify_user_info_entry_get_value_wrapped;
 

	
 
typedef void  (_cdecl * purple_notify_set_ui_ops_wrapped_fnc)(PurpleNotifyUiOps *ops);
 
extern purple_notify_set_ui_ops_wrapped_fnc purple_notify_set_ui_ops_wrapped;
 

	
 
typedef void  (_cdecl * purple_plugins_add_search_path_wrapped_fnc)(const char *path);
 
extern purple_plugins_add_search_path_wrapped_fnc purple_plugins_add_search_path_wrapped;
 

	
 
typedef void  (_cdecl * purple_plugins_load_saved_wrapped_fnc)(const char *key);
 
extern purple_plugins_load_saved_wrapped_fnc purple_plugins_load_saved_wrapped;
 

	
 
typedef void  (_cdecl * purple_plugin_action_free_wrapped_fnc)(PurplePluginAction *action);
 
extern purple_plugin_action_free_wrapped_fnc purple_plugin_action_free_wrapped;
 

	
 
typedef gboolean  (_cdecl * purple_prefs_load_wrapped_fnc)(void);
 
extern purple_prefs_load_wrapped_fnc purple_prefs_load_wrapped;
 

	
 
typedef void  (_cdecl * purple_prefs_set_bool_wrapped_fnc)(const char *name, gboolean value);
 
extern purple_prefs_set_bool_wrapped_fnc purple_prefs_set_bool_wrapped;
 

	
 
typedef void  (_cdecl * purple_prefs_set_string_wrapped_fnc)(const char *name, const char *value);
 
extern purple_prefs_set_string_wrapped_fnc purple_prefs_set_string_wrapped;
 

	
 
typedef void  (_cdecl * purple_privacy_deny_wrapped_fnc)(PurpleAccount *account, const char *who, gboolean local, gboolean restore);
 
extern purple_privacy_deny_wrapped_fnc purple_privacy_deny_wrapped;
 

	
 
typedef void  (_cdecl * purple_privacy_allow_wrapped_fnc)(PurpleAccount *account, const char *who, gboolean local, gboolean restore);
 
extern purple_privacy_allow_wrapped_fnc purple_privacy_allow_wrapped;
 

	
 
typedef gboolean  (_cdecl * purple_privacy_check_wrapped_fnc)(PurpleAccount *account, const char *who);
 
extern purple_privacy_check_wrapped_fnc purple_privacy_check_wrapped;
 

	
 
typedef PurpleProxyInfo * (_cdecl * purple_proxy_info_new_wrapped_fnc)(void);
 
extern purple_proxy_info_new_wrapped_fnc purple_proxy_info_new_wrapped;
 

	
 
typedef void  (_cdecl * purple_proxy_info_set_type_wrapped_fnc)(PurpleProxyInfo *info, PurpleProxyType type);
 
extern purple_proxy_info_set_type_wrapped_fnc purple_proxy_info_set_type_wrapped;
 

	
 
typedef void  (_cdecl * purple_proxy_info_set_host_wrapped_fnc)(PurpleProxyInfo *info, const char *host);
 
extern purple_proxy_info_set_host_wrapped_fnc purple_proxy_info_set_host_wrapped;
 

	
 
typedef void  (_cdecl * purple_proxy_info_set_port_wrapped_fnc)(PurpleProxyInfo *info, int port);
 
extern purple_proxy_info_set_port_wrapped_fnc purple_proxy_info_set_port_wrapped;
 

	
 
typedef void  (_cdecl * purple_proxy_info_set_username_wrapped_fnc)(PurpleProxyInfo *info, const char *username);
 
extern purple_proxy_info_set_username_wrapped_fnc purple_proxy_info_set_username_wrapped;
 

	
 
typedef void  (_cdecl * purple_proxy_info_set_password_wrapped_fnc)(PurpleProxyInfo *info, const char *password);
 
extern purple_proxy_info_set_password_wrapped_fnc purple_proxy_info_set_password_wrapped;
 

	
 
typedef PurplePlugin * (_cdecl * purple_find_prpl_wrapped_fnc)(const char *id);
 
extern purple_find_prpl_wrapped_fnc purple_find_prpl_wrapped;
 

	
 
typedef void  (_cdecl * purple_prpl_send_attention_wrapped_fnc)(PurpleConnection *gc, const char *who, guint type_code);
 
extern purple_prpl_send_attention_wrapped_fnc purple_prpl_send_attention_wrapped;
 

	
 
typedef void  (_cdecl * purple_request_set_ui_ops_wrapped_fnc)(PurpleRequestUiOps *ops);
 
extern purple_request_set_ui_ops_wrapped_fnc purple_request_set_ui_ops_wrapped;
 

	
 
typedef void  (_cdecl * serv_get_info_wrapped_fnc)(PurpleConnection *, const char *);
 
extern serv_get_info_wrapped_fnc serv_get_info_wrapped;
 

	
 
typedef void  (_cdecl * serv_alias_buddy_wrapped_fnc)(PurpleBuddy *);
 
extern serv_alias_buddy_wrapped_fnc serv_alias_buddy_wrapped;
 

	
 
typedef unsigned int  (_cdecl * serv_send_typing_wrapped_fnc)(PurpleConnection *gc, const char *name, PurpleTypingState state);
 
extern serv_send_typing_wrapped_fnc serv_send_typing_wrapped;
 

	
 
typedef void  (_cdecl * serv_join_chat_wrapped_fnc)(PurpleConnection *, GHashTable *data);
 
extern serv_join_chat_wrapped_fnc serv_join_chat_wrapped;
 

	
 
typedef gulong  (_cdecl * purple_signal_connect_wrapped_fnc)(void *instance, const char *signal, void *handle, PurpleCallback func, void *data);
 
extern purple_signal_connect_wrapped_fnc purple_signal_connect_wrapped;
 

	
 
typedef const char * (_cdecl * purple_status_type_get_id_wrapped_fnc)(const PurpleStatusType *status_type);
 
extern purple_status_type_get_id_wrapped_fnc purple_status_type_get_id_wrapped;
 

	
 
typedef PurpleStatus * (_cdecl * purple_presence_get_active_status_wrapped_fnc)(const PurplePresence *presence);
 
extern purple_presence_get_active_status_wrapped_fnc purple_presence_get_active_status_wrapped;
 

	
 
typedef PurpleStatusPrimitive  (_cdecl * purple_status_type_get_primitive_wrapped_fnc)( const PurpleStatusType *status_type);
 
extern purple_status_type_get_primitive_wrapped_fnc purple_status_type_get_primitive_wrapped;
 

	
 
typedef PurpleStatusType * (_cdecl * purple_status_get_type_wrapped_fnc)(const PurpleStatus *status);
 
extern purple_status_get_type_wrapped_fnc purple_status_get_type_wrapped;
 

	
 
typedef const char * (_cdecl * purple_status_get_attr_string_wrapped_fnc)(const PurpleStatus *status, const char *id);
 
extern purple_status_get_attr_string_wrapped_fnc purple_status_get_attr_string_wrapped;
 

	
 
typedef gchar * (_cdecl * purple_markup_escape_text_wrapped_fnc)(const gchar *text, gssize length);
 
extern purple_markup_escape_text_wrapped_fnc purple_markup_escape_text_wrapped;
 

	
 
typedef char * (_cdecl * purple_markup_strip_html_wrapped_fnc)(const char *str);
 
extern purple_markup_strip_html_wrapped_fnc purple_markup_strip_html_wrapped;
 

	
 
typedef gchar * (_cdecl * purple_strdup_withhtml_wrapped_fnc)(const gchar *src);
 
extern purple_strdup_withhtml_wrapped_fnc purple_strdup_withhtml_wrapped;
 

	
 
typedef void  (_cdecl * purple_markup_html_to_xhtml_wrapped_fnc)(const char *html, char **dest_xhtml, char **dest_plain);
 
extern purple_markup_html_to_xhtml_wrapped_fnc purple_markup_html_to_xhtml_wrapped;
 

	
 
typedef const char * (_cdecl * purple_normalize_wrapped_fnc)(const PurpleAccount *account, const char *str);
 
extern purple_normalize_wrapped_fnc purple_normalize_wrapped;
 

	
 
typedef gchar * (_cdecl * purple_utf8_try_convert_wrapped_fnc)(const char *str);
 
extern purple_utf8_try_convert_wrapped_fnc purple_utf8_try_convert_wrapped;
 

	
 
typedef void  (_cdecl * purple_util_set_user_dir_wrapped_fnc)(const char *dir);
 
extern purple_util_set_user_dir_wrapped_fnc purple_util_set_user_dir_wrapped;
 

	
 
typedef GIOChannel * (_cdecl * wpurple_g_io_channel_win32_new_socket_wrapped_fnc)(int socket);
 
extern wpurple_g_io_channel_win32_new_socket_wrapped_fnc wpurple_g_io_channel_win32_new_socket_wrapped;
 

	
 

	
 
#else
 

	
 

	
 
#define PURPLE_BLIST_NODE_IS_CHAT_WRAPPED PURPLE_BLIST_NODE_IS_CHAT
 
#define PURPLE_BLIST_NODE_IS_BUDDY_WRAPPED PURPLE_BLIST_NODE_IS_BUDDY
 
#define PURPLE_BLIST_NODE_IS_CONTACT_WRAPPED PURPLE_BLIST_NODE_IS_CONTACT
 
#define PURPLE_BLIST_NODE_IS_GROUP_WRAPPED PURPLE_BLIST_NODE_IS_GROUP
 

	
 
#define PURPLE_CONV_IM_WRAPPED PURPLE_CONV_IM
 
#define PURPLE_CONV_CHAT_WRAPPED PURPLE_CONV_CHAT
 

	
 
#define PURPLE_CONNECTION_IS_CONNECTED_WRAPPED PURPLE_CONNECTION_IS_CONNECTED	
 

	
 
#define purple_account_set_bool_wrapped purple_account_set_bool
 
#define purple_account_get_protocol_id_wrapped purple_account_get_protocol_id
 
#define purple_account_set_int_wrapped purple_account_set_int
 
#define purple_account_get_string_wrapped purple_account_get_string
 
#define purple_account_set_string_wrapped purple_account_set_string
 
#define purple_account_get_username_wrapped purple_account_get_username
 
#define purple_account_set_username_wrapped purple_account_set_username
 
#define purple_account_set_proxy_info_wrapped purple_account_set_proxy_info
 
#define purple_accounts_find_wrapped purple_accounts_find
 
#define purple_account_new_wrapped purple_account_new
 
#define purple_accounts_add_wrapped purple_accounts_add
 
#define purple_account_get_password_wrapped purple_account_get_password
 
#define purple_account_set_password_wrapped purple_account_set_password
 
#define purple_account_set_enabled_wrapped purple_account_set_enabled
 
#define purple_account_set_privacy_type_wrapped purple_account_set_privacy_type
 
#define purple_account_get_status_type_with_primitive_wrapped purple_account_get_status_type_with_primitive
 
#define purple_account_set_status_wrapped purple_account_set_status
 
#define purple_account_get_int_wrapped purple_account_get_int
 
#define purple_account_disconnect_wrapped purple_account_disconnect
 
#define purple_accounts_delete_wrapped purple_accounts_delete
 
#define purple_account_get_connection_wrapped purple_account_get_connection
 
#define purple_account_set_alias_wrapped purple_account_set_alias
 
#define purple_account_set_public_alias_wrapped purple_account_set_public_alias
 
#define purple_account_remove_buddy_wrapped purple_account_remove_buddy
 
#define purple_account_add_buddy_wrapped purple_account_add_buddy
 
#define purple_account_get_name_for_display_wrapped purple_account_get_name_for_display
 
#define purple_accounts_set_ui_ops_wrapped purple_accounts_set_ui_ops
 
#define purple_account_prefs_set_ui_ops_wrapped purple_account_prefs_set_ui_ops
 
#define purple_account_option_get_type_wrapped purple_account_option_get_type
 
#define purple_account_option_get_setting_wrapped purple_account_option_get_setting
 
#define purple_blist_node_get_type_wrapped purple_blist_node_get_type
 
#define purple_buddy_get_alias_wrapped purple_buddy_get_alias
 
#define purple_buddy_get_server_alias_wrapped purple_buddy_get_server_alias
 
#define purple_find_buddy_wrapped purple_find_buddy
 
#define purple_buddy_get_group_wrapped purple_buddy_get_group
 
#define purple_blist_remove_buddy_wrapped purple_blist_remove_buddy
 
#define purple_blist_alias_buddy_wrapped purple_blist_alias_buddy
 
#define purple_blist_server_alias_buddy_wrapped purple_blist_server_alias_buddy
 
#define purple_find_group_wrapped purple_find_group
 
#define purple_group_new_wrapped purple_group_new
 
#define purple_blist_add_contact_wrapped purple_blist_add_contact
 
#define purple_buddy_get_contact_wrapped purple_buddy_get_contact
 
#define purple_buddy_new_wrapped purple_buddy_new
 
#define purple_blist_add_buddy_wrapped purple_blist_add_buddy
 
#define purple_blist_find_chat_wrapped purple_blist_find_chat
 
#define purple_chat_get_components_wrapped purple_chat_get_components
 
#define purple_buddy_get_presence_wrapped purple_buddy_get_presence
 
#define purple_buddy_get_account_wrapped purple_buddy_get_account
 
#define purple_buddy_get_name_wrapped purple_buddy_get_name
 
#define purple_find_buddies_wrapped purple_find_buddies
 
#define purple_group_get_name_wrapped purple_group_get_name
 
#define purple_blist_set_ui_ops_wrapped purple_blist_set_ui_ops
 
#define purple_set_blist_wrapped purple_set_blist
 
#define purple_blist_new_wrapped purple_blist_new
 
#define purple_blist_load_wrapped purple_blist_load
 
#define purple_blist_get_handle_wrapped purple_blist_get_handle
 
#define purple_buddy_icons_set_account_icon_wrapped purple_buddy_icons_set_account_icon
 
#define purple_buddy_icons_find_wrapped purple_buddy_icons_find
 
#define purple_buddy_icon_get_full_path_wrapped purple_buddy_icon_get_full_path
 
#define purple_buddy_icon_unref_wrapped purple_buddy_icon_unref
 
#define purple_buddy_icons_find_account_icon_wrapped purple_buddy_icons_find_account_icon
 
#define purple_buddy_icon_get_data_wrapped purple_buddy_icon_get_data
 
#define purple_certificate_add_ca_search_path_wrapped purple_certificate_add_ca_search_path
 
#define purple_connection_get_state_wrapped purple_connection_get_state
 
#define purple_connection_get_account_wrapped purple_connection_get_account
 
#define purple_connection_get_display_name_wrapped purple_connection_get_display_name
 
#define purple_connections_set_ui_ops_wrapped purple_connections_set_ui_ops
 
#define purple_connections_get_handle_wrapped purple_connections_get_handle
 
#define purple_conversation_get_im_data_wrapped purple_conversation_get_im_data
 
#define purple_conversation_get_chat_data_wrapped purple_conversation_get_chat_data
 
#define purple_find_conversation_with_account_wrapped purple_find_conversation_with_account
 
#define purple_conversation_new_wrapped purple_conversation_new
 
#define purple_conversation_get_type_wrapped purple_conversation_get_type
 
#define purple_conversation_set_data_wrapped purple_conversation_set_data
 
#define purple_conversation_update_wrapped purple_conversation_update
 
#define purple_conv_im_send_wrapped purple_conv_im_send
 
#define purple_conv_im_send_with_flags_wrapped purple_conv_im_send_with_flags
 
#define purple_conv_chat_send_wrapped purple_conv_chat_send
 
#define purple_conv_chat_send_with_flags_wrapped purple_conv_chat_send_with_flags
 
#define purple_conversation_destroy_wrapped purple_conversation_destroy
 
#define purple_conversation_get_account_wrapped purple_conversation_get_account
 
#define purple_conversation_get_name_wrapped purple_conversation_get_name
 
#define purple_conversations_set_ui_ops_wrapped purple_conversations_set_ui_ops
 
#define purple_conversations_get_handle_wrapped purple_conversations_get_handle
 
#define purple_core_set_ui_ops_wrapped purple_core_set_ui_ops
 
#define purple_core_init_wrapped purple_core_init
 
#define purple_debug_set_ui_ops_wrapped purple_debug_set_ui_ops
 
#define purple_debug_set_verbose_wrapped purple_debug_set_verbose
 
#define purple_dnsquery_set_ui_ops_wrapped purple_dnsquery_set_ui_ops
 
#define purple_timeout_remove_wrapped purple_timeout_remove
 
#define purple_input_add_wrapped purple_input_add
 
#define purple_timeout_add_wrapped purple_timeout_add
 
#define purple_timeout_add_seconds_wrapped purple_timeout_add_seconds
 
#define purple_eventloop_set_ui_ops_wrapped purple_eventloop_set_ui_ops
 
#define purple_input_remove_wrapped purple_input_remove
 
#define purple_xfer_ui_ready_wrapped purple_xfer_ui_ready
 
#define purple_xfer_request_accepted_wrapped purple_xfer_request_accepted
 
#define purple_xfer_request_denied_wrapped purple_xfer_request_denied
 
#define purple_xfer_get_account_wrapped purple_xfer_get_account
 
#define purple_xfer_get_filename_wrapped purple_xfer_get_filename
 
#define purple_xfer_get_size_wrapped purple_xfer_get_size
 
#define purple_xfer_unref_wrapped purple_xfer_unref
 
#define purple_xfer_ref_wrapped purple_xfer_ref
 
#define purple_xfers_set_ui_ops_wrapped purple_xfers_set_ui_ops
 
#define purple_xfers_get_handle_wrapped purple_xfers_get_handle
 
#define purple_roomlist_set_ui_ops_wrapped purple_roomlist_set_ui_ops
 
#define purple_roomlist_get_list_wrapped purple_roomlist_get_list
 
#define purple_imgstore_get_data_wrapped purple_imgstore_get_data
 
#define purple_imgstore_get_size_wrapped purple_imgstore_get_size
 
#define purple_imgstore_unref_wrapped purple_imgstore_unref
 
#define purple_notify_user_info_new_wrapped purple_notify_user_info_new
 
#define purple_notify_user_info_destroy_wrapped purple_notify_user_info_destroy
 
#define purple_notify_user_info_get_entries_wrapped purple_notify_user_info_get_entries
 
#define purple_notify_user_info_entry_get_label_wrapped purple_notify_user_info_entry_get_label
 
#define purple_notify_user_info_entry_get_value_wrapped purple_notify_user_info_entry_get_value
 
#define purple_notify_set_ui_ops_wrapped purple_notify_set_ui_ops
 
#define purple_plugins_add_search_path_wrapped purple_plugins_add_search_path
 
#define purple_plugins_load_saved_wrapped purple_plugins_load_saved
 
#define purple_plugin_action_free_wrapped purple_plugin_action_free
 
#define purple_prefs_load_wrapped purple_prefs_load
 
#define purple_prefs_set_bool_wrapped purple_prefs_set_bool
 
#define purple_prefs_set_string_wrapped purple_prefs_set_string
 
#define purple_privacy_deny_wrapped purple_privacy_deny
 
#define purple_privacy_allow_wrapped purple_privacy_allow
 
#define purple_privacy_check_wrapped purple_privacy_check
 
#define purple_proxy_info_new_wrapped purple_proxy_info_new
 
#define purple_proxy_info_set_type_wrapped purple_proxy_info_set_type
 
#define purple_proxy_info_set_host_wrapped purple_proxy_info_set_host
 
#define purple_proxy_info_set_port_wrapped purple_proxy_info_set_port
 
#define purple_proxy_info_set_username_wrapped purple_proxy_info_set_username
 
#define purple_proxy_info_set_password_wrapped purple_proxy_info_set_password
 
#define purple_find_prpl_wrapped purple_find_prpl
 
#define purple_prpl_send_attention_wrapped purple_prpl_send_attention
 
#define purple_request_set_ui_ops_wrapped purple_request_set_ui_ops
 
#define serv_get_info_wrapped serv_get_info
 
#define serv_alias_buddy_wrapped serv_alias_buddy
 
#define serv_send_typing_wrapped serv_send_typing
 
#define serv_join_chat_wrapped serv_join_chat
 
#define purple_signal_connect_wrapped purple_signal_connect
 
#define purple_status_type_get_id_wrapped purple_status_type_get_id
 
#define purple_presence_get_active_status_wrapped purple_presence_get_active_status
 
#define purple_status_type_get_primitive_wrapped purple_status_type_get_primitive
 
#define purple_status_get_type_wrapped purple_status_get_type
 
#define purple_status_get_attr_string_wrapped purple_status_get_attr_string
 
#define purple_markup_escape_text_wrapped purple_markup_escape_text
 
#define purple_markup_strip_html_wrapped purple_markup_strip_html
 
#define purple_strdup_withhtml_wrapped purple_strdup_withhtml
 
#define purple_markup_html_to_xhtml_wrapped purple_markup_html_to_xhtml
 
#define purple_normalize_wrapped purple_normalize
 
#define purple_utf8_try_convert_wrapped purple_utf8_try_convert
 
#define purple_util_set_user_dir_wrapped purple_util_set_user_dir
 
#define wpurple_g_io_channel_win32_new_socket_wrapped wpurple_g_io_channel_win32_new_socket
 
#endif
 

	
 
bool resolvePurpleFunctions();
 

	
packaging/debian/debian/changelog
Show inline comments
 
spectrum2 (1:1760-89e377b-1) unstable; urgency=low
 
spectrum2 (1:2267-b80ba70a-1) unstable; urgency=low
 

	
 
  * Move package to git-buildpackage format
 
  * remove the -git suffix from package names
 
  * Change dependency from libswiften2-dev to libswiften-dev
 
  * remove some old cruft (debian/source/options, lintian-overrides, ...)
 
  * Add libevent-dev as build-dependency
 

	
 
 -- Mathias Ertl <apt-repository@fsinf.at>  Thu, 28 Jun 2012 21:39:27 +0200
 

	
 
spectrum2-git (2.0.0~beta+47-gdd8627b-1) unstable; urgency=low
 

	
 
  * Upstream development snapshot
 

	
 
 -- Mathias Ertl <apt-repository@fsinf.at>  Tue, 20 Sep 2011 11:06:50 +0200
tests/CMakeLists.txt
Show inline comments
 
ADD_SUBDIRECTORY(libtransport)
 

	
 

	
 
add_custom_target(test ${CMAKE_CURRENT_BINARY_DIR}/libtransport/libtransport_test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests_output)
 
add_custom_target(extended_test ${CMAKE_CURRENT_BINARY_DIR}/libtransport/libtransport_test COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/start.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests_output)
 
add_custom_target(test $<TARGET_FILE:libtransport_test> WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests_output)
 
add_custom_target(extended_test $<TARGET_FILE:libtransport_test> COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/start.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests_output)
tests/libtransport/util.cpp
Show inline comments
 
#include <cppunit/TestFixture.h>
 
#include <cppunit/extensions/HelperMacros.h>
 
#include <Swiften/Swiften.h>
 
#include <Swiften/EventLoop/DummyEventLoop.h>
 
#include <Swiften/Server/Server.h>
 
#include <Swiften/Network/DummyNetworkFactories.h>
 
#include <Swiften/Network/DummyConnectionServer.h>
 
#include "Swiften/Server/ServerStanzaChannel.h"
 
#include "Swiften/Server/ServerFromClientSession.h"
 
#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
 
#include "basictest.h"
 
#include "transport/utf8.h"
 
#include <boost/lexical_cast.hpp>
 

	
 

	
 
using namespace Transport;
 
using boost::lexical_cast;
 

	
 
class UtilTest : public CPPUNIT_NS :: TestFixture{
 
	CPPUNIT_TEST_SUITE(UtilTest);
 
	CPPUNIT_TEST(encryptDecryptPassword);
 
	CPPUNIT_TEST(serializeGroups);
 
	CPPUNIT_TEST(replaceInvalid);
 
    CPPUNIT_TEST(storeUserSettings);
 
	CPPUNIT_TEST_SUITE_END();
 

	
 
	public:
 
		void setUp (void) {
 
		}
 

	
 
		void tearDown (void) {
 

	
 
		}
 

	
 
	void encryptDecryptPassword() {
 
		std::string encrypted = StorageBackend::encryptPassword("password", "key");
 
		CPPUNIT_ASSERT_EQUAL(std::string("password"), StorageBackend::decryptPassword(encrypted, "key"));
 
	}
 

	
 
	void serializeGroups() {
 
		std::vector<std::string> groups;
 
		std::string g = "";
 
		
 
		CPPUNIT_ASSERT_EQUAL(g, StorageBackend::serializeGroups(groups));
 
		CPPUNIT_ASSERT_EQUAL(0, (int) StorageBackend::deserializeGroups(g).size());
 

	
 
		groups.push_back("Buddies");
 
		g = "Buddies";
 
		CPPUNIT_ASSERT_EQUAL(g, StorageBackend::serializeGroups(groups));
 
		CPPUNIT_ASSERT_EQUAL(1, (int) StorageBackend::deserializeGroups(g).size());
 
		CPPUNIT_ASSERT_EQUAL(g, StorageBackend::deserializeGroups(g)[0]);
 

	
 
		groups.push_back("Buddies2");
 
		g = "Buddies\nBuddies2";
 
		CPPUNIT_ASSERT_EQUAL(g, StorageBackend::serializeGroups(groups));
 
		CPPUNIT_ASSERT_EQUAL(2, (int) StorageBackend::deserializeGroups(g).size());
 
		CPPUNIT_ASSERT_EQUAL(std::string("Buddies"), StorageBackend::deserializeGroups(g)[0]);
 
		CPPUNIT_ASSERT_EQUAL(std::string("Buddies2"), StorageBackend::deserializeGroups(g)[1]);
 
	}
 

	
 
	void replaceInvalid() {
 
		std::string x("test\x80\xe0\xa0\xc0\xaf\xed\xa0\x80test");
 
		std::string a;
 
		CPPUNIT_ASSERT(x.end() != utf8::find_invalid(x.begin(), x.end()));
 
		utf8::replace_invalid(x.begin(), x.end(), std::back_inserter(a), '_');
 
		CPPUNIT_ASSERT_EQUAL(std::string("test____test"), a);
 

	
 
		a = "";
 
		utf8::remove_invalid(x.begin(), x.end(), std::back_inserter(a));
 
		CPPUNIT_ASSERT_EQUAL(std::string("testtest"), a);
 
	}
 
    
 
    void storeUserSettings() {
 
        std::istringstream ifs("service.server_mode = 1\nservice.jid=localhost\nservice.more_resources=1\nservice.admin_jid=me@localhost\ndatabase.type=sqlite3\ndatabase.database=demo.s3db");
 
        Config *cfg = new Config();
 
        cfg->load(ifs);
 
        std::string err = "";
 
        StorageBackend *storage = StorageBackend::createBackend(cfg, err);
 
        UserInfo res;
 
        res.uin = "123456";
 
        res.jid = "test@localhost";
 
        res.password = "secret";
 
        storage->connect();
 
        storage->setUser(res);
 
        storage->getUser("test@localhost", res);
 
        int ts = time(NULL);
 
        std::string key = boost::lexical_cast<std::string>(ts);
 
        int type = TYPE_INT;
 
        storage->getUserSetting(res.id, "test_variable", type, key);
 
        std::string value = "";
 
        
 
        storage->getUserSetting(res.id, "test_variable", type, value);
 
        unlink("demo.s3db");
 
        CPPUNIT_ASSERT_EQUAL(ts, boost::lexical_cast<int>(value));
 
    }
 

	
 
};
 

	
 
CPPUNIT_TEST_SUITE_REGISTRATION (UtilTest);
0 comments (0 inline, 0 general)