# # Copyright (c) 2008 INdT - Instituto Nokia de Tecnologia # # This file is part of python-purple. # # python-purple is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # python-purple is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # cdef extern from "libpurple/purple.h": pass cimport glib cimport account cimport buddyicon cimport blist cimport connection cimport conversation cimport core cimport debug cimport eventloop cimport ft cimport idle cimport notify cimport plugin cimport pounce cimport prefs cimport proxy cimport request cimport roomlist cimport signals cimport status cimport savedstatuses cimport util cdef extern from "c_purple.h": void connect_to_signals_for_demonstration_purposes_only () glib.guint glib_input_add(glib.gint fd, eventloop.PurpleInputCondition condition, eventloop.PurpleInputFunction function, glib.gpointer data) import ecore __DEFAULT_PATH__ = "/tmp" __APP_NAME__ = "carman-purple-python" __APP_VERSION__ = "0.1" global __DEFAULT_PATH__ global __APP_NAME__ global __APP_VERSION__ cdef class Purple: """ Purple class """ cdef core.PurpleCoreUiOps c_core_ui_ops cdef eventloop.PurpleEventLoopUiOps c_eventloop_ui_ops cdef glib.GHashTable *c_ui_info def __cinit__(self, debug_enabled=True, app_name=__APP_NAME__, default_path=__DEFAULT_PATH__): self.c_ui_info = NULL if app_name is not __APP_NAME__: __APP_NAME__ = app_name if default_path is not __DEFAULT_PATH__: __DEFAULT_PATH__ = default_path debug.c_purple_debug_set_enabled(debug_enabled) util.c_purple_util_set_user_dir(default_path) plugin.c_purple_plugins_add_search_path(default_path) # adds glib iteration inside ecore main loop ecore.idler_add(self.__glib_iteration_when_idle) # __cinit__ def __del__(self): core.c_purple_core_quit() # __del__ cdef void __core_ui_ops_ui_prefs_init(self): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_prefs_init\n") prefs.c_purple_prefs_load() prefs.c_purple_prefs_add_none("/carman") # __core_ui_ops_ui_prefs_init cdef void __core_ui_ops_debug_init(self): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "debug_ui_init\n") # __core_ui_ops_debug_init cdef void __core_ui_ops_ui_init(self): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_init\n") # FIXME: Add core ui initialization here # __core_ui_ops_ui_init cdef void __core_ui_ops_quit(self): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "quit\n") account.c_purple_accounts_set_ui_ops(NULL) connection.c_purple_connections_set_ui_ops(NULL) blist.c_purple_blist_set_ui_ops(NULL) conversation.c_purple_conversations_set_ui_ops(NULL) notify.c_purple_notify_set_ui_ops(NULL) request.c_purple_request_set_ui_ops(NULL) ft.c_purple_xfers_set_ui_ops(NULL) roomlist.c_purple_roomlist_set_ui_ops(NULL) if self.c_ui_info: glib.g_hash_table_destroy(self.c_ui_info) # __core_ui_ops_quit cdef glib.GHashTable *__core_ui_ops_get_ui_info(self): if self.c_ui_info == NULL: self.c_ui_info = glib.g_hash_table_new(glib.g_str_hash, glib.g_str_equal) glib.g_hash_table_insert(self.c_ui_info, "name", __APP_NAME__) glib.g_hash_table_insert(self.c_ui_info, "version", __APP_VERSION__) return self.c_ui_info # __core_ui_ops_get_ui_info def __glib_iteration_when_idle(self): glib.g_main_context_iteration(NULL, False) return True # __glib_iteration_when_idle def purple_init(self): """ Initializes libpurple """ # initialize c_core_ui_ops structure self.c_core_ui_ops.ui_prefs_init = self.__core_ui_ops_ui_prefs_init self.c_core_ui_ops.debug_ui_init = self.__core_ui_ops_debug_init self.c_core_ui_ops.ui_init = self.__core_ui_ops_ui_init self.c_core_ui_ops.quit = self.__core_ui_ops_quit self.c_core_ui_ops.get_ui_info = self.__core_ui_ops_get_ui_info core.c_purple_core_set_ui_ops(&self.c_core_ui_ops) # initialize c_eventloop_ui_ops structure self.c_eventloop_ui_ops.timeout_add = glib.g_timeout_add self.c_eventloop_ui_ops.timeout_remove = glib.g_source_remove self.c_eventloop_ui_ops.input_add = glib_input_add self.c_eventloop_ui_ops.input_remove = glib.g_source_remove self.c_eventloop_ui_ops.input_get_error = NULL self.c_eventloop_ui_ops.timeout_add_seconds = glib.g_timeout_add_seconds eventloop.c_purple_eventloop_set_ui_ops(&self.c_eventloop_ui_ops) # initialize purple core ret = core.c_purple_core_init(__APP_NAME__) if ret is False: debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "main", "Exiting because libpurple initialization failed.\n") return False # check if there is another instance of libpurple running if core.c_purple_core_ensure_single_instance() == False: debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "main", "Exiting because another instance of libpurple is already running.\n") core.c_purple_core_quit() return False # create and load the buddy list blist.c_purple_set_blist(blist.c_purple_blist_new()) blist.c_purple_blist_load() # load pounces pounce.c_purple_pounces_load() return ret # purple_init def get_protocols(self): cdef glib.GList *iter cdef plugin.PurplePlugin *__plugin protocols = [] iter = plugin.c_purple_plugins_get_protocols() while iter: __plugin = iter.data if __plugin.info and __plugin.info.name: protocols += [(__plugin.info.id, __plugin.info.name)] iter = iter.next return protocols # get_protocols def connect(self): conn = Connection() conn.connect() # connect # Purple include "account.pyx" include "buddy.pyx" include "connection.pyx" include "conversation.pyx"