Replaced attach_signals with signal_connect method. (UPDATE)
authorRagner Magalhaes <ragner.magalhaes@openbossa.org>
Tue, 2 Dec 2008 20:44:49 +0000 (20:44 +0000)
committerAnderson Briglia <anderson.briglia@openbossa.org>
Sat, 28 Feb 2009 21:11:13 +0000 (17:11 -0400)
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 <bruno.abinader@indt.org.br>

git-svn-id: https://garage.maemo.org/svn/carman/branches/carman-0.7-beta2/python-purple@1346 596f6dd7-e928-0410-a184-9e12fd12cf7e

libpurple/glib.pxd
libpurple/purple.pxd
libpurple/xmlnode.pxd [new file with mode: 0644]
nullclient-ecore.py
nullclient.py
purple.pyx
signal_cbs.pxd

index ea71a89..c26168b 100644 (file)
@@ -31,6 +31,7 @@ cdef extern from "glib.h":
     ctypedef gint gboolean
     ctypedef gboolean (*GSourceFunc) (gpointer data)
     ctypedef unsigned int gsize
     ctypedef gint gboolean
     ctypedef gboolean (*GSourceFunc) (gpointer data)
     ctypedef unsigned int gsize
+    ctypedef signed int gssize
     ctypedef char gchar
     ctypedef unsigned char guchar
 
     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)
     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)
index 41be7bf..e7a76cb 100644 (file)
@@ -44,6 +44,7 @@ cimport status
 cimport savedstatuses
 cimport value
 cimport util
 cimport savedstatuses
 cimport value
 cimport util
+cimport xmlnode
 
 cdef extern from "libpurple/purple.h":
     pass
 
 cdef extern from "libpurple/purple.h":
     pass
diff --git a/libpurple/xmlnode.pxd b/libpurple/xmlnode.pxd
new file mode 100644 (file)
index 0000000..cf7d30e
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+#
+
+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)
index 94d8f92..8825af4 100644 (file)
@@ -9,7 +9,6 @@ conn_cbs = {}
 conv_cbs = {}
 notify_cbs = {}
 request_cbs = {}
 conv_cbs = {}
 notify_cbs = {}
 request_cbs = {}
-signal_cbs = {}
 
 def account_callback(name):
     print "---- account callback example: %s" % name
 
 def account_callback(name):
     print "---- account callback example: %s" % name
@@ -104,17 +103,6 @@ request_cbs["request_folder"] = request_callback
 
 cbs["request"] = request_cbs
 
 
 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
 class MainWindow:
     def __init__(self, quit_cb):
         global conv_cbs
@@ -239,12 +227,8 @@ class NullClientPurple:
         self.username = "carmanplugintest@gmail.com"
         self.password = "abc123def"
 
         self.username = "carmanplugintest@gmail.com"
         self.password = "abc123def"
 
-
         global cbs
         global cbs
-        global signal_cbs
         cbs["blist"]["update"] = self._purple_update_blist_cb
         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
         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.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):
 
     def send_msg(self, name, msg):
         if not self.conversations.has_key(name):
index 641e034..2904196 100644 (file)
@@ -2,6 +2,7 @@ import purple
 import ecore
 import getpass
 import sys
 import ecore
 import getpass
 import sys
+from xml.dom import minidom
 
 cbs = {}
 acc_cbs = {}
 
 cbs = {}
 acc_cbs = {}
@@ -10,7 +11,6 @@ conn_cbs = {}
 conv_cbs = {}
 notify_cbs = {}
 request_cbs = {}
 conv_cbs = {}
 notify_cbs = {}
 request_cbs = {}
-signal_cbs = {}
 
 def account_callback(name):
     print "---- account callback example: %s" % name
 
 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 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["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
 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):
 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):
 
 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
 
     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):
 
 class NullClient:
     def __init__(self):
@@ -213,14 +223,16 @@ def getpassword():
     return getpass.getpass()
 
 if __name__ == '__main__':
     return getpass.getpass()
 
 if __name__ == '__main__':
-
     client = NullClient()
     client.execute()
     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()
     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()
     ecore.timer_add(20, client.get_buddies)
     ecore.main_loop_begin()
index a011ff0..b3ab8b1 100644 (file)
@@ -252,21 +252,34 @@ cdef class Purple:
         conn = Connection()
         conn.connect()
 
         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
         cdef int handle
-
-        signals.c_purple_signal_connect(blist.c_purple_blist_get_handle(),
-                "buddy-signed-off", &handle,
-                <signals.PurpleCallback> signal_buddy_signed_off_cb, NULL)
-
-        signals.c_purple_signal_connect(
-                conversation.c_purple_conversations_get_handle(),
-                "receiving-im-msg", &handle,
-                <signals.PurpleCallback> 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,
+                    <signals.PurpleCallback> 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,
+                    <signals.PurpleCallback> signal_receiving_im_msg_cb, NULL)
+        elif name == "jabber-receiving-xmlnode":
+            signals.c_purple_signal_connect(
+                    jabber, "jabber-receiving-xmlnode", &handle,
+                    <signals.PurpleCallback> jabber_receiving_xmlnode_cb, NULL)
 
     def new_account(self, username, protocol_id):
         acc = Account(username, protocol_id)
 
     def new_account(self, username, protocol_id):
         acc = Account(username, protocol_id)
index 4b0885a..64c66d1 100644 (file)
@@ -22,43 +22,43 @@ cimport purple
 signal_cbs = {}
 
 cdef void signal_buddy_signed_off_cb (blist.PurpleBuddy *buddy):
 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
     if buddy.server_alias:
         name = buddy.server_alias
+    elif buddy.alias:
+        name = buddy.alias
     else:
     else:
-        if buddy.alias:
-            name = buddy.alias
-        else:
-            name = buddy.name
+        name = buddy.name
 
     try:
 
     try:
-        (<object>signal_cbs["buddy_signed_off"])(name, buddy.name)
+        (<object> signal_cbs["buddy-signed-off"])(name, buddy.name)
     except KeyError:
         pass
 
 cdef glib.gboolean signal_receiving_im_msg_cb (account.PurpleAccount *account,
     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
     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:
     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:
 
     try:
-        return (<object>signal_cbs["receiving_im_msg"])(sender[0], name, stripped_msg)
+        return (<object> signal_cbs["receiving-im-msg"])(sender[0], name, stripped)
     except KeyError:
         return False
     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:
+        (<object> signal_cbs["jabber-receiving-xmlnode"])(message)
+    except KeyError:
+        pass