diff -Nur gaim-2.0.0+beta6.dist/libgaim/gaim-url-handler gaim-2.0.0+beta6/libgaim/gaim-url-handler --- gaim-2.0.0+beta6.dist/libgaim/gaim-url-handler 2007-05-15 23:26:51.000000000 +0200 +++ gaim-2.0.0+beta6/libgaim/gaim-url-handler 2007-01-19 05:28:24.000000000 +0100 @@ -22,14 +22,10 @@ self.attr = attr def __call__(self, *args): - # Redirect stderr to suppress the printing of an " Introspect error" - # message if nothing is listening on the bus. We print a friendly - # error message ourselves. - real_stderr = sys.stderr - sys.stderr = None result = self.cobj.obj.__getattr__(self.attr)(*args) - sys.stderr = real_stderr - return result + if result == 0: + raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) + return result cgaim = CheckedObject(gaim) @@ -46,20 +42,16 @@ return value def findaccount(protocolname, accountname=""): - # prefer connected accounts - account = cgaim.GaimAccountsFindConnected(accountname, protocolname) - if (account != 0): - return account - - # try to get any account and connect it - account = cgaim.GaimAccountsFindAny(accountname, protocolname) - if (account == 0): - print "No matching account found." - sys.exit(1) - - gaim.GaimAccountSetStatusVargs(account, "online", 1) - gaim.GaimAccountConnect(account) - return account + try: + # prefer connected accounts + account = cgaim.GaimAccountsFindConnected(accountname, protocolname) + return account + except: + # try to get any account and connect it + account = cgaim.GaimAccountsFindAny(accountname, protocolname) + gaim.GaimAccountSetStatusVargs(account, "online", 1) + gaim.GaimAccountConnect(account) + return account def goim(account, screenname, message=None): # XXX: 1 == GAIM_CONV_TYPE_IM @@ -86,14 +78,14 @@ def aim(uri): - protocol = "prpl-aim" - match = re.match(r"^aim:([^?]*)(\?(.*))", uri) + protocol = "prpl-oscar" + match = re.match(r"^(aim|icq):([^?]*)(\?(.*))", uri) if not match: print "Invalid aim URI: %s" % uri return - command = urllib.unquote_plus(match.group(1)) - paramstring = match.group(3) + command = urllib.unquote_plus(match.group(2)) + paramstring = match.group(4) params = {} if paramstring: for param in paramstring.split("&"): @@ -123,31 +115,7 @@ 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", "")) - + aim(uri) def irc(uri): protocol = "prpl-irc" @@ -221,26 +189,26 @@ def xmpp(uri): protocol = "prpl-jabber" - match = re.match(r"^xmpp:(//([^/?#]*)/?)?([^?#]*)(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri) + match = re.match(r"^xmpp:((//)?([^/?#]*))?(/?([^?#]*))(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri) if not match: print "Invalid xmpp URI: %s" % uri return - tmp = match.group(2) + tmp = match.group(3) if (tmp): accountname = urllib.unquote_plus(tmp) else: accountname = "" - screenname = urllib.unquote_plus(match.group(3)) + screenname = urllib.unquote_plus(match.group(5)) - tmp = match.group(5) + tmp = match.group(7) if (tmp): command = urllib.unquote_plus(tmp) else: command = "" - paramstring = match.group(7) + paramstring = match.group(9) params = {} if paramstring: for param in paramstring.split(";"): diff -Nur gaim-2.0.0+beta6.dist/libgaim/gaim-url-handler~ gaim-2.0.0+beta6/libgaim/gaim-url-handler~ --- gaim-2.0.0+beta6.dist/libgaim/gaim-url-handler~ 2007-01-19 05:28:24.000000000 +0100 +++ gaim-2.0.0+beta6/libgaim/gaim-url-handler~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,285 +0,0 @@ -#!/usr/bin/python - -import dbus -import re -import sys -import time -import urllib - -obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") -gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") - -class CheckedObject: - def __init__(self, obj): - self.obj = obj - - def __getattr__(self, attr): - return CheckedAttribute(self, attr) - -class CheckedAttribute: - def __init__(self, cobj, attr): - self.cobj = cobj - self.attr = attr - - def __call__(self, *args): - result = self.cobj.obj.__getattr__(self.attr)(*args) - if result == 0: - raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) - return result - -cgaim = CheckedObject(gaim) - -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=""): - try: - # prefer connected accounts - account = cgaim.GaimAccountsFindConnected(accountname, protocolname) - return account - except: - # try to get any account and connect it - account = cgaim.GaimAccountsFindAny(accountname, protocolname) - gaim.GaimAccountSetStatusVargs(account, "online", 1) - gaim.GaimAccountConnect(account) - return account - -def goim(account, screenname, message=None): - # XXX: 1 == GAIM_CONV_TYPE_IM - conversation = cgaim.GaimConversationNew(1, account, screenname) - if message: - gaim.GaimConvSendConfirm(conversation, message) - -def gochat(account, params, message=None): - connection = cgaim.GaimAccountGetConnection(account) - gaim.ServJoinChat(connection, params) - - if message != None: - for i in range(20): - # XXX: 2 == GAIM_CONV_TYPE_CHAT - conversation = gaim.GaimFindConversationWithAccount(2, params.get("channel", params.get("room")), account) - if conversation: - gaim.GaimConvSendConfirm(conversation, message) - break - else: - time.sleep(0.5) - -def addbuddy(account, screenname, group="", alias=""): - cgaim.GaimBlistRequestAddBuddy(account, screenname, group, alias) - - -def aim(uri): - protocol = "prpl-oscar" - match = re.match(r"^(aim|icq):([^?]*)(\?(.*))", uri) - if not match: - print "Invalid aim URI: %s" % uri - return - - command = urllib.unquote_plus(match.group(2)) - paramstring = match.group(4) - 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): - aim(uri) - -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(3) - if (tmp): - accountname = urllib.unquote_plus(tmp) - else: - accountname = "" - - screenname = urllib.unquote_plus(match.group(5)) - - tmp = match.group(7) - if (tmp): - command = urllib.unquote_plus(tmp) - else: - command = "" - - paramstring = match.group(9) - 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] - print "Example: %s \"xmpp:romeo@montague.net?message\"" % argv[0] - return - - uri = argv[1] - type = uri.split(":")[0] - - 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 - -if __name__ == "__main__": - main()