API changes

This commit is contained in:
obscuren 2014-04-30 01:44:12 +02:00
parent 64c2550b31
commit e85d5dd428
3 changed files with 198 additions and 142 deletions

@ -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 // Main Ethereum library
window.eth = { window.eth = {
prototype: Object(), prototype: Object(),
@ -35,8 +21,12 @@ window.eth = {
// //
// Creates a transaction with the current account // Creates a transaction with the current account
// If no recipient is set, the Ethereum API will see it as a contract creation // If no recipient is set, the Ethereum API will see it as a contract creation
createTx: function(recipient, value, gas, gasPrice, data, cb) { transact: function(sec, recipient, value, gas, gasPrice, data, cb) {
postData({call: "createTx", args: [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) { getStorage: function(address, storageAddress, cb) {
@ -47,10 +37,39 @@ window.eth = {
postData({call: "getKey"}, cb); postData({call: "getKey"}, cb);
}, },
watch: function(address) { getBalance: function(address, cb) {
postData({call: "watch", args: [address]}); 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) { on: function(event, cb) {
if(eth._onCallbacks[event] === undefined) { if(eth._onCallbacks[event] === undefined) {
@ -61,6 +80,7 @@ window.eth = {
return this return this
}, },
off: function(event, cb) { off: function(event, cb) {
if(eth._onCallbacks[event] !== undefined) { if(eth._onCallbacks[event] !== undefined) {
var callbacks = eth._onCallbacks[event]; var callbacks = eth._onCallbacks[event];
@ -100,6 +120,20 @@ function debug(/**/) {
document.getElementById("debug").innerHTML += "<br>" + msg 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) { navigator.qt.onmessage = function(ev) {
var data = JSON.parse(ev.data) var data = JSON.parse(ev.data)

@ -7,135 +7,159 @@ import QtQuick.Window 2.1;
import Ethereum 1.0 import Ethereum 1.0
ApplicationWindow { ApplicationWindow {
id: window id: window
title: "Ethereum" title: "Ethereum"
width: 900 width: 900
height: 600 height: 600
minimumHeight: 300 minimumHeight: 300
property alias url: webview.url property alias url: webview.url
property alias webView: webview property alias webView: webview
Item { Item {
objectName: "root" objectName: "root"
id: root id: root
anchors.fill: parent anchors.fill: parent
state: "inspectorShown" state: "inspectorShown"
WebView { WebView {
objectName: "webView" objectName: "webView"
id: webview id: webview
anchors.fill: parent anchors.fill: parent
/* /*
anchors { anchors {
left: parent.left left: parent.left
right: parent.right right: parent.right
bottom: sizeGrip.top bottom: sizeGrip.top
top: parent.top top: parent.top
} }
*/ */
onTitleChanged: { window.title = title } onTitleChanged: { window.title = title }
experimental.preferences.javascriptEnabled: true experimental.preferences.javascriptEnabled: true
experimental.preferences.navigatorQtObjectEnabled: true experimental.preferences.navigatorQtObjectEnabled: true
experimental.preferences.developerExtrasEnabled: true experimental.preferences.developerExtrasEnabled: true
experimental.userScripts: [ui.assetPath("ethereum.js")] experimental.userScripts: [ui.assetPath("ethereum.js")]
experimental.onMessageReceived: { experimental.onMessageReceived: {
//console.log("[onMessageReceived]: ", message.data) //console.log("[onMessageReceived]: ", message.data)
var data = JSON.parse(message.data) // TODO move to messaging.js
var data = JSON.parse(message.data)
switch(data.call) { try {
case "getBlockByNumber": switch(data.call) {
var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06") case "getBlockByNumber":
postData(data._seed, block) var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06")
break postData(data._seed, block)
case "getBlockByHash": break
var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06") case "getBlockByHash":
postData(data._seed, block) var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06")
break postData(data._seed, block)
case "createTx": break
if(data.args.length < 5) { case "transact":
postData(data._seed, null) require(5)
} 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) { // TODO this will change to 6 soon with sec being teh first argument
postEvent("block:new", block) var tx = eth.transact(data.args[0], data.args[1],data.args[2],data.args[3],data.args[4])
} postData(data._seed, tx)
function onObjectChangeCb(stateObject) { break
postEvent("object:change", stateObject) case "create":
} postData(data._seed, null)
}
Rectangle { break
id: sizeGrip case "getStorage":
color: "gray" require(2);
visible: false
height: 10
anchors {
left: root.left
right: root.right
}
y: Math.round(root.height * 2 / 3)
MouseArea { var stateObject = eth.getStateObject(data.args[0])
anchors.fill: parent var storage = stateObject.getStorage(data.args[1])
drag.target: sizeGrip postData(data._seed, storage)
drag.minimumY: 0
drag.maximumY: root.height
drag.axis: Drag.YAxis
}
}
WebView { break
id: inspector case "getBalance":
visible: false require(1);
url: webview.experimental.remoteInspectorUrl
anchors {
left: root.left
right: root.right
top: sizeGrip.bottom
bottom: root.bottom
}
}
states: [ postData(data._seed, eth.getStateObject(data.args[0]).Value());
State {
name: "inspectorShown" break
PropertyChanges { case "getKey":
target: inspector var keys = eth.getKey()
url: webview.experimental.remoteInspectorUrl 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
}
}
]
}
} }

@ -22,14 +22,12 @@ function tests() {
} }
function init() { function init() {
eth.watch(jefcoinAddr);
eth.getKey(function(key) { eth.getKey(function(key) {
eth.getStorage(jefcoinAddr, key, function(storage) { eth.getStorage(jefcoinAddr, key, function(storage) {
document.querySelector("#currentAmount").innerHTML = "Amount: " + storage; document.querySelector("#currentAmount").innerHTML = "Amount: " + storage;
}); });
eth.on("object:change", function(stateObject) { eth.watch(jefcoinAddr, function(stateObject) {
debug(stateObject); debug(stateObject);
eth.getStorage(jefcoinAddr, key, function(storage) { eth.getStorage(jefcoinAddr, key, function(storage) {
document.querySelector("#currentAmount").innerHTML = "Amount: " + storage; document.querySelector("#currentAmount").innerHTML = "Amount: " + storage;