diff options
author | Miklos Vajna <vmiklos@frugalware.org> | 2011-04-12 01:26:09 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@frugalware.org> | 2011-04-12 01:26:09 +0200 |
commit | d5a66f8ae910023efdbfc8343a63dca110b8bf09 (patch) | |
tree | 6ccabf8619f811e82bec5201276d7dc100275afa | |
parent | 3423be07392acb960fed3e014141ce5df177c06f (diff) |
add back optional gobject support
on windows socket/threading is needed as there are no gobject, but those
directly on linux would be suboptimal
-rw-r--r-- | skype/skyped.py | 156 |
1 files changed, 106 insertions, 50 deletions
diff --git a/skype/skyped.py b/skype/skyped.py index 733080f1..023c1f81 100644 --- a/skype/skyped.py +++ b/skype/skyped.py @@ -2,7 +2,7 @@ # # skyped.py # -# Copyright (c) 2007, 2008, 2009, 2010 by Miklos Vajna <vmiklos@frugalware.org> +# Copyright (c) 2007, 2008, 2009, 2010, 2011 by Miklos Vajna <vmiklos@frugalware.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -32,16 +32,24 @@ import hashlib from ConfigParser import ConfigParser, NoOptionError from traceback import print_exception import ssl -import select -import threading __version__ = "0.1.1" +try: + import gobject + hasgobject = True +except ImportError: + import select + import threading + hasgobject = False + def eh(type, value, tb): global options if type != KeyboardInterrupt: print_exception(type, value, tb) + if hasgobject: + gobject.MainLoop().quit() if options.conn: options.conn.close() # shut down client if it's running @@ -69,31 +77,42 @@ def wait_for_lock(lock, timeout_to_print, timeout, msg): locked = lock.acquire(0) return True -def input_handler(fd): +def input_handler(fd, io_condition = None): global options global skype if options.buf: for i in options.buf: skype.send(i.strip()) options.buf = None - return True + if not hasgobject: + return True else: - close_socket = False - if wait_for_lock(options.lock, 3, 10, "input_handler"): - try: - input = fd.recv(1024) + if not hasgobject: + close_socket = False + if wait_for_lock(options.lock, 3, 10, "input_handler"): + try: + input = fd.recv(1024) + options.lock.release() + except Exception, s: + dprint("Warning, receiving 1024 bytes failed (%s)." % s) + fd.close() + options.conn = False options.lock.release() - except Exception, s: - dprint("Warning, receiving 1024 bytes failed (%s)." % s) - fd.close() - options.conn = False - options.lock.release() - return False - for i in input.split("\n"): - if i.strip() == "SET USERSTATUS OFFLINE": - close_socket = True - skype.send(i.strip()) - return not(close_socket) + return False + for i in input.split("\n"): + if i.strip() == "SET USERSTATUS OFFLINE": + close_socket = True + skype.send(i.strip()) + return not(close_socket) + try: + input = fd.recv(1024) + except Exception, s: + dprint("Warning, receiving 1024 bytes failed (%s)." % s) + fd.close() + return False + for i in input.split("\n"): + skype.send(i.strip()) + return True def skype_idle_handler(skype): try: @@ -105,24 +124,37 @@ def skype_idle_handler(skype): def send(sock, txt): global options + from time import sleep count = 1 done = False - while (not done) and (count < 10) and options.conn: - if wait_for_lock(options.lock, 3, 10, "socket send"): + if hasgobject: + while (not done) and (count < 10): try: - if options.conn: sock.send(txt) - options.lock.release() + sock.send(txt) done = True except Exception, s: - options.lock.release() count += 1 dprint("Warning, sending '%s' failed (%s). count=%d" % (txt, s, count)) - time.sleep(1) - if not done: - if options.conn: + sleep(1) + if not done: options.conn.close() - options.conn = False - return done + else: + while (not done) and (count < 10) and options.conn: + if wait_for_lock(options.lock, 3, 10, "socket send"): + try: + if options.conn: sock.send(txt) + options.lock.release() + done = True + except Exception, s: + options.lock.release() + count += 1 + dprint("Warning, sending '%s' failed (%s). count=%d" % (txt, s, count)) + sleep(1) + if not done: + if options.conn: + options.conn.close() + options.conn = False + return done def bitlbee_idle_handler(skype): global options @@ -133,23 +165,34 @@ def bitlbee_idle_handler(skype): done = send(options.conn, "%s\n" % e) except Exception, s: dprint("Warning, sending '%s' failed (%s)." % (e, s)) - if options.conn: options.conn.close() - options.conn = False - done = False - return done + if hasgobject: + options.conn.close() + else: + if options.conn: options.conn.close() + options.conn = False + done = False + if hasgobject: + return True + else: + return done + return True -def server(host, port, skype): +def server(host, port, skype = None): global options sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((host, port)) sock.listen(1) - dprint("Waiting for connection...") - listener(sock, skype) + if hasgobject: + gobject.io_add_watch(sock, gobject.IO_IN, listener) + else: + dprint("Waiting for connection...") + listener(sock, skype) def listener(sock, skype): global options - if not(wait_for_lock(options.lock, 3, 10, "listener")): return False + if not hasgobject: + if not(wait_for_lock(options.lock, 3, 10, "listener")): return False rawsock, addr = sock.accept() options.conn = ssl.wrap_socket(rawsock, server_side=True, @@ -160,7 +203,8 @@ def listener(sock, skype): try: options.conn.handshake() except Exception: - options.lock.release() + if not hasgobject: + options.lock.release() dprint("Warning, handshake failed, closing connection.") return False ret = 0 @@ -174,21 +218,26 @@ def listener(sock, skype): except Exception, s: dprint("Warning, receiving 1024 bytes failed (%s)." % s) options.conn.close() - options.conn = False - options.lock.release() + if not hasgobject: + options.conn = False + options.lock.release() return False if ret == 2: dprint("Username and password OK.") options.conn.send("PASSWORD OK\n") - options.lock.release() - serverloop(options, skype) + if hasgobject: + gobject.io_add_watch(options.conn, gobject.IO_IN, input_handler) + else: + options.lock.release() + serverloop(options, skype) return True else: dprint("Username and/or password WRONG.") options.conn.send("PASSWORD KO\n") - options.conn.close() - options.conn = False - options.lock.release() + if not hasgobject: + options.conn.close() + options.conn = False + options.lock.release() return False def dprint(msg): @@ -422,11 +471,18 @@ if __name__=='__main__': sys.exit(0) else: dprint('skyped is started on port %s' % options.port) + if hasgobject: + server(options.host, options.port) try: skype = SkypeApi() except Skype4Py.SkypeAPIError, s: sys.exit("%s. Are you sure you have started Skype?" % s) - while 1: - options.conn = False - options.lock = threading.Lock() - server(options.host, options.port, skype) + if hasgobject: + gobject.timeout_add(2000, skype_idle_handler, skype) + gobject.timeout_add(60000, bitlbee_idle_handler, skype) + gobject.MainLoop().run() + else: + while 1: + options.conn = False + options.lock = threading.Lock() + server(options.host, options.port, skype) |