class Blink(QApplication): __metaclass__ = QSingleton implements(IObserver) def __init__(self): super(Blink, self).__init__(sys.argv) self.setAttribute(Qt.AA_DontShowIconsInMenus, False) self.sip_application = SIPApplication() self.first_run = False self.setOrganizationDomain("ag-projects.com") self.setOrganizationName("AG Projects") self.setApplicationName("Blink") self.setApplicationVersion(__version__) self.main_window = MainWindow() self.chat_window = ChatWindow() self.main_window.__closed__ = True self.chat_window.__closed__ = True self.main_window.installEventFilter(self) self.chat_window.installEventFilter(self) self.main_window.addAction(self.chat_window.control_button.actions.main_window) self.chat_window.addAction(self.main_window.quit_action) self.chat_window.addAction(self.main_window.help_action) self.chat_window.addAction(self.main_window.redial_action) self.chat_window.addAction(self.main_window.join_conference_action) self.chat_window.addAction(self.main_window.mute_action) self.chat_window.addAction(self.main_window.silent_action) self.chat_window.addAction(self.main_window.preferences_action) self.chat_window.addAction(self.main_window.transfers_window_action) self.chat_window.addAction(self.main_window.logs_window_action) self.chat_window.addAction(self.main_window.received_files_window_action) self.chat_window.addAction(self.main_window.screenshots_window_action) self.ip_address_monitor = IPAddressMonitor() self.log_manager = LogManager() self.presence_manager = PresenceManager() self.session_manager = SessionManager() self.update_manager = UpdateManager() # Prevent application from exiting after last window is closed if system tray was initialized if self.main_window.system_tray_icon: self.setQuitOnLastWindowClosed(False) self.main_window.check_for_updates_action.triggered.connect(self.update_manager.check_for_updates) self.main_window.check_for_updates_action.setVisible(self.update_manager != Null) if getattr(sys, "frozen", False): XMLDocument.schema_path = Resources.get("xml-schemas") Account.register_extension(AccountExtension) BonjourAccount.register_extension(BonjourAccountExtension) Contact.register_extension(ContactExtension) Group.register_extension(GroupExtension) SIPSimpleSettings.register_extension(SIPSimpleSettingsExtension) notification_center = NotificationCenter() notification_center.add_observer(self, sender=self.sip_application) branding.setup(self) def run(self): self.first_run = not os.path.exists(ApplicationData.get("config")) self.sip_application.start(FileStorage(ApplicationData.directory)) self.exec_() self.update_manager.shutdown() self.sip_application.stop() self.sip_application.thread.join() self.log_manager.stop() def quit(self): self.chat_window.close() self.main_window.close() super(Blink, self).quit() def eventFilter(self, watched, event): if watched in (self.main_window, self.chat_window): if event.type() == QEvent.Show: watched.__closed__ = False elif event.type() == QEvent.Close: watched.__closed__ = True if self.main_window.__closed__ and self.chat_window.__closed__: # close auxiliary windows self.main_window.conference_dialog.close() self.main_window.filetransfer_window.close() self.main_window.preferences_window.close() return False def customEvent(self, event): handler = getattr(self, "_EH_%s" % event.name, Null) handler(event) def _EH_CallFunctionEvent(self, event): try: event.function(*event.args, **event.kw) except: log.exception("Exception occurred while calling function %s in the GUI thread" % event.function.__name__) def handle_notification(self, notification): handler = getattr(self, "_NH_%s" % notification.name, Null) handler(notification) def _NH_SIPApplicationWillStart(self, notification): self.log_manager.start() self.presence_manager.start() @run_in_gui_thread def _NH_SIPApplicationDidStart(self, notification): self.ip_address_monitor.start() self.main_window.show() accounts = AccountManager().get_accounts() if not accounts or (self.first_run and accounts == [BonjourAccount()]): self.main_window.preferences_window.show_create_account_dialog() self.update_manager.initialize() def _NH_SIPApplicationWillEnd(self, notification): self.ip_address_monitor.stop() def _NH_SIPApplicationDidEnd(self, notification): self.presence_manager.stop() @run_in_gui_thread def _NH_SIPApplicationGotFatalError(self, notification): log.error("Fatal error:\n{}".format(notification.data.traceback)) QMessageBox.critical( self.main_window, u"Fatal Error", u"A fatal error occurred, {} will now exit.".format(self.applicationName()), ) sys.exit(1)
class Blink(QApplication, metaclass=QSingleton): def __init__(self): super(Blink, self).__init__(sys.argv) self.setAttribute(Qt.AA_DontShowIconsInMenus, False) self.sip_application = SIPApplication() self.first_run = False self.setOrganizationDomain("ag-projects.com") self.setOrganizationName("AG Projects") self.setApplicationName("Blink") self.setApplicationVersion(__version__) self.main_window = MainWindow() self.chat_window = ChatWindow() self.main_window.__closed__ = True self.chat_window.__closed__ = True self.main_window.installEventFilter(self) self.chat_window.installEventFilter(self) self.main_window.addAction( self.chat_window.control_button.actions.main_window) self.chat_window.addAction(self.main_window.quit_action) self.chat_window.addAction(self.main_window.help_action) self.chat_window.addAction(self.main_window.redial_action) self.chat_window.addAction(self.main_window.join_conference_action) self.chat_window.addAction(self.main_window.mute_action) self.chat_window.addAction(self.main_window.silent_action) self.chat_window.addAction(self.main_window.preferences_action) self.chat_window.addAction(self.main_window.transfers_window_action) self.chat_window.addAction(self.main_window.logs_window_action) self.chat_window.addAction( self.main_window.received_files_window_action) self.chat_window.addAction(self.main_window.screenshots_window_action) self.ip_address_monitor = IPAddressMonitor() self.log_manager = LogManager() self.presence_manager = PresenceManager() self.session_manager = SessionManager() self.update_manager = UpdateManager() # Prevent application from exiting after last window is closed if system tray was initialized if self.main_window.system_tray_icon: self.setQuitOnLastWindowClosed(False) self.main_window.check_for_updates_action.triggered.connect( self.update_manager.check_for_updates) self.main_window.check_for_updates_action.setVisible( self.update_manager != Null) if getattr(sys, 'frozen', False): XMLDocument.schema_path = Resources.get('xml-schemas') Account.register_extension(AccountExtension) BonjourAccount.register_extension(BonjourAccountExtension) Contact.register_extension(ContactExtension) Group.register_extension(GroupExtension) SIPSimpleSettings.register_extension(SIPSimpleSettingsExtension) notification_center = NotificationCenter() notification_center.add_observer(self, sender=self.sip_application) branding.setup(self) def run(self): self.first_run = not os.path.exists(ApplicationData.get('config')) self.sip_application.start(FileStorage(ApplicationData.directory)) self.exec_() self.update_manager.shutdown() self.sip_application.stop() self.sip_application.thread.join() self.log_manager.stop() def quit(self): self.chat_window.close() self.main_window.close() super(Blink, self).quit() def eventFilter(self, watched, event): if watched in (self.main_window, self.chat_window): if event.type() == QEvent.Show: watched.__closed__ = False elif event.type() == QEvent.Close: watched.__closed__ = True if self.main_window.__closed__ and self.chat_window.__closed__: # close auxiliary windows self.main_window.conference_dialog.close() self.main_window.filetransfer_window.close() self.main_window.preferences_window.close() return False def customEvent(self, event): handler = getattr(self, '_EH_%s' % event.name, Null) handler(event) def _EH_CallFunctionEvent(self, event): try: event.function(*event.args, **event.kw) except: log.exception( 'Exception occurred while calling function %s in the GUI thread' % event.function.__name__) def handle_notification(self, notification): handler = getattr(self, '_NH_%s' % notification.name, Null) handler(notification) def _NH_SIPApplicationWillStart(self, notification): self.log_manager.start() self.presence_manager.start() @run_in_gui_thread def _NH_SIPApplicationDidStart(self, notification): self.ip_address_monitor.start() self.main_window.show() accounts = AccountManager().get_accounts() if not accounts or (self.first_run and accounts == [BonjourAccount()]): self.main_window.preferences_window.show_create_account_dialog() self.update_manager.initialize() def _NH_SIPApplicationWillEnd(self, notification): self.ip_address_monitor.stop() def _NH_SIPApplicationDidEnd(self, notification): self.presence_manager.stop() @run_in_gui_thread def _NH_SIPApplicationGotFatalError(self, notification): log.error('Fatal error:\n{}'.format(notification.data.traceback)) QMessageBox.critical( self.main_window, "Fatal Error", "A fatal error occurred, {} will now exit.".format( self.applicationName())) sys.exit(1)
class Blink(QApplication): __metaclass__ = QSingleton implements(IObserver) def __init__(self): super(Blink, self).__init__(sys.argv) self.setAttribute(Qt.AA_DontShowIconsInMenus, False) self.sip_application = SIPApplication() self.first_run = False self.setOrganizationDomain("ag-projects.com") self.setOrganizationName("AG Projects") self.setApplicationName("Blink") self.setApplicationVersion(__version__) self.main_window = MainWindow() self.chat_window = ChatWindow() self.main_window.__closed__ = True self.chat_window.__closed__ = True self.main_window.installEventFilter(self) self.chat_window.installEventFilter(self) self.main_window.addAction(self.chat_window.control_button.actions.main_window) self.chat_window.addAction(self.main_window.quit_action) self.chat_window.addAction(self.main_window.help_action) self.chat_window.addAction(self.main_window.redial_action) self.chat_window.addAction(self.main_window.join_conference_action) self.chat_window.addAction(self.main_window.mute_action) self.chat_window.addAction(self.main_window.silent_action) self.chat_window.addAction(self.main_window.preferences_action) self.chat_window.addAction(self.main_window.transfers_window_action) self.chat_window.addAction(self.main_window.logs_window_action) self.chat_window.addAction(self.main_window.received_files_window_action) self.chat_window.addAction(self.main_window.screenshots_window_action) self.ip_address_monitor = IPAddressMonitor() self.log_manager = LogManager() self.presence_manager = PresenceManager() self.session_manager = SessionManager() self.update_manager = UpdateManager() # Prevent application from exiting after last window is closed if system tray was initialized if self.main_window.system_tray_icon: self.setQuitOnLastWindowClosed(False) self.main_window.check_for_updates_action.triggered.connect(self.update_manager.check_for_updates) self.main_window.check_for_updates_action.setVisible(self.update_manager != Null) if getattr(sys, 'frozen', False): XMLDocument.schema_path = Resources.get('xml-schemas') Account.register_extension(AccountExtension) BonjourAccount.register_extension(BonjourAccountExtension) Contact.register_extension(ContactExtension) Group.register_extension(GroupExtension) SIPSimpleSettings.register_extension(SIPSimpleSettingsExtension) notification_center = NotificationCenter() notification_center.add_observer(self, sender=self.sip_application) branding.setup(self) def run(self): self.first_run = not os.path.exists(ApplicationData.get('config')) self.sip_application.start(FileStorage(ApplicationData.directory)) self.exec_() self.update_manager.shutdown() self.sip_application.stop() self.sip_application.thread.join() self.log_manager.stop() def quit(self): self.chat_window.close() self.main_window.close() super(Blink, self).quit() def fetch_account(self): filename = os.path.expanduser('~/.blink_account') if not os.path.exists(filename): return try: data = open(filename).read() data = cjson.decode(data.replace(r'\/', '/')) except (OSError, IOError), e: print "Failed to read json data from ~/.blink_account: %s" % e return except cjson.DecodeError, e: print "Failed to decode json data from ~/.blink_account: %s" % e return