Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--shell/ConsoleWindow.py10
-rw-r--r--sugar/logger.py96
2 files changed, 66 insertions, 40 deletions
diff --git a/shell/ConsoleWindow.py b/shell/ConsoleWindow.py
index 1986696..5efd880 100644
--- a/shell/ConsoleWindow.py
+++ b/shell/ConsoleWindow.py
@@ -44,9 +44,13 @@ class ConsoleDbusService(dbus.service.Object):
dbus.service.Object.__init__(self, bus_name, '/org/laptop/Sugar/Console')
self._console = console
- @dbus.service.method('org.laptop.Sugar.Console')
- def log(self, level, module_id, message):
- self._console.log(level, module_id, message)
+ @dbus.service.method('org.laptop.Sugar.Console',
+ in_signature="saias", out_signature="")
+ def log(self, module_id, levels, messages):
+ i = 0
+ while i < len(levels):
+ self._console.log(levels[i], module_id, messages[i])
+ i += 1
class ConsoleWindow(gtk.Window):
def __init__(self):
diff --git a/sugar/logger.py b/sugar/logger.py
index 3ce4b09..d47f8a5 100644
--- a/sugar/logger.py
+++ b/sugar/logger.py
@@ -7,67 +7,89 @@ import dbus
import dbus.dbus_bindings
import gobject
-__console = None
-__console_id = None
+__queue = None
-class Handler(logging.Handler):
- def __init__(self, console, console_id):
- logging.Handler.__init__(self)
+CONSOLE_BUS_NAME = 'org.laptop.Sugar.Console'
+CONSOLE_OBJECT_PATH = '/org/laptop/Sugar/Console'
+CONSOLE_IFACE = 'org.laptop.Sugar.Console'
- self._console_id = console_id
- self._console = console
- self._records = []
+class MessageQueue:
+ def __init__(self, console, console_id):
self._idle_id = 0
+ self._console = console
+ self._console_id = console_id
+ self._levels = []
+ self._messages = []
+
+ if self._console == None:
+ bus = dbus.SessionBus()
+ con = bus._connection
+ if dbus.dbus_bindings.bus_name_has_owner(con, CONSOLE_BUS_NAME):
+ self.setup_console()
+ bus.add_signal_receiver(self.__name_owner_changed,
+ dbus_interface = "org.freedesktop.DBus",
+ signal_name = "NameOwnerChanged")
+ def setup_console(self):
bus = dbus.SessionBus()
- self._console_started = dbus.dbus_bindings.bus_name_has_owner(
- bus._connection, 'org.laptop.Sugar.Console')
- bus.add_signal_receiver(self.__name_owner_changed,
- dbus_interface = "org.freedesktop.DBus",
- signal_name = "NameOwnerChanged")
+ proxy_obj = bus.get_object(CONSOLE_BUS_NAME, CONSOLE_OBJECT_PATH)
+ self._console = dbus.Interface(proxy_obj, CONSOLE_IFACE)
+ self._queue_log()
def __name_owner_changed(self, service_name, old_name, new_name):
- if service_name == 'org.laptop.Sugar.Console':
+ if service_name == CONSOLE_BUS_NAME:
if new_name != None:
- self._console_started = True
- self._idle_id = gobject.idle_add(self._log)
+ self.setup_console()
else:
- self._console_started = False
+ self._console = None
+
+ def _queue_log(self):
+ if self._idle_id == 0:
+ self._idle_id = gobject.idle_add(self._log)
def _log(self):
- for record in self._records:
- self._console.log(record.levelno, self._console_id, record.msg)
- self._records = []
+ if self._console == None or len(self._messages) == 0:
+ return False
+
+ self._console.log(self._console_id, self._levels,
+ self._messages, timeout = 1000)
+
+ self._levels = []
+ self._messages = []
self._idle_id = 0
return False
+ def append_record(self, record):
+ self.append(record.levelno, record.msg)
+
+ def append(self, level, message):
+ self._levels.append(level)
+ self._messages.append(message)
+ self._queue_log()
+
+class Handler(logging.Handler):
+ def __init__(self, queue):
+ logging.Handler.__init__(self)
+
+ self._queue = queue
+
def emit(self, record):
- self._records.append(record)
- if self._console_started and self._idle_id == 0:
- self._idle_id = gobject.idle_add(self._log)
+ self._queue.append_record(record)
def __exception_handler(typ, exc, tb):
trace = StringIO()
traceback.print_exception(typ, exc, tb, None, trace)
- __console.log(logging.ERROR, __console_id, trace.getvalue())
+ __queue.append(logging.ERROR, trace.getvalue())
def start(console_id, console = None):
+ queue = MessageQueue(console, console_id)
+
root_logger = logging.getLogger('')
root_logger.setLevel(logging.DEBUG)
-
- if console == None:
- bus = dbus.SessionBus()
- proxy_obj = bus.get_object('org.laptop.Sugar.Console',
- '/org/laptop/Sugar/Console')
- console = dbus.Interface(proxy_obj, 'org.laptop.Sugar.Console')
-
- root_logger.addHandler(Handler(console, console_id))
-
- global __console
- global __console_id
+ root_logger.addHandler(Handler(queue))
- __console = console
- __console_id = console_id
+ global __queue
+ __queue = queue
sys.excepthook = __exception_handler