ctypedef gint gboolean
ctypedef gboolean (*GSourceFunc) (gpointer data)
ctypedef unsigned int gsize
+ ctypedef signed int gssize
ctypedef char gchar
ctypedef unsigned char guchar
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)
cimport savedstatuses
cimport value
cimport util
+cimport xmlnode
cdef extern from "libpurple/purple.h":
pass
--- /dev/null
+#
+# 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)
conv_cbs = {}
notify_cbs = {}
request_cbs = {}
-signal_cbs = {}
def account_callback(name):
print "---- account callback example: %s" % name
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
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
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):
import ecore
import getpass
import sys
+from xml.dom import minidom
cbs = {}
acc_cbs = {}
conv_cbs = {}
notify_cbs = {}
request_cbs = {}
-signal_cbs = {}
def account_callback(name):
print "---- account 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["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
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):
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()
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,
- <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)
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:
- (<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,
- 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 (<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
+
+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