diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..aff0d4fefb6b9b96e3fc2734be3581ec0ee576e2 --- /dev/null +++ b/spectrum/src/main.cpp @@ -0,0 +1,201 @@ +#include "glib.h" +#include "purple.h" +#include + +#include "transport/config.h" +#include "transport/transport.h" +#include "transport/usermanager.h" +#include "transport/logger.h" +#include "transport/sqlite3backend.h" +#include "transport/userregistration.h" +#include "spectrumeventloop.h" +#include "geventloop.h" + + + +using namespace Transport; + +static gboolean nodaemon = FALSE; +static gchar *logfile = NULL; +static gchar *lock_file = NULL; +static gboolean ver = FALSE; +static gboolean upgrade_db = FALSE; +static gboolean check_db_version = FALSE; +static gboolean list_purple_settings = FALSE; + +static GOptionEntry options_entries[] = { + { "nodaemon", 'n', 0, G_OPTION_ARG_NONE, &nodaemon, "Disable background daemon mode", NULL }, + { "logfile", 'l', 0, G_OPTION_ARG_STRING, &logfile, "Set file to log", NULL }, + { "pidfile", 'p', 0, G_OPTION_ARG_STRING, &lock_file, "File where to write transport PID", NULL }, + { "version", 'v', 0, G_OPTION_ARG_NONE, &ver, "Shows Spectrum version", NULL }, + { "list-purple-settings", 's', 0, G_OPTION_ARG_NONE, &list_purple_settings, "Lists purple settings which can be used in config file", NULL }, + { "upgrade-db", 'u', 0, G_OPTION_ARG_NONE, &upgrade_db, "Upgrades Spectrum database", NULL }, + { "check-db-GlooxMessageHandler::version", 'c', 0, G_OPTION_ARG_NONE, &check_db_version, "Checks Spectrum database version", NULL }, + { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, "", NULL } +}; + +static void transport_core_ui_init(void) +{ +// purple_blist_set_ui_ops(&blistUiOps); +// purple_accounts_set_ui_ops(&accountUiOps); +// purple_notify_set_ui_ops(¬ifyUiOps); +// purple_request_set_ui_ops(&requestUiOps); +// purple_xfers_set_ui_ops(getXferUiOps()); +// purple_connections_set_ui_ops(&conn_ui_ops); +// purple_conversations_set_ui_ops(&conversation_ui_ops); +// #ifndef WIN32 +// purple_dnsquery_set_ui_ops(getDNSUiOps()); +// #endif +} + +static PurpleCoreUiOps coreUiOps = +{ + NULL, +// debug_init, + NULL, + transport_core_ui_init, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +static bool initPurple(Config &cfg) { + bool ret; + + purple_util_set_user_dir("./"); + +// if (m_configuration.logAreas & LOG_AREA_PURPLE) +// purple_debug_set_ui_ops(&debugUiOps); + + purple_core_set_ui_ops(&coreUiOps); + purple_eventloop_set_ui_ops(getEventLoopUiOps()); + + ret = purple_core_init("spectrum"); + if (ret) { + static int conversation_handle; + static int conn_handle; + static int blist_handle; + + purple_set_blist(purple_blist_new()); + purple_blist_load(); + + purple_prefs_load(); + + /* 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("/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("/purple/away/idle_reporting", "system"); + + /* Disable all logging */ + purple_prefs_set_bool("/purple/logging/log_ims", false); + purple_prefs_set_bool("/purple/logging/log_chats", false); + purple_prefs_set_bool("/purple/logging/log_system", false); + + +// purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", &conversation_handle, PURPLE_CALLBACK(newMessageReceived), NULL); +// purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", &conversation_handle, PURPLE_CALLBACK(buddyTyping), NULL); +// purple_signal_connect(purple_conversations_get_handle(), "buddy-typed", &conversation_handle, PURPLE_CALLBACK(buddyTyped), NULL); +// purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL); +// purple_signal_connect(purple_connections_get_handle(), "signed-on", &conn_handle,PURPLE_CALLBACK(signed_on), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-removed", &blist_handle,PURPLE_CALLBACK(buddyRemoved), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", &blist_handle,PURPLE_CALLBACK(buddySignedOff), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-status-changed", &blist_handle,PURPLE_CALLBACK(buddyStatusChanged), NULL); +// purple_signal_connect(purple_blist_get_handle(), "blist-node-removed", &blist_handle,PURPLE_CALLBACK(NodeRemoved), NULL); +// purple_signal_connect(purple_conversations_get_handle(), "chat-topic-changed", &conversation_handle, PURPLE_CALLBACK(conv_chat_topic_changed), NULL); +// +// purple_commands_init(); + + } + return ret; +} + +int main(int argc, char **argv) { + GError *error = NULL; + GOptionContext *context; + context = g_option_context_new("config_file_name or profile name"); + g_option_context_add_main_entries(context, options_entries, ""); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + std::cout << "option parsing failed: " << error->message << "\n"; + return -1; + } + + if (ver) { +// std::cout << VERSION << "\n"; + std::cout << "verze\n"; + g_option_context_free(context); + return 0; + } + + if (argc != 2) { +#ifdef WIN32 + std::cout << "Usage: spectrum.exe \n"; +#else + +#if GLIB_CHECK_VERSION(2,14,0) + std::cout << g_option_context_get_help(context, FALSE, NULL); +#else + std::cout << "Usage: spectrum \n"; + std::cout << "See \"man spectrum\" for more info.\n"; +#endif + +#endif + } + else { +#ifndef WIN32 +// signal(SIGPIPE, SIG_IGN); +// +// if (signal(SIGCHLD, spectrum_sigchld_handler) == SIG_ERR) { +// std::cout << "SIGCHLD handler can't be set\n"; +// g_option_context_free(context); +// return -1; +// } +// +// if (signal(SIGINT, spectrum_sigint_handler) == SIG_ERR) { +// std::cout << "SIGINT handler can't be set\n"; +// g_option_context_free(context); +// return -1; +// } +// +// if (signal(SIGTERM, spectrum_sigterm_handler) == SIG_ERR) { +// std::cout << "SIGTERM handler can't be set\n"; +// g_option_context_free(context); +// return -1; +// } +// +// struct sigaction sa; +// memset(&sa, 0, sizeof(sa)); +// sa.sa_handler = spectrum_sighup_handler; +// if (sigaction(SIGHUP, &sa, NULL)) { +// std::cout << "SIGHUP handler can't be set\n"; +// g_option_context_free(context); +// return -1; +// } +#endif + Config config; + if (!config.load(argv[1])) { + std::cout << "Can't open sample.cfg configuration file.\n"; + return 1; + } + + initPurple(config); + + SpectrumEventLoop eventLoop; + Component transport(&eventLoop, &config); + Logger logger(&transport); + transport.connect(); + + eventLoop.run(); + } + + g_option_context_free(context); +}