From 75837780a72525b0df66ca1e30a215b2fbdcb887 Mon Sep 17 00:00:00 2001 From: Ragner Magalhaes Date: Tue, 2 Dec 2008 20:26:15 +0000 Subject: [PATCH 1/1] Added PurpleAccountUiOps callbacks. (Updated) FIXES: - Added missing structures on account.pxd (PurpleAccountUiOps) and status.pxd (PurpleStatus). - Added account callbacks forwarding on purple.pyx. - Added account callbacks example on nullclient.py. - Added c-based callbacks on account_cbs.pxd. - Renamed conversations_cbs to conversation_cbs. ps: Fixed typo when renaming conversations_cbs to conversation_cbs. Signed-off-by: Bruno Abinader git-svn-id: https://garage.maemo.org/svn/carman/branches/carman-0.7-beta2/python-purple@1303 596f6dd7-e928-0410-a184-9e12fd12cf7e --- account_cbs.pxd | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ conversation_cbs.pxd | 56 ++++++++++++++++++++--------------------- libpurple/account.pxd | 20 ++++++++++++++- libpurple/status.pxd | 2 ++ nullclient.py | 48 +++++++++++++++++++++-------------- purple.pyx | 18 ++++++++++++-- 6 files changed, 161 insertions(+), 49 deletions(-) create mode 100644 account_cbs.pxd diff --git a/account_cbs.pxd b/account_cbs.pxd new file mode 100644 index 0000000..e0f767a --- /dev/null +++ b/account_cbs.pxd @@ -0,0 +1,66 @@ +# +# 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 . +# + +cimport purple + +cdef extern from *: + ctypedef char const_char "const char" + +account_cbs = {} + +cdef void notify_added (account.PurpleAccount *account, const_char *remote_user, const_char *id, const_char *alias, const_char *message): + debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "account", "notify_added\n") + global account_cbs + try: + (account_cbs["notify_added"])("notify_added") + except KeyError: + pass + +cdef void status_changed (account.PurpleAccount *account, status.PurpleStatus *status): + debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "account", "status_changed\n") + global account_cbs + try: + (account_cbs["status_changed"])("status_changed") + except KeyError: + pass + +cdef void request_add (account.PurpleAccount *account, const_char *remote_user, const_char *id, const_char *alias, const_char *message): + debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "account", "request_add\n") + global account_cbs + try: + (account_cbs["request_add"])("request_add") + except KeyError: + pass + +cdef void *request_authorize (account.PurpleAccount *account, const_char *remote_user, const_char *id, const_char *alias, const_char *message, glib.gboolean on_list, account.PurpleAccountRequestAuthorizationCb authorize_cb, account.PurpleAccountRequestAuthorizationCb deny_cb, void *user_data): + debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "account", "request_authorize\n") + global account_cbs + try: + (account_cbs["request_authorize"])("request_authorize") + return NULL + except KeyError: + pass + +cdef void close_account_request (void *ui_handle): + debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "account", "close_account_request\n") + global account_cbs + try: + (account_cbs["close_account_request"])("close_account_request") + except KeyError: + pass diff --git a/conversation_cbs.pxd b/conversation_cbs.pxd index 3c5aec1..a0aa262 100644 --- a/conversation_cbs.pxd +++ b/conversation_cbs.pxd @@ -26,21 +26,21 @@ cdef extern from *: cdef extern from "time.h": ctypedef long int time_t -conversations_cbs = {} +conversation_cbs = {} cdef void create_conversation (conversation.PurpleConversation *conv): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "create_conversation\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["create_conversation"])("create_conversation") + (conversation_cbs["create_conversation"])("create_conversation") except KeyError: pass cdef void destroy_conversation (conversation.PurpleConversation *conv): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "destroy_conversation\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["destroy_conversation"])("destroy_conversation") + (conversation_cbs["destroy_conversation"])("destroy_conversation") except KeyError: pass @@ -48,9 +48,9 @@ cdef void write_chat (conversation.PurpleConversation *conv, const_char *who, const_char *message, conversation.PurpleMessageFlags flags, time_t mtime): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "write_chat\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["write_chat"])("write_chat") + (conversation_cbs["write_chat"])("write_chat") except KeyError: pass @@ -58,9 +58,9 @@ cdef void write_im (conversation.PurpleConversation *conv, const_char *who, const_char *message, conversation.PurpleMessageFlags flags, time_t mtime): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "write_im\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["write_im"])("write_im") + (conversation_cbs["write_im"])("write_im") except KeyError: pass @@ -68,18 +68,18 @@ cdef void write_conv (conversation.PurpleConversation *conv, const_char *name, const_char *alias, const_char *message, conversation.PurpleMessageFlags flags, time_t mtime): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "write_conv\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["write_conv"])("write_conv") + (conversation_cbs["write_conv"])("write_conv") except KeyError: pass cdef void chat_add_users (conversation.PurpleConversation *conv, glib.GList *cbuddies, glib.gboolean new_arrivals): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "chat_add_users\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["chat_add_users"])("chat_add_users") + (conversation_cbs["chat_add_users"])("chat_add_users") except KeyError: pass @@ -87,42 +87,42 @@ cdef void chat_rename_user (conversation.PurpleConversation *conv, const_char *old_name, const_char *new_name, const_char *new_alias): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "chat_rename_user\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["chat_rename_user"])("chat_rename_user") + (conversation_cbs["chat_rename_user"])("chat_rename_user") except KeyError: pass cdef void chat_remove_users (conversation.PurpleConversation *conv, glib.GList *users): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "chat_remove_users\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["chat_remove_users"])("chat_remove_users") + (conversation_cbs["chat_remove_users"])("chat_remove_users") except KeyError: pass cdef void chat_update_user (conversation.PurpleConversation *conv, const_char *user): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "chat_update_user\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["chat_update_user"])("chat_update_user") + (conversation_cbs["chat_update_user"])("chat_update_user") except KeyError: pass cdef void present (conversation.PurpleConversation *conv): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "present\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["present"])("present") + (conversation_cbs["present"])("present") except KeyError: pass cdef glib.gboolean has_focus (conversation.PurpleConversation *conv): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "has_focus\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["has_focus"])("has_focus") + (conversation_cbs["has_focus"])("has_focus") return False except KeyError: return False @@ -130,9 +130,9 @@ cdef glib.gboolean has_focus (conversation.PurpleConversation *conv): cdef glib.gboolean custom_smiley_add (conversation.PurpleConversation *conv, const_char *smile, glib.gboolean remote): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "custom_smiley_add\n") - global conversations_cbs + global conversation_cbs try: - (conversations_cbs["custom_smiley_add"])("custom_smiley_add") + (conversation_cbs["custom_smiley_add"])("custom_smiley_add") return False except KeyError: return False @@ -142,7 +142,7 @@ cdef void custom_smiley_write (conversation.PurpleConversation *conv, glib.gsize size): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "custom_smiley_write\n") try: - (conversations_cbs["custom_smiley_write"])("custom_smiley_write") + (conversation_cbs["custom_smiley_write"])("custom_smiley_write") except KeyError: pass @@ -151,13 +151,13 @@ cdef void custom_smiley_close (conversation.PurpleConversation *conv, const_char *smile): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "custom_smiley_close\n") try: - (conversations_cbs["custom_smiley_close"])("custom_smiley_close") + (conversation_cbs["custom_smiley_close"])("custom_smiley_close") except KeyError: pass cdef void send_confirm (conversation.PurpleConversation *conv, const_char *message): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "conversation", "send_confirm\n") try: - (conversations_cbs["send_confirm"])("send_confirm") + (conversation_cbs["send_confirm"])("send_confirm") except KeyError: pass diff --git a/libpurple/account.pxd b/libpurple/account.pxd index c260065..7c06738 100644 --- a/libpurple/account.pxd +++ b/libpurple/account.pxd @@ -18,9 +18,16 @@ # cimport glib + cimport proxy +cimport status + +cdef extern from *: + ctypedef char const_char "const char" cdef extern from "libpurple/account.h": + ctypedef void (*PurpleAccountRequestAuthorizationCb) (void *) + ctypedef struct PurpleAccount: char *username char *alias @@ -31,7 +38,18 @@ cdef extern from "libpurple/account.h": char *protocol_id ctypedef struct PurpleAccountUiOps: - pass + void (*notify_added) (PurpleAccount *account, const_char *remote_user, \ + const_char *id, const_char *alias, const_char *message) + void (*status_changed) (PurpleAccount *account, \ + status.PurpleStatus *status) + void (*request_add) (PurpleAccount *account, const_char *remote_user, \ + const_char *id, const_char *alias, const_char *message) + void *(*request_authorize) (PurpleAccount *account, \ + const_char *remote_user, const_char *id, const_char *alias, \ + const_char *message, glib.gboolean on_list, \ + PurpleAccountRequestAuthorizationCb authorize_cb, \ + PurpleAccountRequestAuthorizationCb deny_cb, void *user_data) + void (*close_account_request) (void *ui_handle) PurpleAccount *c_purple_account_new "purple_account_new" \ (char *username, char *protocol_id) diff --git a/libpurple/status.pxd b/libpurple/status.pxd index 1460ffa..56747e5 100644 --- a/libpurple/status.pxd +++ b/libpurple/status.pxd @@ -20,6 +20,8 @@ cimport glib cdef extern from "libpurple/status.h": + ctypedef struct PurpleStatus + ctypedef struct PurplePresence: pass diff --git a/nullclient.py b/nullclient.py index 2e82c9c..eafc95d 100644 --- a/nullclient.py +++ b/nullclient.py @@ -4,26 +4,38 @@ import getpass import sys cbs = {} +acc_cbs = {} conv_cbs = {} -def callback(name): - print "---- callback example: %s" % name - -conv_cbs["create_conversation"] = callback -conv_cbs["destroy_conversation"] = callback -conv_cbs["write_chat"] = callback -conv_cbs["write_im"] = callback -conv_cbs["write_conv"] = callback -conv_cbs["chat_add_users"] = callback -conv_cbs["chat_rename_user"] = callback -conv_cbs["chat_remove_users"] = callback -conv_cbs["chat_update_user"] = callback -conv_cbs["present"] = callback -conv_cbs["has_focus"] = callback -conv_cbs["custom_smiley_add"] = callback -conv_cbs["custom_smiley_write"] = callback -conv_cbs["custom_smiley_close"] = callback -conv_cbs["send_confirm"] = callback +def account_callback(name): + print "---- account callback example: %s" % name + +acc_cbs["notify_added"] = account_callback +acc_cbs["status_changed"] = account_callback +acc_cbs["request_add"] = account_callback +acc_cbs["request_authorize"] = account_callback +acc_cbs["close_account_request"] = account_callback + +cbs["account"] = acc_cbs + +def conv_callback(name): + print "---- conversation callback example: %s" % name + +conv_cbs["create_conversation"] = conv_callback +conv_cbs["destroy_conversation"] = conv_callback +conv_cbs["write_chat"] = conv_callback +conv_cbs["write_im"] = conv_callback +conv_cbs["write_conv"] = conv_callback +conv_cbs["chat_add_users"] = conv_callback +conv_cbs["chat_rename_user"] = conv_callback +conv_cbs["chat_remove_users"] = conv_callback +conv_cbs["chat_update_user"] = conv_callback +conv_cbs["present"] = conv_callback +conv_cbs["has_focus"] = conv_callback +conv_cbs["custom_smiley_add"] = conv_callback +conv_cbs["custom_smiley_write"] = conv_callback +conv_cbs["custom_smiley_close"] = conv_callback +conv_cbs["send_confirm"] = conv_callback cbs["conversation"] = conv_cbs diff --git a/purple.pyx b/purple.pyx index df17ba0..8136de8 100644 --- a/purple.pyx +++ b/purple.pyx @@ -29,12 +29,14 @@ __APP_NAME__ = "carman-purple-python" __APP_VERSION__ = "0.1" cdef core.PurpleCoreUiOps c_core_ui_ops +cdef account.PurpleAccountUiOps c_account_ui_ops cdef conversation.PurpleConversationUiOps c_conv_ui_ops cdef eventloop.PurpleEventLoopUiOps c_eventloop_ui_ops cdef glib.GHashTable *c_ui_info c_ui_info = NULL +include "account_cbs.pxd" include "conversation_cbs.pxd" cdef class Purple: @@ -74,8 +76,10 @@ cdef class Purple: cdef void __core_ui_ops_ui_init(self): debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_init\n") + global c_account_ui_ops global c_conv_ui_ops + account.c_purple_accounts_set_ui_ops(&c_account_ui_ops) conversation.c_purple_conversations_set_ui_ops(&c_conv_ui_ops) # FIXME: Add core ui initialization here @@ -113,13 +117,23 @@ cdef class Purple: def purple_init(self, callbacks_dict=None): """ Initializes libpurple """ + global c_account_ui_ops global c_conv_ui_ops global c_core_ui_ops global c_eventloop_ui_ops if callbacks_dict is not None: - global conversations_cbs - conversations_cbs = callbacks_dict["conversation"] + global account_cbs + global conversation_cbs + + account_cbs = callbacks_dict["account"] + conversation_cbs = callbacks_dict["conversation"] + + c_account_ui_ops.notify_added = notify_added + c_account_ui_ops.status_changed = status_changed + c_account_ui_ops.request_add = request_add + c_account_ui_ops.request_authorize = request_authorize + c_account_ui_ops.close_account_request = close_account_request c_conv_ui_ops.create_conversation = create_conversation c_conv_ui_ops.destroy_conversation = destroy_conversation -- 1.7.9.5