def Dialog_Select_Large(self, title, subject, items): title_encoded = "%s %s" % (getLocalizedLabel(title), toUtf8(subject)) # For Kodi <= 16 if PLATFORM['kodi'] <= 16: window = DialogSelect("DialogSelectLargeLegacy.xml", ADDON_PATH, "Default", title=title_encoded, items=items) # For Kodi >= 17 else: window = DialogSelect("DialogSelectLarge.xml", ADDON_PATH, "Default", title=title_encoded, items=items) window.doModal() retval = window.retval del window return retval
def elementumd_thread(monitor): restart_count = 0 max_restart = 3 last_code = 0 try: monitor_abort = xbmc.Monitor() # For Kodi >= 14 while not monitor_abort.abortRequested(): # If we ran out of attempts of last exit code was '-9': we do not try to start it again. # So if you kill the binary with '-9': it will not be restarted by this monitor. if restart_count > max_restart or last_code == -9: if monitor.reboot(): log.debug("elementumd: resetting attempts") restart_count = 0 last_code = 0 monitor.reboot(False) else: time.sleep(5) continue log.info("elementumd: starting elementumd") proc = None if hasSubprocess: proc = start_elementumd(stdout=subprocess.PIPE, stderr=subprocess.STDOUT) if not proc: break else: log.info( "elementumd: current system is unable to run the binary") break threading.Thread(target=wait_for_abortRequested, args=[proc, monitor]).start() if not hasSubprocess: break if binary_platform["os"] == "windows": while proc.poll() is None: log.info(toUtf8(proc.stdout.readline())) else: # Kodi hangs on some Android (sigh...) systems when doing a blocking # read. We count on the fact that Elementum daemon flushes its log # output on \n, creating a pretty clean output import fcntl import select fd = proc.stdout.fileno() fl = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) while proc.poll() is None: try: to_read, _, _ = select.select([proc.stdout], [], []) for ro in to_read: line = ro.readline() if line == "": # write end is closed break try: log.info(toUtf8(line)) except TypeError: pass except IOError: time.sleep(1) # nothing to read, sleep last_code = proc.returncode if monitor_abort.abortRequested(): break if proc.returncode == 0 or proc.returncode == -9 or proc.returncode == -1: continue if proc.returncode == 5: restart_count = 0 notify(getLocalizedString(30332), time=3000) else: restart_count += 1 notify(getLocalizedString(30100), time=3000) xbmc.executebuiltin("Dialog.Close(all, true)") system_information() time.sleep(5) if restart_count >= max_restart: log.debug("elementumd: no attempts left") notify(getLocalizedString(30110), time=3000) continue except Exception as e: import traceback map(log.error, traceback.format_exc().split("\n")) notify("%s: %s" % (getLocalizedString(30226), repr(e).encode('utf-8'))) raise log.debug("elementumd: closing")