From: propeller Date: Wed, 27 May 2009 15:46:07 +0000 (+0300) Subject: Data fetching from server now done in separate thread. X-Git-Url: https://vcs.maemo.org/git/?p=canola-rtm;a=commitdiff_plain;h=b68df0a1bc76f5def41562bcbc5e8d8e9a3415e7 Data fetching from server now done in separate thread. --- diff --git a/canola-rtm/rtm/model.py b/canola-rtm/rtm/model.py index 27f8b51..0034237 100644 --- a/canola-rtm/rtm/model.py +++ b/canola-rtm/rtm/model.py @@ -23,10 +23,13 @@ # permission to convey the resulting work. import logging +import urllib2 +import socket from terra.core.manager import Manager from terra.core.task import Task from terra.core.model import ModelFolder, Model +from terra.core.threaded_func import ThreadedFunction from client import Client @@ -57,22 +60,61 @@ class RTMTaskModel(Model): class ServiceModelFolder(ModelFolder): terra_type = "Model/Folder/Task/Apps/RTM/Service" + threaded_search = True empty_msg = "No tasks found" def __init__(self, name, parent): ModelFolder.__init__(self, name, parent) + self.callback_notify = None # TODO change token self.client = Client('1e6e489de9374b43ba280ab9741d290c', 'c7197d30f722247d', '1f4c8846175f4bafcf70f7742f4670e41b0ab046') def do_load(self): self.search() - def search(self): + def search(self, end_callback=None): del self.children[:] - for c in self.do_search(): - self.children.append(c) - return + if not self.threaded_search: + for item in self.do_search(): + self.children.append(item) + return + + def refresh(): + return self.do_search() + + def refresh_finished(exception, retval): + if not self.is_loading: + log.info("model is not loading") + return + + if exception is not None: + if type(exception) is socket.gaierror or \ + type(exception) is urllib2.URLError: + emsg = "Unable to connect to server.
" + \ + "Check your connection and try again." + else: + emsg = "An unknown error has occured." + + log.error(exception) + + if self.callback_notify: + self.callback_notify(CanolaError(emsg)) + + if retval is None: + self.inform_loaded() + return + + for item in retval: + self.children.append(item) + + if end_callback: + end_callback() + + self.inform_loaded() + + self.is_loading = True + ThreadedFunction(refresh_finished, refresh).start() def do_search(self): raise NotImplementedError("must be implemented by subclasses")