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 += "
" + 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 + id: window + title: "Ethereum" + width: 900 + height: 600 + minimumHeight: 300 - property alias url: webview.url - property alias webView: webview + property alias url: webview.url + property alias webView: webview - Item { - objectName: "root" - id: root - anchors.fill: parent - state: "inspectorShown" + 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 - } - */ + 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) + 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) - 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})) - } + 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) - function onNewBlockCb(block) { - postEvent("block:new", block) - } - function onObjectChangeCb(stateObject) { - postEvent("object:change", stateObject) - } - } + // 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) - Rectangle { - id: sizeGrip - color: "gray" - visible: false - height: 10 - anchors { - left: root.left - right: root.right - } - y: Math.round(root.height * 2 / 3) + break + case "getStorage": + require(2); - MouseArea { - anchors.fill: parent - drag.target: sizeGrip - drag.minimumY: 0 - drag.maximumY: root.height - drag.axis: Drag.YAxis - } - } + var stateObject = eth.getStateObject(data.args[0]) + var storage = stateObject.getStorage(data.args[1]) + postData(data._seed, storage) - WebView { - id: inspector - visible: false - url: webview.experimental.remoteInspectorUrl - anchors { - left: root.left - right: root.right - top: sizeGrip.bottom - bottom: root.bottom - } - } + break + case "getBalance": + require(1); - states: [ - State { - name: "inspectorShown" - PropertyChanges { - target: inspector - url: webview.experimental.remoteInspectorUrl - } - } - ] - } + 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;