From e85d5dd428c71dd45060082a9af28a40a68a25e4 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Wed, 30 Apr 2014 01:44:12 +0200
Subject: API changes

---
 ethereal/assets/ethereum.js     |  70 +++++++---
 ethereal/assets/qml/webapp.qml  | 286 ++++++++++++++++++++++------------------
 ethereal/assets/samplecoin.html |   4 +-
 3 files changed, 208 insertions(+), 152 deletions(-)

(limited to 'ethereal')

diff --git a/ethereal/assets/ethereum.js b/ethereal/assets/ethereum.js
index 0f9f68c43..bb6346cab 100644
--- a/ethereal/assets/ethereum.js
+++ b/ethereal/assets/ethereum.js
@@ -1,17 +1,3 @@
-// Helper function for generating pseudo callbacks and sending data to the QML part of the application
-function postData(data, cb) {
-	data._seed = Math.floor(Math.random() * 1000000)
-	if(cb) {
-		eth._callbacks[data._seed] = cb;
-	}
-
-	if(data.args === undefined) {
-		data.args = [];
-	}
-
-	navigator.qt.postMessage(JSON.stringify(data));
-}
-
 // Main Ethereum library
 window.eth = {
 	prototype: Object(),
@@ -35,8 +21,12 @@ window.eth = {
 	//
 	// Creates a transaction with the current account
 	// If no recipient is set, the Ethereum API will see it as a contract creation
-	createTx: function(recipient, value, gas, gasPrice, data, cb) {
-		postData({call: "createTx", args: [recipient, value, gas, gasPrice, data]}, cb);
+	transact: function(sec, recipient, value, gas, gasPrice, data, cb) {
+		postData({call: "transact", args: [sec, recipient, value, gas, gasPrice, data]}, cb);
+	},
+
+	create: function(sec, value, gas, gasPrice, init, body, cb) {
+		postData({call: "create", args: [sec, value, gas, gasPrice, init, body]}, cb);
 	},
 
 	getStorage: function(address, storageAddress, cb) {
@@ -47,10 +37,39 @@ window.eth = {
 		postData({call: "getKey"}, cb);
 	},
 
-	watch: function(address) {
-		postData({call: "watch", args: [address]});
+	getBalance: function(address, cb) {
+		postData({call: "getBalance", args: [address]}, cb);
+	},
+
+	watch: function(address, storageAddrOrCb, cb) {
+		var ev = "changed:"+address;
+
+		if(cb === undefined) {
+			cb = storageAddrOrCb;
+			storageAddrOrCb = "";
+		} else {
+			ev += ":"+storageAddrOrCb;
+		}
+
+		eth.on(ev, cb)
+
+		postData({call: "watch", args: [address, storageAddrOrCb]});
 	},
 
+	disconnect: function(address, storageAddrOrCb, cb) {
+		var ev = "changed:"+address;
+
+		if(cb === undefined) {
+			cb = storageAddrOrCb;
+			storageAddrOrCb = null;
+		} else {
+			ev += ":"+storageAddrOrCb;
+		}
+
+		eth.off(ev, cb)
+
+		postData({call: "disconnect", args: [address, storageAddrOrCb]});
+	},
 
 	on: function(event, cb) {
 		if(eth._onCallbacks[event] === undefined) {
@@ -61,6 +80,7 @@ window.eth = {
 
 		return this
 	},
+
 	off: function(event, cb) {
 		if(eth._onCallbacks[event] !== undefined) {
 			var callbacks = eth._onCallbacks[event];
@@ -100,6 +120,20 @@ function debug(/**/) {
 	document.getElementById("debug").innerHTML += "<br>" + msg
 }
 
+// Helper function for generating pseudo callbacks and sending data to the QML part of the application
+function postData(data, cb) {
+	data._seed = Math.floor(Math.random() * 1000000)
+	if(cb) {
+		eth._callbacks[data._seed] = cb;
+	}
+
+	if(data.args === undefined) {
+		data.args = [];
+	}
+
+	navigator.qt.postMessage(JSON.stringify(data));
+}
+
 navigator.qt.onmessage = function(ev) {
 	var data = JSON.parse(ev.data)
 
diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml
index 3afc0def0..eebe8921f 100644
--- a/ethereal/assets/qml/webapp.qml
+++ b/ethereal/assets/qml/webapp.qml
@@ -7,135 +7,159 @@ import QtQuick.Window 2.1;
 import Ethereum 1.0
 
 ApplicationWindow {
-    id: window
-    title: "Ethereum"
-    width: 900
-    height: 600
-    minimumHeight: 300
-
-    property alias url: webview.url
-    property alias webView: webview
-
-    Item {
-        objectName: "root"
-        id: root
-        anchors.fill: parent
-        state: "inspectorShown"
-
-        WebView {
-            objectName: "webView"
-            id: webview
-            anchors.fill: parent
-            /*
-             anchors {
-                 left: parent.left
-                 right: parent.right
-                 bottom: sizeGrip.top
-                 top: parent.top
-             }
-             */
-
-            onTitleChanged: { window.title = title }
-            experimental.preferences.javascriptEnabled: true
-            experimental.preferences.navigatorQtObjectEnabled: true
-            experimental.preferences.developerExtrasEnabled: true
-            experimental.userScripts: [ui.assetPath("ethereum.js")]
-            experimental.onMessageReceived: {
-                //console.log("[onMessageReceived]: ", message.data)
-                var data = JSON.parse(message.data)
-
-                switch(data.call) {
-                    case "getBlockByNumber":
-                        var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06")	
-                        postData(data._seed, block)
-                        break
-                    case "getBlockByHash":
-                        var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06")	
-                        postData(data._seed, block)
-                        break
-                    case "createTx":
-                        if(data.args.length < 5) {
-                            postData(data._seed, null)
-                        } else {
-                            var tx = eth.createTx(data.args[0], data.args[1],data.args[2],data.args[3],data.args[4])
-                            postData(data._seed, tx)
-                        }
-                        break
-                    case "getStorage":
-                        if(data.args.length < 2) {
-                            postData(data._seed, null)
-                        } else {
-                            var stateObject = eth.getStateObject(data.args[0])
-                            var storage = stateObject.getStorage(data.args[1])
-                            postData(data._seed, storage)
-                        }
-                        break
-                    case "getKey":
-                        var keys = eth.getKey()
-                        postData(data._seed, keys)
-                        break
-                    case "watch":
-                        if(data.args.length > 0) {
-                            eth.watch(data.args[0]);
-                        }
-                        break
-                }
-            }
-            function postData(seed, data) {
-                webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed}))
-            }
-            function postEvent(event, data) {
-                webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
-            }
-
-            function onNewBlockCb(block) {
-                postEvent("block:new", block)
-            }
-            function onObjectChangeCb(stateObject) {
-                postEvent("object:change", stateObject)
-            }
-        }
-
-        Rectangle {
-            id: sizeGrip
-            color: "gray"
-            visible: false
-            height: 10
-            anchors {
-                left: root.left
-                right: root.right
-            }
-            y: Math.round(root.height * 2 / 3)
-
-            MouseArea {
-                anchors.fill: parent
-                drag.target: sizeGrip
-                drag.minimumY: 0
-                drag.maximumY: root.height
-                drag.axis: Drag.YAxis
-            }
-        }
-
-        WebView {
-            id: inspector
-            visible: false
-            url: webview.experimental.remoteInspectorUrl
-            anchors {
-                left: root.left
-                right: root.right
-                top: sizeGrip.bottom
-                bottom: root.bottom
-            }
-        }
-
-        states: [
-            State {
-                name: "inspectorShown"
-                PropertyChanges {
-                    target: inspector
-                    url: webview.experimental.remoteInspectorUrl
-                }
-            }
-        ]
-    }
+	id: window
+	title: "Ethereum"
+	width: 900
+	height: 600
+	minimumHeight: 300
+
+	property alias url: webview.url
+	property alias webView: webview
+
+	Item {
+		objectName: "root"
+		id: root
+		anchors.fill: parent
+		state: "inspectorShown"
+
+		WebView {
+			objectName: "webView"
+			id: webview
+			anchors.fill: parent
+			/*
+			 anchors {
+				 left: parent.left
+				 right: parent.right
+				 bottom: sizeGrip.top
+				 top: parent.top
+			 }
+			 */
+
+			onTitleChanged: { window.title = title }
+			experimental.preferences.javascriptEnabled: true
+			experimental.preferences.navigatorQtObjectEnabled: true
+			experimental.preferences.developerExtrasEnabled: true
+			experimental.userScripts: [ui.assetPath("ethereum.js")]
+			experimental.onMessageReceived: {
+				//console.log("[onMessageReceived]: ", message.data)
+				// TODO move to messaging.js
+				var data = JSON.parse(message.data)
+
+				try {
+					switch(data.call) {
+					case "getBlockByNumber":
+						var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06")	
+						postData(data._seed, block)
+						break
+					case "getBlockByHash":
+						var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06")	
+						postData(data._seed, block)
+						break
+					case "transact":
+						require(5)
+
+						// TODO this will change to 6 soon with sec being teh  first argument
+						var tx = eth.transact(data.args[0], data.args[1],data.args[2],data.args[3],data.args[4])
+						postData(data._seed, tx)
+						break
+					case "create":
+						postData(data._seed, null)
+
+						break
+					case "getStorage":
+						require(2);
+
+						var stateObject = eth.getStateObject(data.args[0])
+						var storage = stateObject.getStorage(data.args[1])
+						postData(data._seed, storage)
+
+						break
+					case "getBalance":
+						require(1);
+
+						postData(data._seed, eth.getStateObject(data.args[0]).Value());					
+
+						break
+					case "getKey":
+						var keys = eth.getKey()
+						postData(data._seed, keys)
+						break
+					case "watch":
+						require(1)
+						eth.watch(data.args[0], data.args[1]);
+						break
+					case "disconnect":
+						require(1)
+						postData(data._seed, null)
+						break;
+					}
+				} catch(e) {
+					console.log(data.call + ": " + e)
+
+					postData(data._seed, null);
+				}
+			}
+
+			function require(args, num) {
+				if(args.length < num) {
+					throw("required argument count of "+num+" got "+args.length);
+				}
+			}
+			function postData(seed, data) {
+				webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed}))
+			}
+			function postEvent(event, data) {
+				webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
+			}
+
+			function onNewBlockCb(block) {
+				postEvent("block:new", block)
+			}
+			function onObjectChangeCb(stateObject) {
+				postEvent("object:change", stateObject)
+			}
+		}
+
+		Rectangle {
+			id: sizeGrip
+			color: "gray"
+			visible: false
+			height: 10
+			anchors {
+				left: root.left
+				right: root.right
+			}
+			y: Math.round(root.height * 2 / 3)
+
+			MouseArea {
+				anchors.fill: parent
+				drag.target: sizeGrip
+				drag.minimumY: 0
+				drag.maximumY: root.height
+				drag.axis: Drag.YAxis
+			}
+		}
+
+		WebView {
+			id: inspector
+			visible: false
+			url: webview.experimental.remoteInspectorUrl
+			anchors {
+				left: root.left
+				right: root.right
+				top: sizeGrip.bottom
+				bottom: root.bottom
+			}
+		}
+
+		states: [
+			State {
+				name: "inspectorShown"
+				PropertyChanges {
+					target: inspector
+					url: webview.experimental.remoteInspectorUrl
+				}
+			}
+		]
+	}
 }
diff --git a/ethereal/assets/samplecoin.html b/ethereal/assets/samplecoin.html
index 1b89be877..73368a0b8 100644
--- a/ethereal/assets/samplecoin.html
+++ b/ethereal/assets/samplecoin.html
@@ -22,14 +22,12 @@ function tests() {
 }
 
 function init() {
-	eth.watch(jefcoinAddr);
-
 	eth.getKey(function(key) {
 		eth.getStorage(jefcoinAddr, key, function(storage) {
 			document.querySelector("#currentAmount").innerHTML = "Amount: " + storage;
 		});
 
-		eth.on("object:change", function(stateObject) {
+		eth.watch(jefcoinAddr, function(stateObject) {
 			debug(stateObject);
 			eth.getStorage(jefcoinAddr, key, function(storage) {
 				document.querySelector("#currentAmount").innerHTML = "Amount: " + storage;
-- 
cgit v1.2.3