block_number should return -1 if we know the DB is not up to date
[electrum-server.git] / server.py
index 5d48ee3..973f932 100755 (executable)
--- a/server.py
+++ b/server.py
@@ -36,6 +36,12 @@ import ConfigParser
 from json import dumps, loads
 import urllib
 
+# we need to import electrum
+sys.path.append('../client/')
+from wallet import Wallet
+from interface import Interface
+
+
 config = ConfigParser.ConfigParser()
 # set some defaults, which will be overwritten by the config file
 config.add_section('server')
@@ -319,6 +325,21 @@ class MyStore(Datastore_class):
 
 
 
+class Direct_Interface(Interface):
+    def __init__(self):
+        pass
+
+    def handler(self, method, params = ''):
+        cmds = {'session.new':new_session,
+                'session.poll':poll_session,
+                'session.update':update_session,
+                'blockchain.transaction.broadcast':send_tx,
+                'blockchain.address.get_history':store.get_history
+                }
+        func = cmds[method]
+        return func( params )
+
+
 
 def send_tx(tx):
     postdata = dumps({"method": 'importtransaction', 'params': [tx], 'id':'jsonrpc'})
@@ -467,6 +488,8 @@ def client_thread(ipaddr,conn):
 
 def do_command(cmd, data, ipaddr):
 
+    timestr = time.strftime("[%d/%m/%Y-%H:%M:%S]")
+
     if cmd=='b':
         out = "%d"%block_number
 
@@ -481,7 +504,7 @@ def do_command(cmd, data, ipaddr):
         except:
             print "error", data
             return None
-        print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version
+        print timestr, "new session", ipaddr, addresses[0] if addresses else addresses, len(addresses), version
         out = new_session(version, addresses)
 
     elif cmd=='update_session':
@@ -490,7 +513,7 @@ def do_command(cmd, data, ipaddr):
         except:
             print "error"
             return None
-        print time.strftime("[%d/%m/%Y-%H:%M:%S]"), "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
+        print timestr, "update session", ipaddr, addresses[0] if addresses else addresses, len(addresses)
         out = update_session(session_id,addresses)
 
     elif cmd == 'bccapi_login':
@@ -500,7 +523,7 @@ def do_command(cmd, data, ipaddr):
         master_public_key = k.decode('hex') # todo: sanitize. no need to decode twice...
         print master_public_key
         wallet_id = random_string(10)
-        w = electrum.Wallet()
+        w = Wallet( Direct_Interface() )
         w.master_public_key = master_public_key.decode('hex')
         w.synchronize()
         wallets[wallet_id] = w
@@ -508,7 +531,7 @@ def do_command(cmd, data, ipaddr):
         print "wallets", wallets
 
     elif cmd == 'bccapi_getAccountInfo':
-        from electrum import int_to_hex
+        from wallet import int_to_hex
         v, wallet_id = ast.literal_eval(data)
         w = wallets.get(wallet_id)
         if w is not None:
@@ -521,7 +544,7 @@ def do_command(cmd, data, ipaddr):
             out = "error"
 
     elif cmd == 'bccapi_getAccountStatement':
-        from electrum import int_to_hex
+        from wallet import int_to_hex
         v, wallet_id = ast.literal_eval(data)
         w = wallets.get(wallet_id)
         if w is not None:
@@ -552,8 +575,8 @@ def do_command(cmd, data, ipaddr):
         out = cmd_load(data)
 
     elif cmd =='tx':
-        r = send_tx(data)
-        print "sent tx:", out
+        out = send_tx(data)
+        print timestr, "sent tx:", ipaddr, out
 
     elif cmd == 'stop':
         out = cmd_stop(data)
@@ -726,9 +749,14 @@ if __name__ == '__main__':
             store.catch_up()
             memorypool_update(store)
             block_number = store.get_block_number(1)
-            dblock.release()
+        except IOError:
+            print "IOError: cannot reach bitcoind"
+            block_number = -1 
         except:
             traceback.print_exc(file=sys.stdout)
+            block_number = -1
+        finally:
+            dblock.release()
         time.sleep(10)
 
     print "server stopped"