Rework the signalreceiver a bit to help address errors on exit.

A few UI tweaks.
This commit is contained in:
Andrew Resch 2008-06-15 11:02:09 +00:00
parent efd1f18082
commit 89cad666d5
5 changed files with 38 additions and 45 deletions

View File

@ -430,6 +430,8 @@ class ConnectionManager(component.Component):
uri = "http://" + uri
if status == HOSTLIST_STATUS.index("Connected"):
# Stop all the components first.
component.stop()
# If we are connected to this host, then we will disconnect.
client.set_core_uri(None)
self._update()

View File

@ -79,10 +79,10 @@ class RemoveTorrentDialog:
self.dialog.show()
def on_button_ok_clicked(self, widget):
#data = self.glade.get_widget("chk_data").get_active()
#torrent = self.glade.get_widget("chk_torrents").get_active()
client.remove_torrent(
self.torrent_ids, self.remove_torrentfile, self.remove_data)
# Unselect all to avoid issues with the selection changed event
component.get("TorrentView").treeview.get_selection().unselect_all()
self.dialog.destroy()
def on_button_cancel_clicked(self, widget):

View File

@ -87,24 +87,27 @@ class Signals(component.Component):
log.debug("torrent id: %s", torrent_id)
# Remove the torrent from the treeview
component.get("TorrentView").remove_row(torrent_id)
component.get("TorrentDetails").clear()
def torrent_paused(self, torrent_id):
log.debug("torrent_paused signal received..")
component.get("TorrentView").update()
component.get("ToolBar").update_buttons()
def torrent_resumed(self, torrent_id):
log.debug("torrent_resumed signal received..")
component.get("TorrentView").update()
component.get("ToolBar").update_buttons()
def torrent_all_paused(self):
log.debug("torrent_all_paused signal received..")
component.get("TorrentView").update()
component.get("ToolBar").update_buttons()
def torrent_all_resumed(self):
log.debug("torrent_all_resumed signal received..")
component.get("TorrentView").update()
component.get("ToolBar").update_buttons()
def config_value_changed(self, key, value):
log.debug("config_value_changed signal received..")
component.get("StatusBar").config_value_changed(key, value)

View File

@ -38,9 +38,6 @@ pygtk.require('2.0')
import gtk, gtk.glade
import gettext
import gobject
import cPickle as pickle
import time
import traceback
import deluge.common
import deluge.component as component
@ -357,14 +354,13 @@ class TorrentView(listview.ListView, component.Component):
def remove_row(self, torrent_id):
"""Removes a row with torrent_id"""
for row in self.liststore:
# Check if this row is the row we want to remove
if row[0] == torrent_id:
self.liststore.remove(row.iter)
# Force an update of the torrentview
self.update()
self.update_filter()
break
def get_selected_torrent(self):
"""Returns a torrent_id or None. If multiple torrents are selected,
it will return the torrent_id of the first one."""
@ -433,4 +429,3 @@ class TorrentView(listview.ListView, component.Component):
component.get("TorrentDetails").update()
component.get("ToolBar").update_buttons()

View File

@ -42,22 +42,22 @@ import deluge.SimpleXMLRPCServer as SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
import deluge.xmlrpclib as xmlrpclib
import threading
import socket
from deluge.log import LOG as log
class SignalReceiver(
ThreadingMixIn,
SimpleXMLRPCServer.SimpleXMLRPCServer):
class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
def __init__(self):
log.debug("SignalReceiver init..")
gobject.threads_init()
# gobject.threads_init()
# Set to true so that the receiver thread will exit
self._shutdown = False
self.signals = {}
self.emitted_signals = []
self.remote = False
@ -68,19 +68,13 @@ class SignalReceiver(
try:
client.deregister_client()
client.force_call()
except:
pass
except Exception, e:
log.debug("Unable to deregister client from server: %s", e)
log.debug("Shutting down signalreceiver")
# Hacky.. sends a request to our local receiver to ensure that it
# shutdowns.. This is because handle_request() is a blocking call.
receiver = xmlrpclib.ServerProxy("http://localhost:" + str(self.port),
allow_none=True)
try:
receiver.emit_signal("shutdown", None)
except:
# We don't care about errors at this point
pass
self.socket.shutdown(socket.SHUT_RDWR)
return
def set_remote(self, remote):
self.remote = remote
@ -114,6 +108,9 @@ class SignalReceiver(
client.register_client(str(self.port))
t = threading.Thread(target=self.handle_thread)
gobject.timeout_add(50, self.handle_signals)
try:
t.start()
except Exception, e:
@ -129,23 +126,20 @@ class SignalReceiver(
def emit_signal(self, signal, *data):
"""Exported method used by the core to emit a signal to the client"""
try:
if data != None:
self.emitted_signals.append((signal, data))
return
def handle_signals(self):
for signal, data in self.emitted_signals:
try:
for callback in self.signals[signal]:
try:
gobject.idle_add(callback, *data)
except:
log.warning("Unable to call callback for signal %s",
signal)
else:
for callback in self.signals[signal]:
try:
gobject.idle_add(callback)
except:
log.warning("Unable to call callback for signal %s",
signal)
except KeyError:
log.debug("There are no callbacks registered for signal '%s'", signal)
gobject.idle_add(callback, *data)
except Exception, e:
log.warning("Unable to call callback for signal %s: %s", signal, e)
self.emitted_signals = []
return True
def connect_to_signal(self, signal, callback):
"""Connect to a signal"""
@ -154,5 +148,4 @@ class SignalReceiver(
self.signals[signal].append(callback)
except KeyError:
self.signals[signal] = [callback]