src/modules/gui/globalexceptionhandler.py
changeset 2991 75e616731cc3
parent 2990 2cc6693a7d83
child 2992 e48a94cff862
--- a/src/modules/gui/globalexceptionhandler.py	Fri Sep 27 11:21:00 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-#!/usr/bin/python
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-# Copyright (c) 2010, 2011, Oracle and/or its affiliates.  All rights reserved.
-#
-
-import sys
-import threading
-import traceback
-from cStringIO import StringIO
-
-try:
-        import gobject
-        import gtk
-        import pango
-except ImportError:
-        sys.exit(1)
-import pkg.misc as misc
-import pkg.gui.misc as gui_misc
-
-class GlobalExceptionHandler:
-        def __init__(self):
-                self.parent = None
-                sys.excepthook = self.global_exception_handler
-                self.installThreadExcepthook()
-
-        def set_parent(self, parent):
-                self.parent = parent
-
-        def global_exception_handler(self, exctyp, value, tb):
-                if self.parent:
-                        if self.parent.child:
-                                self.parent.child.cleanup()
-                trace = StringIO()
-                traceback.print_exception (exctyp, value, tb, None, trace)
-                if exctyp is MemoryError or (isinstance(value, EnvironmentError)
-                    and value.errno == errno.ENOMEM):
-                        gobject.idle_add(self.__display_memory_err)
-                else:
-                        gobject.idle_add(self.__display_unknown_err_ex, trace)
-
-        def installThreadExcepthook(self):
-                """
-                Workaround for sys.excepthook python thread bug from:
-                Bug: sys.excepthook doesn't work in threads
-                http://bugs.python.org/issue1230540#msg91244
-                """
-                init_old = threading.Thread.__init__
-                def init(self, *ite_args, **ite_kwargs):
-                        init_old(self, *ite_args, **ite_kwargs)
-                        run_old = self.run
-                        def run_with_except_hook(*rweh_args, **rweh_kwargs):
-                                try:
-                                        run_old(*rweh_args, **rweh_kwargs)
-                                except (KeyboardInterrupt, SystemExit):
-                                        raise
-                                except:
-                                        if not sys:
-                                                raise
-                                        sys.excepthook(*sys.exc_info())
-                        self.run = run_with_except_hook
-                threading.Thread.__init__ = init
-
-        def __display_memory_err(self):
-                try:
-                        dmsg = misc.out_of_memory()
-                        msg_stripped = dmsg.replace("\n", " ")
-                        gui_misc.error_occurred(None, msg_stripped, _("Package Manager"),
-                            gtk.MESSAGE_ERROR)
-                except (MemoryError, EnvironmentError), e:
-                        if isinstance(e, EnvironmentError) and \
-                            e.errno != errno.ENOMEM:
-                                raise
-                        print dmsg
-                except Exception:
-                        pass
-                if self.parent:
-                        self.parent.unhandled_exception_shutdown()
-                else:
-                        sys.exit()
-
-        def __display_unknown_err_ex(self, trace):
-                try:
-                        self.__display_unknown_err(trace)
-                except MemoryError:
-                        print trace
-                except Exception:
-                        pass
-                if self.parent:
-                        self.parent.unhandled_exception_shutdown()
-                else:
-                        sys.exit()
-
-        def __display_unknown_err(self, trace):
-                dmsg = _("An unknown error occurred")
-                md = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, message_format=dmsg)
-                close_btn = md.add_button(gtk.STOCK_CLOSE, 100)
-                md.set_default_response(100)
-
-                dmsg = misc.get_traceback_message()
-                # We remove all \n except the initial one.
-                dmsg = "\n" + dmsg.replace("\n", " ").lstrip()
-                md.format_secondary_text(dmsg)
-                md.set_title(_('Unexpected Error'))
-
-                textview = gtk.TextView()
-                textview.show()
-                textview.set_editable(False)
-                textview.set_wrap_mode(gtk.WRAP_WORD)
-
-                sw = gtk.ScrolledWindow()
-                sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-                sw.add(textview)
-                fr = gtk.Frame()
-                fr.set_shadow_type(gtk.SHADOW_IN)
-                fr.add(sw)
-                ca = md.get_content_area()
-                ca.pack_start(fr)
-
-                textbuffer = textview.get_buffer()
-                textbuffer.create_tag("bold", weight=pango.WEIGHT_BOLD)
-                textbuffer.create_tag("level1", left_margin=30, right_margin=10)
-                textiter = textbuffer.get_end_iter()
-                textbuffer.insert_with_tags_by_name(textiter,
-                     _("Error details:\n"), "bold")
-                textbuffer.insert_with_tags_by_name(textiter, trace.getvalue(), "level1")
-                publisher_str = ""
-                if self.parent:
-                        publisher_str = \
-                                gui_misc.get_publishers_for_output(
-                                    self.parent.get_api_object())
-                        if publisher_str != "":
-                                textbuffer.insert_with_tags_by_name(textiter,
-                                    _("\nList of configured publishers:"), "bold")
-                                textbuffer.insert_with_tags_by_name(
-                                    textiter, publisher_str + "\n", "level1")
-
-                if publisher_str == "":
-                        textbuffer.insert_with_tags_by_name(textiter,
-                            _("\nPlease include output from:\n"), "bold")
-                        textbuffer.insert(textiter, "$ pkg publisher\n")
-
-                md.set_size_request(550, 400)
-                md.set_resizable(True)
-                close_btn.grab_focus()
-                md.show_all()
-                md.run()
-                md.destroy()