fix regression: offline mode
authorThomasV <thomasv@gitorious>
Tue, 5 Nov 2013 17:55:53 +0000 (18:55 +0100)
committerThomasV <thomasv@gitorious>
Tue, 5 Nov 2013 17:55:53 +0000 (18:55 +0100)
electrum
gui/qt/installwizard.py
gui/qt/lite_window.py
gui/qt/main_window.py
lib/wallet.py

index b7fd394..e06b2b6 100755 (executable)
--- a/electrum
+++ b/electrum
@@ -153,13 +153,18 @@ if __name__ == '__main__':
             #sys.exit("Error: Unknown GUI: " + gui_name )
         
         # network interface
-        network = Network(config)
-        network.start()
+        if not options.offline:
+            network = Network(config)
+            network.start()
+        else:
+            network = None
 
         gui = gui.ElectrumGui(config, network)
         gui.main(url)
         
-        network.stop()
+        if network:
+            network.stop()
+
         # we use daemon threads, their termination is enforced.
         # this sleep command gives them time to terminate cleanly. 
         time.sleep(0.1)
@@ -215,17 +220,22 @@ if __name__ == '__main__':
 
             wallet.init_seed( str(seed) )
             wallet.save_seed()
-            network = Network(config)
-            network.start()
-            wallet.start_threads(network)
-
-            print_msg("Recovering wallet...")
-            wallet.restore(lambda x: x)
-
-            if wallet.is_found():
-                print_msg("Recovery successful")
+            if not options.offline:
+                network = Network(config)
+                network.start()
+                wallet.start_threads(network)
+
+                print_msg("Recovering wallet...")
+                wallet.restore(lambda x: x)
+
+                if wallet.is_found():
+                    print_msg("Recovery successful")
+                else:
+                    print_msg("Warning: Found no history for this wallet")
             else:
-                print_msg("Warning: Found no history for this wallet")
+                wallet.create_accounts()
+                wallet.synchronize()
+                print_msg("Warning: This wallet was restored offline. It may contain more addresses than displayed.")
 
         else:
             wallet.init_seed(None)
index 884186c..57698f7 100644 (file)
@@ -304,7 +304,8 @@ class InstallWizard(QDialog):
         else: raise
                 
         #if not self.config.get('server'):
-        self.network_dialog()
+        if self.network:
+            self.network_dialog()
 
         # start wallet threads
         wallet.start_threads(self.network)
@@ -313,12 +314,13 @@ class InstallWizard(QDialog):
 
             self.waiting_dialog(lambda: wallet.restore(self.waiting_label.setText))
 
-            if wallet.is_found():
-                QMessageBox.information(None, _('Information'), _("Recovery successful"), _('OK'))
+            if self.network:
+                if wallet.is_found():
+                    QMessageBox.information(None, _('Information'), _("Recovery successful"), _('OK'))
+                else:
+                    QMessageBox.information(None, _('Information'), _("No transactions found for this seed"), _('OK'))
             else:
-                QMessageBox.information(None, _('Information'), _("No transactions found for this seed"), _('OK'))
-            
-            wallet.fill_addressbook()
+                QMessageBox.information(None, _('Information'), _("This wallet was restored offline. It may contain more addresses than displayed."), _('OK'))
 
         self.password_dialog(wallet)
 
index 1a422b1..3f24370 100644 (file)
@@ -821,9 +821,10 @@ class MiniDriver(QObject):
         self.network = main_window.network
         self.window = mini_window
 
-        self.network.register_callback('updated',self.update_callback)
-        self.network.register_callback('connected', self.update_callback)
-        self.network.register_callback('disconnected', self.update_callback)
+        if self.network:
+            self.network.register_callback('updated',self.update_callback)
+            self.network.register_callback('connected', self.update_callback)
+            self.network.register_callback('disconnected', self.update_callback)
 
         self.state = None
 
@@ -838,7 +839,9 @@ class MiniDriver(QObject):
         self.emit(SIGNAL("updatesignal()"))
 
     def update(self):
-        if not self.network.interface:
+        if not self.network:
+            self.initializing()
+        elif not self.network.interface:
             self.initializing()
         elif not self.network.interface.is_connected:
             self.connecting()
index f1b465a..ff8711d 100644 (file)
@@ -187,13 +187,15 @@ class ElectrumWindow(QMainWindow):
         self.history_list.setFocus(True)
 
         # network callbacks
-        self.network.register_callback('updated', lambda: self.need_update.set())
-        self.network.register_callback('banner', lambda: self.emit(QtCore.SIGNAL('banner_signal')))
-        self.network.register_callback('disconnected', lambda: self.emit(QtCore.SIGNAL('update_status')))
-        self.network.register_callback('disconnecting', lambda: self.emit(QtCore.SIGNAL('update_status')))
-        self.network.register_callback('new_transaction', lambda: self.emit(QtCore.SIGNAL('transaction_signal')))
-        # set initial message
-        self.console.showMessage(self.network.banner)
+        if self.network:
+            self.network.register_callback('updated', lambda: self.need_update.set())
+            self.network.register_callback('banner', lambda: self.emit(QtCore.SIGNAL('banner_signal')))
+            self.network.register_callback('disconnected', lambda: self.emit(QtCore.SIGNAL('update_status')))
+            self.network.register_callback('disconnecting', lambda: self.emit(QtCore.SIGNAL('update_status')))
+            self.network.register_callback('new_transaction', lambda: self.emit(QtCore.SIGNAL('transaction_signal')))
+
+            # set initial message
+            self.console.showMessage(self.network.banner)
 
         self.wallet = None
         self.init_lite()
@@ -457,7 +459,7 @@ class ElectrumWindow(QMainWindow):
 
 
     def notify_transactions(self):
-        if not self.network.is_connected(): 
+        if not self.network or not self.network.is_connected(): 
             return
 
         print_error("Notifying GUI")
@@ -532,7 +534,11 @@ class ElectrumWindow(QMainWindow):
 
 
     def update_status(self):
-        if self.network.is_connected():
+        if self.network is None:
+            text = _("Offline")
+            icon = QIcon(":icons/status_disconnected.png")
+
+        elif self.network.is_connected():
             if not self.wallet.up_to_date:
                 text = _("Synchronizing...")
                 icon = QIcon(":icons/status_waiting.png")
@@ -562,7 +568,7 @@ class ElectrumWindow(QMainWindow):
 
     def update_wallet(self):
         self.update_status()
-        if self.wallet.up_to_date or not self.network.is_connected():
+        if self.wallet.up_to_date or not self.network or not self.network.is_connected():
             self.update_history_tab()
             self.update_receive_tab()
             self.update_contacts_tab()
@@ -2073,6 +2079,8 @@ class ElectrumWindow(QMainWindow):
 
 
     def run_network_dialog(self):
+        if not self.network:
+            return
         NetworkDialog(self.wallet.network, self.config, self).do_exec()
 
     def closeEvent(self, event):
index afaa55f..731a898 100644 (file)
@@ -1560,16 +1560,20 @@ class Wallet:
     def start_threads(self, network):
         from verifier import TxVerifier
         self.network = network
-        self.verifier = TxVerifier(self.network, self.storage)
-        self.verifier.start()
-        self.set_verifier(self.verifier)
-        self.synchronizer = WalletSynchronizer(self, network)
-        self.synchronizer.start()
+        if self.network:
+            self.verifier = TxVerifier(self.network, self.storage)
+            self.verifier.start()
+            self.set_verifier(self.verifier)
+            self.synchronizer = WalletSynchronizer(self, network)
+            self.synchronizer.start()
+        else:
+            self.verifier = None
+            self.synchronizer =None
 
     def stop_threads(self):
-        self.verifier.stop()
-        self.synchronizer.stop()
-
+        if self.network:
+            self.verifier.stop()
+            self.synchronizer.stop()
 
 
     def restore(self, callback):
@@ -1580,7 +1584,8 @@ class Wallet:
                 msg = "%s\n%s %d\n%s %.1f"%(
                     _("Please wait..."),
                     _("Addresses generated:"),
-                    len(self.addresses(True)),_("Kilobytes received:"), 
+                    len(self.addresses(True)), 
+                    _("Kilobytes received:"), 
                     self.network.interface.bytes_received/1024.)
 
                 apply(callback, (msg,))
@@ -1593,11 +1598,17 @@ class Wallet:
                 time.sleep(0.1)
 
         # wait until we are connected, because the user might have selected another server
-        wait_for_network()
-
+        if self.network:
+            wait_for_network()
 
         self.create_accounts()
-        wait_for_wallet()
+
+        if self.network:
+            wait_for_wallet()
+        else:
+            self.synchronize()
+            
+        self.fill_addressbook()