diff options
Diffstat (limited to 'module/gui/connector.py')
| -rw-r--r-- | module/gui/connector.py | 311 | 
1 files changed, 311 insertions, 0 deletions
| diff --git a/module/gui/connector.py b/module/gui/connector.py new file mode 100644 index 000000000..975e1ca1b --- /dev/null +++ b/module/gui/connector.py @@ -0,0 +1,311 @@ +# -*- coding: utf-8 -*- +""" +    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 +    the Free Software Foundation; either version 3 of the License, +    or (at your option) any later version. + +    This program 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/>. +     +    @author: mkaay +""" + +SERVER_VERSION = "0.4.1-dev" + +from time import sleep +from uuid import uuid4 as uuid + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +from xmlrpclib import ServerProxy +import socket + +class Connector(QThread): +    def __init__(self): +        QThread.__init__(self) +        self.mutex = QMutex() +        self.addr = None +        self.errorQueue = [] +        self.connectionID = None +        self.running = True +        self.proxy = self.Dummy() +     +    def setAddr(self, addr): +        """ +            set new address +        """ +        self.mutex.lock() +        self.addr = addr +        self.mutex.unlock() +     +    def connectProxy(self): +        self.proxy = DispatchRPC(self.mutex, ServerProxy(self.addr, allow_none=True, verbose=False)) +        self.connect(self.proxy, SIGNAL("proxy_error"), self._proxyError) +        self.connect(self.proxy, SIGNAL("connectionLost"), self, SIGNAL("connectionLost")) +        try: +            server_version = self.proxy.get_server_version() +            self.connectionID = uuid().hex +        except: +            return False +        if not server_version: +            return False +        elif not server_version == SERVER_VERSION: +            self.emit(SIGNAL("error_box"), "server is version %s client accepts version %s" % (server_version, SERVER_VERSION)) +            return False +        return True +     +    def canConnect(self): +        return self.connectProxy() +     +    def _proxyError(self, func, e): +        """ +            formats proxy error msg +        """ +        msg = "proxy error in '%s':\n%s" % (func, e) +        self.errorQueue.append(msg) +     +    def getError(self): +        self.mutex.lock() +        if len(self.errorQueue) > 0: +            err = self.errorQueue.pop() +            print err +            self.emit(SIGNAL("error_box"), err) +        self.mutex.unlock() +     +    def stop(self): +        """ +            stop thread +        """ +        self.running = False +     +    def run(self): +        """ +            start thread +            (called from thread.start()) +        """ +        self.canConnect() +        while self.running: +            sleep(1) +            self.getError() +     +    class Dummy(object): +        def __getattr__(self, attr): +            def dummy(*args, **kwargs): +                return None +            return dummy +     +    def getPackageCollector(self): +        """ +            grab packages from collector and return the data +        """ +        return self.proxy.get_collector() +     +    def getLinkInfo(self, id): +        """ +            grab file info for the given id and return it +        """ +        w = self.proxy.get_file_info +        w.error = False +        info = w(id) +        if not info: return None +        info["downloading"] = None +        return info +     +    def getPackageInfo(self, id): +        """ +            grab package info for the given id and return it +        """ +        w = self.proxy.get_package_data +        w.error = False +        return w(id) +     +    def getPackageQueue(self): +        """ +            grab queue return the data +        """ +        return self.proxy.get_queue() +     +    def getPackageFiles(self, id): +        """ +            grab package files and return ids +        """ +        return self.proxy.get_package_files(id) +     +    def getDownloadQueue(self): +        """ +            grab files that are currently downloading and return info +        """ +        return self.proxy.status_downloads() +     +    def getServerStatus(self): +        """ +            return server status +        """ +        return self.proxy.status_server() +     +    def addURLs(self, links): +        """ +            add links to collector +        """ +        self.proxy.add_urls(links) +     +    def togglePause(self): +        """ +            toogle pause +        """ +        return self.proxy.toggle_pause() +     +    def setPause(self, pause): +        """ +            set pause +        """ +        if pause: +            self.proxy.pause_server() +        else: +            self.proxy.unpause_server() +     +    def newPackage(self, name): +        """ +            create a new package and return id +        """ +        return self.proxy.new_package(name) +     +    def addFileToPackage(self, fileid, packid): +        """ +            add a file from collector to package +        """ +        self.proxy.move_file_2_package(fileid, packid) +     +    def pushPackageToQueue(self, packid): +        """ +            push a package to queue +        """ +        self.proxy.push_package_2_queue(packid) +     +    def restartPackage(self, packid): +        """ +            restart a package +        """ +        self.proxy.restart_package(packid) +     +    def restartFile(self, fileid): +        """ +            restart a file +        """ +        self.proxy.restart_file(fileid) +     +    def removePackage(self, packid): +        """ +            remove a package +        """ +        self.proxy.del_packages([packid,]) +     +    def removeFile(self, fileid): +        """ +            remove a file +        """ +        self.proxy.del_links([fileid,]) +     +    def uploadContainer(self, filename, type, content): +        """ +            upload a container +        """ +        self.proxy.upload_container(filename, type, content) +     +    def getLog(self, offset): +        """ +            get log +        """ +        return self.proxy.get_log(offset) +     +    def stopAllDownloads(self): +        """ +            get log +        """ +        self.proxy.pause_server() +        self.proxy.stop_downloads() +     +    def updateAvailable(self): +        """ +            update available +        """ +        return self.proxy.update_available() +     +    def setPackageName(self, pid, name): +        """ +            set new package name +        """ +        return self.proxy.set_package_name(pid, name) +     +    def pullOutPackage(self, pid): +        """ +            pull out package +        """ +        return self.proxy.pull_out_package(pid) +     +    def captchaWaiting(self): +        """ +            is the a captcha waiting? +        """ +        return self.proxy.is_captcha_waiting() +     +    def getCaptcha(self): +        """ +            get captcha +        """ +        return self.proxy.get_captcha_task() +     +    def setCaptchaResult(self, cid, result): +        """ +            get captcha +        """ +        return self.proxy.set_captcha_result(cid, result) +     +    def getCaptchaStatus(self, cid): +        """ +            get captcha status +        """ +        return self.proxy.get_task_status(cid) +     +    def getEvents(self): +        """ +            get events +        """ +        return self.proxy.get_events(self.connectionID) + +class DispatchRPC(QObject): +    def __init__(self, mutex, server): +        QObject.__init__(self) +        self.mutex = mutex +        self.server = server +     +    def __getattr__(self, attr): +        self.mutex.lock() +        self.fname = attr +        f = self.Wrapper(getattr(self.server, attr), self.mutex, self) +        return f +     +    class Wrapper(object): +        def __init__(self, f, mutex, dispatcher): +            self.f = f +            self.mutex = mutex +            self.dispatcher = dispatcher +            self.error = True +         +        def __call__(self, *args, **kwargs): +            try: +                return self.f(*args, **kwargs) +            except socket.error: +                self.dispatcher.emit(SIGNAL("connectionLost")) +            except Exception, e: +                if self.error: +                    self.dispatcher.emit(SIGNAL("proxy_error"), self.dispatcher.fname, e) +            finally: +                self.mutex.unlock() | 
