# HG changeset patch # User Sean Egan # Date 1179191162 0 # Node ID cc9242ce1435e229f16ebd111e96d22a5b97b6ac # Parent 74f1f5bbd858b026d344ae84c44f2062965a5ea3 Patch #756 from EvilSporkMan. Use Datallah's url handling for Dbus diff -r 74f1f5bbd858 -r cc9242ce1435 libpurple/purple-url-handler --- a/libpurple/purple-url-handler Mon May 14 19:57:03 2007 +0000 +++ b/libpurple/purple-url-handler Tue May 15 01:06:02 2007 +0000 @@ -38,257 +38,6 @@ cpurple = CheckedObject(purple) -def extendlist(list, length, fill): - if len(list) < length: - return list + [fill] * (length - len(list)) - else: - return list - -def convert(value): - try: - return int(value) - except: - return value - -def findaccount(protocolname, accountname=""): - # prefer connected accounts - account = cpurple.PurpleAccountsFindConnected(accountname, protocolname) - if (account != 0): - return account - - # try to get any account and connect it - account = cpurple.PurpleAccountsFindAny(accountname, protocolname) - if (account == 0): - print "No matching account found." - sys.exit(1) - - purple.PurpleAccountSetStatusVargs(account, "online", 1) - purple.PurpleAccountConnect(account) - return account - -def goim(account, screenname, message=None): - # XXX: 1 == PURPLE_CONV_TYPE_IM - conversation = cpurple.PurpleConversationNew(1, account, screenname) - if message: - purple.PurpleConvSendConfirm(conversation, message) - -def gochat(account, params, message=None): - connection = cpurple.PurpleAccountGetConnection(account) - purple.ServJoinChat(connection, params) - - if message != None: - for i in range(20): - # XXX: 2 == PURPLE_CONV_TYPE_CHAT - conversation = purple.PurpleFindConversationWithAccount(2, params.get("channel", params.get("room")), account) - if conversation: - purple.PurpleConvSendConfirm(conversation, message) - break - else: - time.sleep(0.5) - -def addbuddy(account, screenname, group="", alias=""): - cpurple.PurpleBlistRequestAddBuddy(account, screenname, group, alias) - - -def aim(uri): - protocol = "prpl-aim" - match = re.match(r"^aim:([^?]*)(\?(.*))", uri) - if not match: - print "Invalid aim URI: %s" % uri - return - - command = urllib.unquote_plus(match.group(1)) - paramstring = match.group(3) - params = {} - if paramstring: - for param in paramstring.split("&"): - key, value = extendlist(param.split("=", 1), 2, "") - params[key] = urllib.unquote_plus(value) - accountname = params.get("account", "") - screenname = params.get("screenname", "") - - account = findaccount(protocol, accountname) - - if command.lower() == "goim": - goim(account, screenname, params.get("message")) - elif command.lower() == "gochat": - gochat(account, params) - elif command.lower() == "addbuddy": - addbuddy(account, screenname, params.get("group", "")) - -def gg(uri): - protocol = "prpl-gg" - match = re.match(r"^gg:(.*)", uri) - if not match: - print "Invalid gg URI: %s" % uri - return - - screenname = urllib.unquote_plus(match.group(1)) - account = findaccount(protocol) - goim(account, screenname) - -def icq(uri): - protocol = "prpl-icq" - match = re.match(r"^icq:([^?]*)(\?(.*))", uri) - if not match: - print "Invalid icq URI: %s" % uri - return - - command = urllib.unquote_plus(match.group(1)) - paramstring = match.group(3) - params = {} - if paramstring: - for param in paramstring.split("&"): - key, value = extendlist(param.split("=", 1), 2, "") - params[key] = urllib.unquote_plus(value) - accountname = params.get("account", "") - screenname = params.get("screenname", "") - - account = findaccount(protocol, accountname) - - if command.lower() == "goim": - goim(account, screenname, params.get("message")) - elif command.lower() == "gochat": - gochat(account, params) - elif command.lower() == "addbuddy": - addbuddy(account, screenname, params.get("group", "")) - -def irc(uri): - protocol = "prpl-irc" - match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri) - if not match: - print "Invalid irc URI: %s" % uri - return - - server = urllib.unquote_plus(match.group(2)) or "" - target = match.group(3) or "" - query = match.group(5) or "" - - modifiers = {} - if target: - for modifier in target.split(",")[1:]: - modifiers[modifier] = True - - isnick = modifiers.has_key("isnick") - - paramstring = match.group(5) - params = {} - if paramstring: - for param in paramstring.split("&"): - key, value = extendlist(param.split("=", 1), 2, "") - params[key] = urllib.unquote_plus(value) - - account = findaccount(protocol) - - if (target != ""): - if (isnick): - goim(account, urllib.unquote_plus(target.split(",")[0]), params.get("msg")) - else: - channel = urllib.unquote_plus(target.split(",")[0]) - if channel[0] != "#": - channel = "#" + channel - gochat(account, {"server": server, "channel": channel, "password": params.get("key", "")}, params.get("msg")) - -def msnim(uri): - protocol = "prpl-msn" - match = re.match(r"^msnim:([^?]*)(\?(.*))", uri) - if not match: - print "Invalid msnim URI: %s" % uri - return - - command = urllib.unquote_plus(match.group(1)) - paramstring = match.group(3) - params = {} - if paramstring: - for param in paramstring.split("&"): - key, value = extendlist(param.split("=", 1), 2, "") - params[key] = urllib.unquote_plus(value) - screenname = params.get("contact", "") - - account = findaccount(protocol) - - if command.lower() == "chat": - goim(account, screenname) - elif command.lower() == "add": - addbuddy(account, screenname) - -def sip(uri): - protocol = "prpl-simple" - match = re.match(r"^sip:(.*)", uri) - if not match: - print "Invalid sip URI: %s" % uri - return - - screenname = urllib.unquote_plus(match.group(1)) - account = findaccount(protocol) - goim(account, screenname) - -def xmpp(uri): - protocol = "prpl-jabber" - match = re.match(r"^xmpp:(//([^/?#]*)/?)?([^?#]*)(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri) - if not match: - print "Invalid xmpp URI: %s" % uri - return - - tmp = match.group(2) - if (tmp): - accountname = urllib.unquote_plus(tmp) - else: - accountname = "" - - screenname = urllib.unquote_plus(match.group(3)) - - tmp = match.group(5) - if (tmp): - command = urllib.unquote_plus(tmp) - else: - command = "" - - paramstring = match.group(7) - params = {} - if paramstring: - for param in paramstring.split(";"): - key, value = extendlist(param.split("=", 1), 2, "") - params[key] = urllib.unquote_plus(value) - - account = findaccount(protocol, accountname) - - if command.lower() == "message": - goim(account, screenname, params.get("body")) - elif command.lower() == "join": - room, server = screenname.split("@") - gochat(account, {"room": room, "server": server}) - elif command.lower() == "roster": - addbuddy(account, screenname, params.get("group", ""), params.get("name", "")) - else: - goim(account, screenname) - -def ymsgr(uri): - protocol = "prpl-yahoo" - match = re.match(r"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)", uri) - if not match: - print "Invalid ymsgr URI: %s" % uri - return - - command = urllib.unquote_plus(match.group(1)) - screenname = urllib.unquote_plus(match.group(3)) - paramstring = match.group(5) - params = {} - if paramstring: - for param in paramstring.split("&"): - key, value = extendlist(param.split("=", 1), 2, "") - params[key] = urllib.unquote_plus(value) - - account = findaccount(protocol) - - if command.lower() == "sendim": - goim(account, screenname, params.get("m")) - elif command.lower() == "chat": - gochat(account, {"room": screenname}) - elif command.lower() == "addfriend": - addbuddy(account, screenname) - - def main(argv=sys.argv): if len(argv) != 2: print "Usage: %s URI" % argv[0] @@ -296,27 +45,10 @@ return uri = argv[1] - type = uri.split(":")[0] + print uri try: - if type == "aim": - aim(uri) - elif type == "gg": - gg(uri) - elif type == "icq": - icq(uri) - elif type == "irc": - irc(uri) - elif type == "msnim": - msnim(uri) - elif type == "sip": - sip(uri) - elif type == "xmpp": - xmpp(uri) - elif type == "ymsgr": - ymsgr(uri) - else: - print "Unkown protocol: %s" % type + cpurple.PurpleGotProtocolHandlerUri(uri) except dbus.dbus_bindings.DBusException: print "ERROR: Is there a libpurple-powered client (e.g. Pidgin or Finch) running?" diff -r 74f1f5bbd858 -r cc9242ce1435 libpurple/util.c --- a/libpurple/util.c Mon May 14 19:57:03 2007 +0000 +++ b/libpurple/util.c Tue May 15 01:06:02 2007 +0000 @@ -3102,10 +3102,13 @@ keyend = tmp; if (keyend && keyend != pairstart) { + char *p; key = g_strndup(pairstart, (keyend - pairstart)); /* If there is an explicit value */ if (keyend != tmp && keyend != (tmp - 1)) value = g_strndup(keyend + 1, (tmp - keyend - 1)); + for (p = key; *p; ++p) + *p = g_ascii_tolower(*p); g_hash_table_insert(params, key, value); } keyend = value = NULL;