def processUpdate(): url = addonInfos["url"] if url.endswith('/'): url = url[0:-1] url = "%s.nvda-addon?%s" % (url, urlencode(paramsDL())) fp = os.path.join(globalVars.appArgs.configPath, "%s.nvda-addon" % sectionName) try: dl = URLopener() dl.retrieve(url, fp) try: curAddons = [] for addon in addonHandler.getAvailableAddons(): curAddons.append(addon) bundle = addonHandler.AddonBundle(fp) prevAddon = None bundleName = bundle.manifest['name'] for addon in curAddons: if not addon.isPendingRemove and bundleName == addon.manifest[ 'name']: prevAddon = addon break if prevAddon: prevAddon.requestRemove() addonHandler.installAddonBundle(bundle) core.restart() except BaseException as e: log.error(e) os.startfile(fp) except BaseException as e: log.error(e) return wx.CallAfter(errorUpdateDialog)
def processUpdate(): url = configBE._addonURL + "latest?" + urlencode(paramsDL()) fp = os.path.join(globalVars.appArgs.configPath, "brailleExtender.nvda-addon") try: dl = URLopener() dl.retrieve(url, fp) try: curAddons = [] for addon in addonHandler.getAvailableAddons(): curAddons.append(addon) bundle = addonHandler.AddonBundle(fp) prevAddon = None bundleName = bundle.manifest['name'] for addon in curAddons: if not addon.isPendingRemove and bundleName == addon.manifest[ 'name']: prevAddon = addon break if prevAddon: prevAddon.requestRemove() addonHandler.installAddonBundle(bundle) core.restart() except BaseException as e: log.error(e) os.startfile(fp) except BaseException as e: log.error(e) ui.message( _("Unable to save or download update file. Opening your browser" )) os.startfile(url) return
def install(): # To remove the old version ourAddon.requestRemove() # to install the new version addonHandler.installAddonBundle(bundle) # to delete the downloads folder shutil.rmtree(directory, ignore_errors=True) # to restart NVDA core.restart()
def processUpdate(expectedSHA256Sum): url = addonInfos["url"] if url.endswith('/'): url = url[0:-1] url = "%s.nvda-addon?%s" % (url, urlencode(paramsDL())) fp = os.path.join(globalVars.appArgs.configPath, "%s.nvda-addon" % sectionName) try: with urllib.request.urlopen(url) as res: with open(fp, "wb") as out: out.write(res.read()) actualSHA256Sum = SHA256Sum(fp) if expectedSHA256Sum != actualSHA256Sum: log.info("Invalid hash for %s. Actual: %s, expected: %s" % (fp, actualSHA256Sum, expectedSHA256Sum)) msg = _( "Hashes do not match! Actual value is '{actualHash}'. Expected is '{expectedHash}'." ).format(actualHash=actualSHA256Sum, expectedHash=expectedSHA256Sum) wx.CallAfter(errorUpdateDialog, msg) return curAddons = [] for addon in addonHandler.getAvailableAddons(): curAddons.append(addon) bundle = addonHandler.AddonBundle(fp) prevAddon = None bundleName = bundle.manifest['name'] for addon in curAddons: if not addon.isPendingRemove and bundleName == addon.manifest[ "name"]: prevAddon = addon break if prevAddon: prevAddon.requestRemove() addonHandler.installAddonBundle(bundle) core.restart() except BaseException as e: log.error(e) return wx.CallAfter(errorUpdateDialog, e)
def onTimer(self): if self.inTimer is True or self.hasBeenUpdated is True: return self.inTimer = True try: evt = self.updater.queue.get_nowait() except queue.Empty: evt = None if evt is not None: filepath = evt.get("download", None) if filepath is not None: import addonHandler for prev in addonHandler.getAvailableAddons(): if prev.name == updater.ADDON_NAME: prev.requestRemove() bundle = addonHandler.AddonBundle(filepath) addonHandler.installAddonBundle(bundle) logHandler.log.info( "Installed version %s, restart NVDA to make the changes permanent" % (evt["version"])) self.hasBeenUpdated = True self.inTimer = False wx.CallLater(1000, self.onTimer)
def installAddon(storeClient, addon, closeAfter=False, silent=False): if silent == False: ui.message(_("Downloading %s") % (addon.name)) data = storeClient.getAddonFile(addon.id, addon.versionId) if data is None: if silent == False: ui.message(_("Unable to download the add-on.")) return False tmp = os.path.join(config.getUserDefaultConfigPath(), "storeDownloadedAddon.nvda-addon") logHandler.log.info(u"Saving to %s" % (tmp)) f = file(tmp, "wb") f.write(data) f.close() path = tmp if path is None: if silent == False: ui.message(_("Unable to download %s") % (addon.name)) return False if silent == False: ui.message(_("Installing")) try: bundle = addonHandler.AddonBundle(path) except: logHandler.log.error("Error opening addon bundle from %s" % path, exc_info=True) # Translators: The message displayed when an error occurs when opening an add-on package for adding. if silent == False: gui.messageBox( _("Failed to open add-on package file at %s - missing file or invalid file format" ) % path, # Translators: The title of a dialog presented when an error occurs. _("Error"), wx.OK | wx.ICON_ERROR) return False bundleName = bundle.manifest['name'] prevAddon = None for addon in addonHandler.getAvailableAddons(): if not addon.isPendingRemove and bundleName == addon.manifest['name']: prevAddon = addon break if prevAddon: prevAddon.requestRemove() if silent is False: progressDialog = gui.IndeterminateProgressDialog( gui.mainFrame, # Translators: The title of the dialog presented while an Addon is being installed. _("Installing Add-on"), # Translators: The message displayed while an addon is being installed. _("Please wait while the add-on is being installed.")) try: gui.ExecAndPump(addonHandler.installAddonBundle, bundle) except: logHandler.log.error("Error installing addon bundle from %s" % addonPath, exc_info=True) progressDialog.done() del progressDialog # Translators: The message displayed when an error occurs when installing an add-on package. gui.messageBox( _("Failed to install add-on from %s") % (addon.name), # Translators: The title of a dialog presented when an error occurs. _("Error"), wx.OK | wx.ICON_ERROR) return False progressDialog.done() del progressDialog else: try: addonHandler.installAddonBundle(bundle) except: return False if closeAfter: wx.CallLater(1, core.restart) return True