From: Ragner Magalhaes Date: Tue, 2 Dec 2008 20:44:49 +0000 (+0000) Subject: Replaced attach_signals with signal_connect method. (UPDATE) X-Git-Url: http://git.maemo.org/git/?p=python-purple;a=commitdiff_plain;h=663e1ae7b7cea174e57405cde0018bf4a9e20bf8;ds=sidebyside Replaced attach_signals with signal_connect method. (UPDATE) FIXES: - Added libpurple/xmlnode.pxd. - Replaced attach_signals() with signal_connect() method. - Added initial geoloc support from libpurple client (receiving only). Signed-off-by: Bruno Abinader git-svn-id: https://garage.maemo.org/svn/carman/branches/carman-0.7-beta2/python-purple@1346 596f6dd7-e928-0410-a184-9e12fd12cf7e --- diff --git a/libpurple/glib.pxd b/libpurple/glib.pxd index ea71a89..c26168b 100644 --- a/libpurple/glib.pxd +++ b/libpurple/glib.pxd @@ -31,6 +31,7 @@ cdef extern from "glib.h": ctypedef gint gboolean ctypedef gboolean (*GSourceFunc) (gpointer data) ctypedef unsigned int gsize + ctypedef signed int gssize ctypedef char gchar ctypedef unsigned char guchar @@ -90,3 +91,5 @@ cdef extern from "glib.h": gboolean g_main_context_iteration (GMainContext *context, gboolean may_block) gboolean g_source_remove(guint tag) + + gchar *g_markup_escape_text (gchar *text, gssize length) diff --git a/libpurple/purple.pxd b/libpurple/purple.pxd index 41be7bf..e7a76cb 100644 --- a/libpurple/purple.pxd +++ b/libpurple/purple.pxd @@ -44,6 +44,7 @@ cimport status cimport savedstatuses cimport value cimport util +cimport xmlnode cdef extern from "libpurple/purple.h": pass diff --git a/libpurple/xmlnode.pxd b/libpurple/xmlnode.pxd new file mode 100644 index 0000000..cf7d30e --- /dev/null +++ b/libpurple/xmlnode.pxd @@ -0,0 +1,49 @@ +# +# 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 glib + +cdef extern from *: + ctypedef int size_t + +cdef extern from "libpurple/xmlnode.h": + ctypedef struct xmlnode + + ctypedef enum XMLNodeType: + XMLNODE_TYPE_TAG + XMLNODE_TYPE_ATTRIB + XMLNODE_TYPE_DATA + + ctypedef struct xmlnode: + char *name + char *xmlns + XMLNodeType type + char *data + size_t data_sz + xmlnode *parent + xmlnode *child + xmlnode *lastchild + xmlnode *next + char *prefix + glib.GHashTable *namespace_map + + xmlnode *xmlnode_get_child(xmlnode *parent, char *name) + char *xmlnode_to_str(xmlnode *node, int *len) + char *xmlnode_get_data(xmlnode *node) + char *xmlnode_get_attrib(xmlnode *node, char *attr) diff --git a/nullclient-ecore.py b/nullclient-ecore.py index 94d8f92..8825af4 100644 --- a/nullclient-ecore.py +++ b/nullclient-ecore.py @@ -9,7 +9,6 @@ conn_cbs = {} conv_cbs = {} notify_cbs = {} request_cbs = {} -signal_cbs = {} def account_callback(name): print "---- account callback example: %s" % name @@ -104,17 +103,6 @@ request_cbs["request_folder"] = request_callback cbs["request"] = request_cbs -def buddy_signed_off_cb(name, bname): - print "---- sign off from buddy %s" % bname - -def receiving_im_msg_cb(sender, name, message): - print "---- receiving IM message from %s: %s" % (name, message) - return False - -#signal_cbs["buddy_signed_off"] = buddy_signed_off_cb -signal_cbs["receiving_im_msg"] = receiving_im_msg_cb - - class MainWindow: def __init__(self, quit_cb): global conv_cbs @@ -239,12 +227,8 @@ class NullClientPurple: self.username = "carmanplugintest@gmail.com" self.password = "abc123def" - global cbs - global signal_cbs cbs["blist"]["update"] = self._purple_update_blist_cb - signal_cbs["buddy_signed_off"] = self._purple_signal_sign_off_cb - cbs["conversation"]["create_conversation"] = self._purple_create_conv_cb self.p.purple_init(cbs) #Initializing UI @@ -283,7 +267,7 @@ class NullClientPurple: self.account.set_enabled("carman-purple-python", True) self.p.connect() - self.p.attach_signals(signal_cbs) + self.p.signal_connect("buddy-signed-off", self._purple_signal_sign_off_cb) def send_msg(self, name, msg): if not self.conversations.has_key(name): diff --git a/nullclient.py b/nullclient.py index 641e034..2904196 100644 --- a/nullclient.py +++ b/nullclient.py @@ -2,6 +2,7 @@ import purple import ecore import getpass import sys +from xml.dom import minidom cbs = {} acc_cbs = {} @@ -10,7 +11,6 @@ conn_cbs = {} conv_cbs = {} notify_cbs = {} request_cbs = {} -signal_cbs = {} def account_callback(name): print "---- account callback example: %s" % name @@ -123,10 +123,13 @@ cbs["connection"] = conn_cbs def conv_callback(name): print "---- conversation callback example: %s" % name +def write_im_cb(name, message): + print "---- (conversation) write_im: %s %s" % (name, message) + 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_im"] = write_im_cb conv_cbs["write_conv"] = conv_callback conv_cbs["chat_add_users"] = conv_callback conv_cbs["chat_rename_user"] = conv_callback @@ -170,14 +173,21 @@ request_cbs["request_folder"] = request_callback cbs["request"] = request_cbs def buddy_signed_off_cb(name): - print "---- sign off from buddy %s" % name + print "---- (signal) sign off from buddy %s" % name def receiving_im_msg_cb(sender, name, message): - print "---- receiving IM message from %s: %s" % (name, message) + print "---- (signal) receiving IM message from %s: %s" % (name, message) return False -signal_cbs["buddy_signed_off"] = buddy_signed_off_cb -signal_cbs["receiving_im_msg"] = receiving_im_msg_cb +def jabber_received_xmlnode_cb(message): + xml = minidom.parse(message) + + for msg in xml.getElementsByTagName("message"): + who = msg.getAttribute("from") + for geoloc in msg.getElementsByTagNameNS("http://jabber.org/protocol/geoloc", "geoloc"): + lat = geoloc.getElementsByTagName("lat")[0].childNodes[0].nodeValue + lon = geoloc.getElementsByTagName("lon")[0].childNodes[0].nodeValue + print "who: %s lat: %s lon: %s" % (who, lat, lon) class NullClient: def __init__(self): @@ -213,14 +223,16 @@ def getpassword(): return getpass.getpass() if __name__ == '__main__': - client = NullClient() client.execute() + client.set_protocol("XMPP") + client.p.signal_connect("buddy-signed-off", buddy_signed_off_cb) + client.p.signal_connect("receiving-im-msg", receiving_im_msg_cb) + client.p.signal_connect("jabber-receiving-xmlnode", jabber_received_xmlnode_cb) username = getuser() password = getpassword() client.new_account(username, password) client.p.connect() - client.p.attach_signals(signal_cbs) ecore.timer_add(20, client.get_buddies) ecore.main_loop_begin() diff --git a/purple.pyx b/purple.pyx index a011ff0..b3ab8b1 100644 --- a/purple.pyx +++ b/purple.pyx @@ -252,21 +252,34 @@ cdef class Purple: conn = Connection() conn.connect() - def attach_signals(self, __signal_cbs=None): - if __signal_cbs is not None: - global signal_cbs - signal_cbs = __signal_cbs - + def signal_connect(self, name=None, cb=None): cdef int handle - - signals.c_purple_signal_connect(blist.c_purple_blist_get_handle(), - "buddy-signed-off", &handle, - signal_buddy_signed_off_cb, NULL) - - signals.c_purple_signal_connect( - conversation.c_purple_conversations_get_handle(), - "receiving-im-msg", &handle, - signal_receiving_im_msg_cb, NULL) + cdef plugin.PurplePlugin *jabber + + if name is None: + return + + jabber = prpl.c_purple_find_prpl("prpl-jabber") + if jabber == NULL: + return + + global signal_cbs + signal_cbs[name] = cb + + if name == "buddy-signed-off": + signals.c_purple_signal_connect( + blist.c_purple_blist_get_handle(), + "buddy-signed-off", &handle, + signal_buddy_signed_off_cb, NULL) + elif name == "receiving-im-msg": + signals.c_purple_signal_connect( + conversation.c_purple_conversations_get_handle(), + "receiving-im-msg", &handle, + signal_receiving_im_msg_cb, NULL) + elif name == "jabber-receiving-xmlnode": + signals.c_purple_signal_connect( + jabber, "jabber-receiving-xmlnode", &handle, + jabber_receiving_xmlnode_cb, NULL) def new_account(self, username, protocol_id): acc = Account(username, protocol_id) diff --git a/signal_cbs.pxd b/signal_cbs.pxd index 4b0885a..64c66d1 100644 --- a/signal_cbs.pxd +++ b/signal_cbs.pxd @@ -22,43 +22,43 @@ cimport purple signal_cbs = {} cdef void signal_buddy_signed_off_cb (blist.PurpleBuddy *buddy): - debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "signal", - "buddy_signed_off\n") - if buddy.server_alias: name = buddy.server_alias + elif buddy.alias: + name = buddy.alias else: - if buddy.alias: - name = buddy.alias - else: - name = buddy.name + name = buddy.name try: - (signal_cbs["buddy_signed_off"])(name, buddy.name) + ( signal_cbs["buddy-signed-off"])(name, buddy.name) except KeyError: pass cdef glib.gboolean signal_receiving_im_msg_cb (account.PurpleAccount *account, - char **sender, - char **message, - conversation.PurpleConversation *conv, - conversation.PurpleMessageFlags *flags): - debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "signal", - "receivinv_im_msg_cb\n") - + char **sender, char **message, conversation.PurpleConversation *conv, + conversation.PurpleMessageFlags *flags): cdef blist.PurpleBuddy *buddy = blist.c_purple_find_buddy(account, sender[0]) if buddy.server_alias: name = buddy.server_alias + elif buddy.alias: + name = buddy.alias else: - if buddy.alias: - name = buddy.alias - else: - name = buddy.name + name = buddy.name - stripped_msg = util.c_purple_markup_strip_html(message[0]) + stripped = util.c_purple_markup_strip_html(message[0]) try: - return (signal_cbs["receiving_im_msg"])(sender[0], name, stripped_msg) + return ( signal_cbs["receiving-im-msg"])(sender[0], name, stripped) except KeyError: return False + +cdef void jabber_receiving_xmlnode_cb (connection.PurpleConnection *gc, + xmlnode.xmlnode **packet, glib.gpointer null): + + message = xmlnode.xmlnode_to_str(packet[0], NULL) + + try: + ( signal_cbs["jabber-receiving-xmlnode"])(message) + except KeyError: + pass