def test_download(self): downloader = Downloader("http://0.0.0.0:%d/data/test.txt" % self._port) self._complete = False downloader.connect('complete', self.download_complete_cb) downloader.download() while not self._complete: Gtk.main_iteration() self.assertEqual("hello\n", self._result.get_data())
class NewAsloUpdater(object): """ Checks for updates using the new ASLO's update.json file """ def __init__(self): self._completion_cb = None self._progress_cb = None self._error_cb = None self._bundles = [] self._downloader = None self._canceled = False def fetch_update_info(self, installed_bundles, auto, progress_cb, completion_cb, error_cb): self._completion_cb = completion_cb self._progress_cb = progress_cb self._error_cb = error_cb self._bundles = installed_bundles self._progress_cb('', 0) # Set the status to 'Looking for updates' settings = Gio.Settings('org.sugarlabs.update') data_json_url = settings.get_string('new-aslo-url') self._downloader = Downloader(data_json_url) self._downloader.connect('complete', self.__data_json_download_complete_cb) self._downloader.download() def __data_json_download_complete_cb(self, downloader, result): if self._canceled: return try: activities = json.loads(result.get_data())['activities'] except ValueError: self._error_cb('Can not parse loaded update.json') return updates = [] for i, bundle in enumerate(self._bundles): self._progress_cb(bundle.get_name(), i/len(self._bundles)) if bundle.get_bundle_id() not in activities: logging.debug('%s not in activities' % bundle.get_bundle_id()) continue activity = activities[bundle.get_bundle_id()] try: version = NormalizedVersion(str(activity['version'])) min_sugar = NormalizedVersion(str(activity['minSugarVersion'])) except KeyError: logging.debug('KeyError - %s' % bundle.get_bundle_id()) continue except InvalidVersionError: logging.debug('InvalidVersion - %s' % bundle.get_bundle_id()) continue if NormalizedVersion(bundle.get_activity_version()) >= version: logging.debug('%s is up to date' % bundle.get_bundle_id()) continue if NormalizedVersion(config.version) < min_sugar: logging.debug('Upgrade sugar for %s' % bundle.get_bundle_id()) continue logging.debug('Marked for update: %s' % bundle.get_bundle_id()) u = BundleUpdate(bundle.get_bundle_id(), bundle.get_name(), version, activity['xo_url'], activity.get('xo_size', 1024 * 2)) updates.append(u) self._completion_cb(updates) def cancel(self): self._canceled = True if self._downloader: self._downloader.cancel() self._completion_cb(None) def clean(self): self._canceled = False
class _UpdateChecker(GObject.GObject): __gsignals__ = { 'check-complete': (GObject.SignalFlags.RUN_FIRST, None, (object, )), } _CHUNK_SIZE = 10240 def __init__(self): GObject.GObject.__init__(self) self._bundle = None def check(self, bundle): # ASLO knows only about stable SP releases major, minor = config.version.split('.')[0:2] sp_version = '%s.%s' % (major, int(minor) + int(minor) % 2) url = '%s?id=%s&appVersion=%s' % \ (_UPDATE_PATH, bundle.get_bundle_id(), sp_version) self._bundle = bundle _logger.debug('Fetch %s', url) self._downloader = Downloader(url) self._downloader.connect('complete', self.__downloader_complete_cb) self._downloader.download() def __downloader_complete_cb(self, downloader, result): if isinstance(result, Exception): self.emit('check-complete', result) return if result is None: _logger.error('No XML update data returned from ASLO') return document = XML(result.get_data()) if document.find(_FIND_DESCRIPTION) is None: _logger.debug( 'Bundle %s not available in the server for the ' 'version %s', self._bundle.get_bundle_id(), config.version) version = None link = None size = None self.emit('check-complete', None) return try: version = NormalizedVersion(document.find(_FIND_VERSION).text) except InvalidVersionError: _logger.exception('Exception occurred while parsing version') self.emit('check-complete', None) return link = document.find(_FIND_LINK).text try: size = long(document.find(_FIND_SIZE).text) * 1024 except ValueError: _logger.exception('Exception occurred while parsing size') size = 0 if version > NormalizedVersion(self._bundle.get_activity_version()): result = BundleUpdate(self._bundle.get_bundle_id(), self._bundle.get_name(), version, link, size) else: result = None self.emit('check-complete', result)
class _UpdateChecker(GObject.GObject): __gsignals__ = { 'check-complete': (GObject.SignalFlags.RUN_FIRST, None, (object,)), } _CHUNK_SIZE = 10240 def __init__(self): GObject.GObject.__init__(self) self._bundle = None def check(self, bundle): # ASLO knows only about stable SP releases major, minor = config.version.split('.')[0:2] sp_version = '%s.%s' % (major, int(minor) + int(minor) % 2) url = '%s?id=%s&appVersion=%s' % \ (_UPDATE_PATH, bundle.get_bundle_id(), sp_version) self._bundle = bundle _logger.debug('Fetch %s', url) self._downloader = Downloader(url) self._downloader.connect('complete', self.__downloader_complete_cb) self._downloader.download() def __downloader_complete_cb(self, downloader, result): if isinstance(result, Exception): self.emit('check-complete', result) return if result is None: _logger.error('No XML update data returned from ASLO') return document = XML(result.get_data()) if document.find(_FIND_DESCRIPTION) is None: _logger.debug('Bundle %s not available in the server for the ' 'version %s', self._bundle.get_bundle_id(), config.version) version = None link = None size = None self.emit('check-complete', None) return try: version = NormalizedVersion(document.find(_FIND_VERSION).text) except InvalidVersionError: _logger.exception('Exception occurred while parsing version') self.emit('check-complete', None) return link = document.find(_FIND_LINK).text try: size = long(document.find(_FIND_SIZE).text) * 1024 except ValueError: _logger.exception('Exception occurred while parsing size') size = 0 if version > NormalizedVersion(self._bundle.get_activity_version()): result = BundleUpdate(self._bundle.get_bundle_id(), self._bundle.get_name(), version, link, size) else: result = None self.emit('check-complete', result)