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() |